tcp:面向连接的 可靠的 基于字节流的传输层通信协议 (发送数据要先建立连接)
有两个IP地址和两个端口号
三个阶段:连接、数据传输、退出\关闭
三次握手 四次挥手 建立和关闭一个连接。
tcp报文:
序号:seq
确认序号:ack
标志位:
- ACK:确认序号有效;
- FIN:释放一个连接;
- PSH:接收方应该尽快将这个报文交给应用层;
- RST:重置连接
- SYN:发起一个新连接
- URG:紧急指针有效
三次握手
为了确认通信双方是否有收发数据的能力
服务器 seq = 20 客户端 seq =10
第一次握手:客户端发送SYN = 1,seq = 10(随机生成)
第二次握手:
- 服务器收到消息 SYN = 1 (发起一个新连接) ,保存序号seq;
- 服务器发送消息 SYN =1 ACK=1 seq = 20(随机生成)ack = 11 (10+1,即客户端seq+1)
第三次握手: - 客户端收到 ACK = 1 和 ack = 11,知道服务器已经收到自己之前发的消息
- SYN = 1 服务端同意这次连接 保存序号seq
- 客户端发送 ACK = 1 ack =21(20 +1,即服务端seq+1) seq = 11 (10+1,即客户端seq+1)
第一次握手:服务器 知道客户端的发件能力、服务器自己有接收能力①
第二次握手:客户端 知道 ① ,服务器的发件能力,客户端自己有接收能力②
第三次握手:服务器 知道 ②
四次挥手
第一次挥手:客户端发送FIN = 1(释放一个连接),seq = 1011(10+1+1000) ,客户端不能发送数据 可以接收数据 FIN报文段不携带数据也占据一个序列号
第二次挥手:服务器接收信息后回复确认报文 ACK =1 确认需要ack = 1012(seq +1)seq = 2020 ,服务器状态:关闭等待状态 ;不是立刻FIN报文,服务器可能还有数据没有发送完。
第三次挥手:服务器将最后数据发送完毕后,向客户端发送报文 FIN=1 ACK =1 ack = 1012 seq = 2070(2020+50)
第四次挥手:客户端收到服务器报文后向服务器发送确认报文 ACK = 1 ack = seq +1 = 2071 seq =1012
服务器接收后立马释放TCP连接 客户端要等2msl(最长报文段寿命2倍时长)后才释放TCP连接
多出来的一次:服务器可能还有数据在发送 只能先告诉客户端他收到FIN报文
2msl:防止丢包确认服务器接收到信息(服务器没接收到ack报文会重发第三次的报文)时间2倍 客服端服务器发送一来一回最长时间2msl
(面试遇到)刚好看到顺便记录一下哈哈
GET POST
get从服务器上获取数据 不能进行修改
post向服务器提交数据 涉及数据的更新
get 是不安全 数据放在URL中(不一定可以放在request body)
post的所有操作对于用户来说是不可见(不一定)
get url中数据最多是2048字节(浏览器和服务器限制的防止恶意请求) post 没有限制
get执行效率高 form提交的默认方法 get产生一个数据包 post产生两个TCP数据包
对称加密
加密和解密用的是同一个秘钥 秘钥发送问题 安全问题
非对称加密
使用一对非对称秘钥 公钥和私钥 公钥可以随意发布 私钥只有自己知道 公钥加密 收到信息自己的私钥解密 效率速度慢
cookie和session
cookie 存放在客户端 session 储存在服务器上,相对比较安全
单个cookie 不能超过4k session没有限制
session依赖cookie实现 浏览器向服务器请求中传输cookie包含sessionid.
1.ping 是通过什么协议实现的?
Ping命令用ICMP实现的,ICMP是Internet控制消息协议。用于IP主机,路由器之间传递消息。
原理:向指定IP发送一定长度的数据包,按照约定,若指定IP存在的话,会返回同样大小的数据包,若没有在特定时间返回就是超时,就认为指定IP不存在(防火墙 不一定)
2.DNS 的主要过程(很绕)
- 浏览器检查缓存域名对应IP地址解析。
- 浏览器查找操作系统缓存域名对应的DNS解析结果。
- 真正请求域名服务器来解析这个域名了。操作系统会发送域名到LDNS(本地区的域名服务器),大约80%的域名解析到这里就已经结束,所以LDNS承担着主要的域名解析任务。
LDNS(本地区的域名服务器) ========= 最主要
LDNS 根据域名从 Root Server 域名服务器拿到 gTLD Server 国际顶级域名服务器地址
LDNS 向 gTLD Server 发起请求拿到 Name Server 域名服务器的地址
LDNS 查询请求域名对应的地址 Name Server 返回该域名对应的IP和TTL值
LDNS 把结果返回 用户根据TTL值缓存在本地系统缓存中
3.如果服务器的 ip 地址发生了变化,如何通知给 DNS 服务器?
DDNS 的实现 一类是轮询机制 第二类方法是异步实现方式,即:每当主机的 IP 地址发生变化的时候,应用程序能够被及时地通知到
4.TCP 中的 CLOSE-WAIT 状态是什么,为什么要有 CLOSE-WAIT 状态?
close_wait出现的原因: 就是某一方在网络连接断开后,对等方没有检测到这个错误(对方断开)而没有调 用 closesocket,导致了这个状态的出现