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协议认为这些滞留数据是属于新连接的,与真正的数据发生混淆。