TCP四次挥手
Howard 7/12/2021 TCP网络协议
当A和B要断开连接的时候,就要进行四次挥手。挥手的主要目标就是要告诉对方,要断开连接了,请把数据都处理完,双方都确保可以关闭后就断开连接。
下面就是四次挥手的有限状态机和断开需要传输的信息。
第一次挥手,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。