TCP协议的TIME_WAIT状态详解

TCP关闭连接的过程如下图,以Client主动关闭为例


四次挥手


具体过程(四次挥手)如下:

Client调用close函数,给Server发送FIN,请求关闭连接;

Server收到FIN后,给Client回复ACK,同时关闭读通道,此时Server的TCP状态转换为CLOSE_WAIT状态。

Client收到对自己FIN确认后,关闭写通道,不再往连接中写入任何数据。

Server调用close函数关闭连接,给Client发送FIN,Client收到后给Server回复ACK确认,同时Client关闭读通道,进入TIME_WAIT状态。

Server收到Client对自己FIN的ACK后,关闭写通道,TCP连接状态变为CLOSE,也就是连接关闭

Client在TIME_WAIT状态下要等待最大数据段生存期的两倍,然后才进入CLOSE状态,TCP连接才彻底关闭。


主动发起关闭连接的操作一方将达到TIME_WAIT状态,必须保持MAX Segment Lifetime的两倍时间。

原因如下:

1.保证TCP协议的全双工连接,能够可靠关闭

2.保证本次连接的重复数据段从网络中消失


详细说明如下:

1.假如Client直接CLOSED,那么由于IP协议不可靠性或者其他网络原因,导致Server没有收到Client最后回复的ACK,那么Server可以超时重传,此时如果Client已经CLOSED,就找不到对应的连接,那么Server收到的是对端的RST,而不是ACK,Server会以为是连接错误而上报到上层。虽然不会导致数据丢失,但是却不符合TCP可靠性的要求。

2.如果Client直接CLOSED后,又立即向Server发起一个新连接,假如是在相同的端口,那么之前连接中滞留的网络数据,有可能在新连接建立后,才到达Server,由于新连接和旧连接的端口相同,TCP协议认为这些滞留数据是属于新连接的,与真正的数据发生混淆。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容