TCP四次挥手的过程涉及到不同的状态,以下是每个状态的详细描述:
-
ESTABLISHED(建立连接):
在建立连接后的正常数据传输阶段,双方处于ESTABLISHED状态。双方可以相互发送和接收数据。 -
第一次挥手(FIN-WAIT-1):
当一方决定关闭连接时,它会发送一个带有FIN标志的报文段给对方,并进入FIN-WAIT-1状态。在这个状态下,发送方可以继续接收对方发送的数据。 -
第二次挥手(CLOSE-WAIT):
接收到关闭请求的一方收到FIN后,会发送一个带有ACK标志的报文段作为响应,并进入CLOSE-WAIT状态。在这个状态下,接收方停止发送数据,但仍然可以接收对方发送的数据。 -
第三次挥手(FIN-WAIT-2):
接收方在发送完所有待发送的数据后,会发送一个带有FIN标志的报文段给发送方,并进入FIN-WAIT-2状态。在这个状态下,接收方等待发送方发送最后的确认。 -
第四次挥手(TIME-WAIT):
发送方接收到第三次挥手的FIN后,会发送一个带有ACK标志的报文段作为确认,并进入TIME-WAIT状态。在这个状态下,发送方等待一段时间(两倍的最大报文段生存时间,即2MSL)以确保对方接收了确认。 -
CLOSED(关闭连接):
在经过一段时间后,发送方从TIME-WAIT状态进入CLOSED状态,表示连接已经关闭。接收方在收到确认后也进入CLOSED状态。此时,TCP连接完全关闭,双方释放相关资源。
为什么是四次挥手
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。但是在关闭连接时,当Server端收到Client端发出的连接释放报文时,很可能并不会立即关闭SOCKET,所以Server端先回复一个ACK报文,告诉Client端我收到你的连接释放报文了。只有等到Server端所有的报文都发送完了,这时Server端才能发送连接释放报文,之后两边才会真正的断开连接。故需要四次挥手。
为什么要等待2MSL
等待2MSL(Maximum Segment Lifetime)的主要目的是确保前一个连接的所有报文段在网络中完全消失,避免对后续连接产生影响。
MSL是指TCP报文段在网络中的最长生存时间。当一方发送最后一个ACK报文段后,它进入TIME-WAIT状态并等待2倍的MSL时间。这样做的原因有以下几点:
-
可靠关闭:等待2MSL可以确保对方接收到最后一个ACK报文段。如果对方没有收到该报文段,它会重新发送FIN报文段,而发送方会重新发送ACK报文段进行确认。通过等待2MSL,可以确保双方都能正确地确认连接的关闭,避免连接的持久化。
-
避免旧报文的影响:在网络中,可能会有之前连接遗留的报文段仍然存在,这些报文段可能会在某个时间被错误地传递到新连接中,导致数据混乱。等待2MSL可以确保网络中的所有旧报文都被丢弃,避免对后续连接产生任何干扰。
-
如果不等待2MSL,而是立即关闭并重新打开连接,可能会导致网络中的报文段与新连接的报文段发生冲突,造成数据的错误传输或混乱。