在TCP连接的四次挥手过程中,进入 TIME_WAIT 状态的一方是主动关闭连接的一方,即发送最后一个 ACK(确认)报文的一方。
FIN 报文,表示自己已经没有数据要发送了,但仍然可以接收数据。这时,该方进入 FIN_WAIT_1 状态。FIN 报文后,发送一个 ACK 报文,确认收到了 FIN 报文。此时,该方进入 CLOSE_WAIT 状态,主动关闭连接的一方进入 FIN_WAIT_2 状态。FIN 报文,表示自己也没有数据要发送了。此时,该方进入 LAST_ACK 状态。FIN 报文后,发送一个 ACK 报文,确认收到了 FIN 报文。此时,主动关闭连接的一方进入 TIME_WAIT 状态,并在等待一段时间(通常是2倍的最大报文段生存时间,2*MSL)后,才会进入 CLOSED 状态。被动关闭连接的一方在收到这个 ACK 报文后,立即进入 CLOSED 状态。TIME_WAIT 是必要的TIME_WAIT 状态的存在有几个重要原因:
ACK 报文能够被正确接收:如果最后的 ACK 报文丢失,另一方会重发 FIN 报文。在 TIME_WAIT 状态期间,主动关闭连接的一方能够重新发送 ACK 报文。TIME_WAIT 状态等待2倍的最大报文段生存时间,可以确保网络中任何残留的旧连接数据包都已经消失,从而避免在新连接中出现混淆。因此,进入 TIME_WAIT 状态的是主动关闭连接的一方,以确保连接能够完全、可靠地关闭。