2msl
定义
msl英文Maximum Segment Lifetime,msl指的是一片报文在网络上的生存时间,即这片报文在两个tcp协议栈之间的往返时长。也就是报文一去一回所需时间。
问题
2msl指的是tcp主动关闭场景中time_wait状态。这个状态下主动关闭一方已经发送了最后一个ack报文(last ack)。但是,如果这个last ack报文在网络中丢弃。那么被动关闭一方将会长久停留在last_ack状态。
![a083d1633fcef970ab49ce3658b52e44.png](https://i-blog.csdnimg.cn/blog_migrate/474a41541e706ac1f4ee3a1e3b7776ba.jpeg)
解决办法
主动关闭进入time_wait状态不能立刻进入closed状态,而是设置一个定时器,定时时长为2msl,以免ack网络中丢失。
如果last ack在网络中丢失,被动关闭将长期没有收到last ack,协议栈会重传fin报文。主动关闭收到fin重传报文后,重发一个last ack,并重新设置定时器2msl。
2msl带来的端口问题:
我们知道一个tcp链接有四元组决定,两个ip地址和两个tcp端口。处于2MSL,tcp链接仍然存活,tcp端口始终被占用。如果这时应用进程重启,将会出现端口不能绑定的错误。
比如,http用80端口,服务器触发tcp主动关闭(重启http服务器),这时候80端口处于2msl时长后才会释放。也就是要等2MSL时间后再启动http,2MSL期间tcp的80端口不能用,大概三四分钟比较保险,立刻启动服务,一般会报错,端口不能绑定。
平静时间
2MSL为TIME_WAIT状态,等待最后一个ack能正确到达对方。
比如一台http服务器,使用80端口。这台服务器重启了,会出现什么情况?
假如这台服务器启动了,启动前tcp处于time_wait状态,重启后应用也很快启动,80端口被新的tcp绑定。
这时候,如果启动前的last ack丢失了,那么没有链接重传这个last ack了。
机器重启了,记不到以前的2MSL状态了,规定,机器重启后,在MSL秒内,不能建立任何链接。这段时间称为平静时间
FIN_WAIT_2状态
这个状态是在等对方关闭fin报文,如果这个状态下,一直收不到对方发来fin,比如对方宕机或者网络断了,
这时候主动关闭一方也不能一直等下去。TCP协议栈会启动一个定时器,超过10分钟75秒后即使没有收到fin也进入closed状态。