TCP连接的TIME-WAIT状态

TIME-WAIT状态是TCP的11个状态其中之一,是发生在正常关闭TCP连接的时候发生的。如下图所示:


在这幅图中我们可以明显看出,流程是这样的,显示主动发送一个FIN报文,然后接收到一个ACK报文,这样这一方的连接已经关闭,也就是不能再发送数据了,进入FIN_WAIT2状态,这个状态就是为了等待,被动关闭连接的一方,发送fin报文,在这期间可以接收来自对方的数据,等到被动关闭这一端,发送完毕后,就会发出一个FIN报文,那么在接收到FIN报文后,进入TIME_WAIT状态,首先向被动连接那一方,发送一个ACK,然后进入等待状态,等待时长为2MSL(MSL为一个TCP报文在网络中能够存活的最大时长),很多人问,为什么会进入一个等待,状态呢。因为如上图所示,被动关闭连接的哪一方,在发送出FIN报文后,要确定主动方,接收到它发送的FIN报文,怎么知道是否接收到呢,那么就是对方返回一个ACK报文。设想如果主动方发送的最后一个报文不能到达被动关闭连接方呢?这时候如果主动方不等待,直接选择关闭连接,然后被动方又不知道,超时会重传FIN报文,但是主动方已经关闭了,所以不会反回任何应答,这样就会让被动方关闭连接上出问题,所以得等待一段时间,看被动方是否接收到了最后一个ACK,如果没接收到的话,FIN报文会超时重传,那么在等待阶段接收到FIN报文后,可以重发,最后一个ACK。这样在关闭连接上就没有什么问题了。另外其实,如果不等待一段时间还会发生另外一个问题,设想在TCP交互过程中,一个报文因为各种原因,没有到达目的地,如果不等待一段时间,那么意味着在关闭连接后立刻在这个端口上就可以建立新的连接,那么在新连接交互的过程中,如果上一个连接的那个没有到达的报文,现在到达了,那么是不是就会出现新的问题,所以说要等待2MSL时间,可以让老的报文彻底消失,才能开始一个新的连接。


经过以上的讨论其实要在TIME_WAIT阶段等待一段时间的主要原因有两个:

1.能够确保被动关闭连接方能够,接收到最后一个ACK,也就是能够确定,主动方已经接收到被动方的FIN报文。

2.能够确保本次连接的所有未到达的报文段,能够彻底在网络中消失,不会影响下一次在相同端口上建立的新连接。


所以一般在某一个端口上关闭TCP连接后不能立即启用本端口建立新的连接,因为在TIME_WAIT阶段是不允许建立新的连接的。

猜你喜欢

转载自blog.csdn.net/sxiaobei/article/details/46967097
今日推荐