TCP连接的终止需要进行四次挥手才能完成,它的过程如下图
(这里假设终止有客户端发起,但是无论是客户端还是服务器都可以发起因为TCP是全双工(全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)),
即下图中客户端和服务器的位置对调也是可以的):
第一次挥手
客户端发送FIN给服务器,客户端状态由 ESTABLISHED 变为 FIN_WAIT_1。
第二次挥手
服务器收到FIN且发送ACK给客户端,服务器状态由 ESTABLISHED 变为 CLOSE_WAIT。
服务器将缓存中没发送的数据完继续发送给客户端
客户端收到ACK后状态由FIN_WAIT_1变为FIN_WAIT_2.
第三次挥手
服务器发送FIN给客户端,这时服务器的状态由CLOSE_WAIT变为 LAST_ACK。
第四次握手
客户端收到FIN后返回ACK给服务器,然后客户端的状态由FIN_WAIT_2变为TIME_WAIT,TIME_WAIT = 2MSL (maximum segement lifetime 分节在网络中最长生存时间,30秒到2分钟,根据系统实现不同而不同) 2MSL 范围是 1分钟到4分钟。
服务器收到ACK后,状态由LAST_ACK变为CLOSED。
而客户端再经过TIME_WAIT时间后变为CLOSED状态。
为什么会有TIME_WAIT状态
1.可靠地实现TCP全双工连接的终止。
假设最后一次ACK在网络中丢失了,然而主动关闭的那一端(上图是客户端)却没有维护状态信息(即没有TIME_WAIT就直接CLOSED),被动关闭端就会再次发来FIN,但是客户端没有维护状态信息,那么就返回一个RST给