小林coding<<图解网络>>专章详细解读:膜拜
1.最主要原因:只有三次握手才能阻止重复历史链接的初始化
情景:
由于网络环境的复杂化(路由选路,拥塞程度)可能会导致数据包的发送顺序和到达顺序不一致
状况: 旧的客户端--->服务器端的SYN包 比 新的客户端--->服务器端的SYN包
先到达
此图 注意 并没有超时重传,暨,可能一次发送多个包,所以seq不想等,所以可以推断出是历史重复链接
解读:
- 首先明确,客户端发送SYN包时,会自动记录seq
- 所以,发送多个SYN包后,客户端本地记录的是 最新的seq
- 第一次握手完成之后,服务器端发送SYN+ACK包 携带 seq+ack
- 客户端在完成第二次握手之后,会解包,拿出序列号进行对比
- 若果能够对应,则 客户端------->服务器连接建立(单向)
- 否则,则该单向连接就无法建立;
- 至此,第二次握手完成
- 第三次握手的主要目的就是告诉服务器端: 服务器端—>客户端单向连接是否建立
一: 如果是历史链接:则发送RST包 (通知服务器断开此链接)
二: 如果序列号匹配,则通过第三次握手,建立服务器-->客户端单向链接(两个单向链接都建立了,则是互通的)
2.只有三次握手才可以同步双方的初始序列号
由图可知:四次握手冗余,完全可以缩减成三次握手
序列号的作用:尚未施工
只有交换了双方的序列号,这样才知道,对方的数据从哪来,到哪去,这样才好排列
3.三次握手才可以避免资源浪费
此图 注意超时重传,所以多次的 seq相等,所以在第二次握手是根据ack可以推断出不是历史重复链接,就不会发送RST包
解释:
- 由于是SYN超时重传包,所以seq是会相等的
- 假如只有两次握手,则在第二次握手后,链接单方面建立(客户---->服务器)
- 所以服务器并不知道自己能不能到达对端—>服务器不知道自己的ack对端收到没有
- 只能是客户单方面发送数据课服务器
- 之后的每一个客户SYN,都会使服务器建立连接.
如果客户端的 SYN 阻塞了,重复发送多次 SYN 报文,那么服务器在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费