为什么 TCP 连接需要三次握手,不是两次,四次?

  • 基本原因:三次握手才能保证通信双方具备接收和发送的能力

下面分别展开深入分析。

使用三次握手的原因

  • 阻止重复历史连接的初始化,避免资源浪费
  • 同步双方的初始序列号,保证双方都具备接发的能力

避免历史连接

客户端希望与服务器建立连接,但是由于网络堵塞,发送了多个 SYN 报文:

  • 旧的 SYN 报文(seq=90)先到达服务器,服务器返回 SYN+ACK 报文(ACK=91)
  • 客户端期望收到的 ACK=101,不是 91,发送 RST 报文
  • 服务器收到 RST 报文后,释放连接
  • 等到最新的 SYN 报文(seq=100)到达服务器,正常进行三次握手

旧 SYN 报文成为历史连接

使用两次握手?

使用两次握手无法避免历史连接

假定使用两次握手,当服务器接收到一个 SYN 报文就建立连接,接下来可以发送数据。但是它不知道这是历史连接。当客户端感知到这是历史连接时,就会发送 RST 报文断开连接。这样会浪费服务器的资源

使用四次握手?

使用四次握手也能成功建立连接,但是第二步和第三步可以合并为一步,就变成了三次握手。