在TCP连接的四次挥手过程中,进入 TIME_WAIT 状态的一方是主动关闭连接的一方,即发送最后一个 ACK(确认)报文的一方。

四次挥手过程

  1. 第一次挥手:主动关闭连接的一方(通常是客户端)发送一个 FIN 报文,表示自己已经没有数据要发送了,但仍然可以接收数据。这时,该方进入 FIN_WAIT_1 状态。
  2. 第二次挥手:被动关闭连接的一方(通常是服务器)接收到 FIN 报文后,发送一个 ACK 报文,确认收到了 FIN 报文。此时,该方进入 CLOSE_WAIT 状态,主动关闭连接的一方进入 FIN_WAIT_2 状态。
  3. 第三次挥手:被动关闭连接的一方(服务器)发送一个 FIN 报文,表示自己也没有数据要发送了。此时,该方进入 LAST_ACK 状态。
  4. 第四次挥手:主动关闭连接的一方(客户端)接收到 FIN 报文后,发送一个 ACK 报文,确认收到了 FIN 报文。此时,主动关闭连接的一方进入 TIME_WAIT 状态,并在等待一段时间(通常是2倍的最大报文段生存时间,2*MSL)后,才会进入 CLOSED 状态。被动关闭连接的一方在收到这个 ACK 报文后,立即进入 CLOSED 状态。

为什么 TIME_WAIT 是必要的

TIME_WAIT 状态的存在有几个重要原因:

  1. 确保最后的 ACK 报文能够被正确接收:如果最后的 ACK 报文丢失,另一方会重发 FIN 报文。在 TIME_WAIT 状态期间,主动关闭连接的一方能够重新发送 ACK 报文。
  2. 确保网络中旧的重复报文能够消失:在 TIME_WAIT 状态等待2倍的最大报文段生存时间,可以确保网络中任何残留的旧连接数据包都已经消失,从而避免在新连接中出现混淆。

因此,进入 TIME_WAIT 状态的是主动关闭连接的一方,以确保连接能够完全、可靠地关闭。