之前别人问过的一个问题,说是四次挥手为何要等待2MSL时间?
首先我们需要明白,MSL是表示什么意思?
其实是maxinum segment lifttime(报文最大存活时间),tcp发出的包是有一个存活时间的。
我们先来复习下tcp 的四次挥手,用C(client)和S(server)来代替
1.C发出报文,说请求关闭,标识位为FIN,然后客户端进入一个等待状态,表示客户端没有数据发送给服务端了。
2.S收到C的报文之后,会回复C一个报文,标志位为ACK,意思是我收到了,服务端进入等待关闭的状态。
3.S再次发送报文给C,标志位为FIN,意思是告诉C我要准备关闭数据链接了。
4.C收到之后,会发出ACK报文,告诉S,说我这确认收到了,并且等待2MSL之后就会关闭数据链接,销毁资源。
我们想一想,为什么要等待2MSL?
一个MSL表示报文存活的最大时间,不管是C发送到S的报文,还是S发送到C的报文,都是最大可存活1MSL,那么等待2MSL,也就是报文一来一回。
思考一个问题,C最后发给S的报文,有没有可能丢失?如果丢失了怎么办?
肯定会有丢失的情况,如果C最后的ACK丢了,S会超时重传,
C发送的ACK丢了(1MSL) + S重新发一个FIN过来(1MSL)
一来一回,也就是2MSL
参考
https://www.zhihu.com/question/67013338