TCP四次挥手

7/12/2021 TCP网络协议

当A和B要断开连接的时候,就要进行四次挥手。挥手的主要目标就是要告诉对方,要断开连接了,请把数据都处理完,双方都确保可以关闭后就断开连接

下面就是四次挥手的有限状态机和断开需要传输的信息。

TCP三次握手

第一次挥手,A向B发送FIN,进入半关闭状态,无法向B发送报文,只能发送回复。

第二次挥手,B向A回复ACK,B开始处理剩下的信息,然后准备关闭。

第三次挥手,B向A发送FIN,然后等待A的回应。

第四次挥手,A向B回复ACK,B进入关闭状态,A等待2MSL后,也进入了关闭状态。

# 为什么需要等待2MSL?

MSL表示的是报文最大生存时间。

等待2MSL的主要目的是确保连接的彻底关闭。这段时间内,任何延迟、丢失或重复的报文都能够完全消失。

所以作用如下:

一是为了确保B能正常收到最后的回复,

二是确保A没有收到B要求的重传(可能因为延迟,或者丢包导致要求重传),从而对下次复用连接造成影响。

如果不等待,A直接断开连接,这时候,如果B有数据需要发给A,并且已经在网络中传输的时候,A又被C连接并占有相同的端口,那么A就会收到很多无用的数据包,造成数据包混乱。所以要等数据包全消失再关闭。

# 为什么不只等待1MSL

1MSL是确保四次挥手A的ACK 能顺利到达B。

另一个1MSL是确保B没收到ACK后发送重传的FIN能给A收到。

# 为什么是四次挥手而不是三次?

三次挥手就是B端的中间ACK和FIN合成一个发送,这时候如果B端处理剩下的信息时间比较长,A会以为自己发送FIN没有到达B端,导致不断重发FIN。