接下来,从以下三个方面逐一进行分析:
- 三次握手才可以阻止历史连接(主要方面)
- 三次握手才可以同步双方初始序列号
- 三次握手才可以避免资源浪费
一、阻止历史连接
我们考虑一种场景,客户端发送 SYN(seq = 80)报文后宕机了,而且该报文还被网络阻塞了,服务端并没有收到,接着客户端重启后,又重新向服务端建立连接,发送了 SYN(seq = 100)报文(注意!不是重传 SYN,因为重传的 SYN 序列号是相同的)
[抛个问题,如果新的 SYN 先于 RST 到达,服务端又该如何处理?]
如果是两次握手,就无法阻止历史连接,因为服务端没有中间状态用来给客户端阻止历史连接,导致服务端初始化一个历史连接,造成资源浪费
二、同步双方初始序列号
使用 TCP 协议通信的双方,都必须维护一个「序列号」,序列号是可靠传输的一个关键因素
四次握手也能同步双方初始序列号,但由于第二步和第三步可以优化成一步,所以就成了「三次握手」
两次握手只保证了一方的初始序列号能被对方成功接收,没办法保证双方的初始序列号都能被确认接收