为什么 TCP 连接需要三次握手,不是两次,四次?
- 基本原因:三次握手才能保证通信双方具备接收和发送的能力
下面分别展开深入分析。
使用三次握手的原因
- 阻止重复历史连接的初始化,避免资源浪费
- 同步双方的初始序列号,保证双方都具备接发的能力
避免历史连接
客户端希望与服务器建立连接,但是由于网络堵塞,发送了多个 SYN 报文:
- 旧的 SYN 报文(seq=90)先到达服务器,服务器返回 SYN+ACK 报文(ACK=91)
- 客户端期望收到的 ACK=101,不是 91,发送 RST 报文
- 服务器收到 RST 报文后,释放连接
- 等到最新的 SYN 报文(seq=100)到达服务器,正常进行三次握手
旧 SYN 报文成为历史连接。
使用两次握手?
使用两次握手无法避免历史连接
假定使用两次握手,当服务器接收到一个 SYN 报文就建立连接,接下来可以发送数据。但是它不知道这是历史连接。当客户端感知到这是历史连接时,就会发送 RST 报文断开连接。这样会浪费服务器的资源。
使用四次握手?
使用四次握手也能成功建立连接,但是第二步和第三步可以合并为一步,就变成了三次握手。