在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
状态的是主动关闭连接的一方,以确保连接能够完全、可靠地关闭。