MSL,即Maximum Segment Lifetime,一个数据分片(报文)在网络中能够生存的最长时间,在RFC 793中定义MSL通常为2分钟,即超过两分钟即认为这个报文已经在网络中被丢弃了。对于一个TCP连接,在双方进入TIME_WAIT后,通常会等待2倍MSL时间后,再关闭掉连接,作用是为了防止由于FIN报文丢包,对端重发导致与后续的TCP连接请求产生顺序混乱,具体原理这里就不详细解释了,可以参考:http://blog.csdn.net/qwertyupoiuytr/article/details/68938963
MSL的时长其实是一个估计值,由于这个值会影响很多基于TCP的应用的连接复用和调优,所以在实际生产中,需要针对具体的应用来调整MSL的具体值(需要注意的是,由于MSL值是对于系统层面来说,所以调整后,会对系统中部署的全部应用产生影响)。下面说明了针对Linux系统和Windows系统调整MSL的方法。
Linux,以CentOS为例:
查看默认的MSL值(60s):
[[email protected]]# cat /proc/sys/net/ipv4/tcp_fin_timeout
60
修改默认60为120:
[[email protected]]# echo 120 > /proc/sys/net/ipv4/tcp_fin_timeout
修改完成后,重新加载配置文件:
[[email protected]]# sysctl -p /etc/sysctl.conf
查看是否已经生效:
[[email protected]]# sysctl -a | grep fin
net.ipv4.tcp_fin_timeout= 120
Windows上修改"2MSL"的值:
打开注册表编辑器(regedit):
找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,在右侧找到TcpTimedWaitDelay这一个键值(Win2000之后的系统中可能会没有这个值,如果没有,创建一个即可):
指定对应的值即可:
注意在Windows系统中,这个注册表键值就直接等于TIME_WAIT到CLOSED状态的等待市场,也就是2MSL的值,而不像Linux中,我们修改的是MSL的值。