TCP的四次挥手

TCP连接的终止需要进行四次挥手才能完成,它的过程如下图
(这里假设终止有客户端发起,但是无论是客户端还是服务器都可以发起,
即下图中客户端和服务器的位置对调也是可以的):
TCP的四次挥手_第1张图片
第一次挥手
客户端发送FIN给服务器,客户端状态由 ESTABLISHED 变为 FIN_WAIT_1。

第二次挥手
服务器收到ACK且发送FIN给客户端,服务器状态由 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给服务器,服务器就会解析错误。TIME_WAIT状态是为了,在最后一次ACK丢失的情况下可以,服务器再次发来FIN时候,客户端能够从新发一个丢失的ACK给服务器。

2.允许老的重复分节在网络中消逝。
我们假设在12.106.32.254的1500端口和206.168.112.219的21端口之间有一个TCP连接。我们关闭这个连接,
过来一段时间之后,在相同的IP的相同端口又有新的TCP连接建立。那么这个新的TCP连接,就会被认为是旧的TCP连接的化身(incarnation), 为了防止这种情况发生,TIME_WAIT状态持续时间是2MSL,足以让某个方向上的分组最多存活MSL秒被丢弃,通过这个规则我们就能保证在新的TCP连接建立时,老的重复分组都已经在网络中消逝。
参考:
https://blog.csdn.net/xingerr/article/details/72845941
UNIX网络编程(第三版)

你可能感兴趣的:(TCP/IP协议)