MSL,即Maximum Segment Lifetime,一个数据分片(报文)在网络中能够生存的最长时间,在RFC 793中定义MSL通常为2分钟,即超过两分钟即认为这个报文已经在网络中被丢弃了。对于一个TCP连接,在双方进入TIME_WAIT后,通常会等待2倍MSL时间后,再关闭掉连接,作用是为了防止由于FIN报文丢包,对端重发导致与后续的TCP连接请求产生顺序混乱,具体原理这里就不详细解释了,可以参考:http://blog..net/qwertyupoiuytr/article/details/68938963

MSL的时长其实是一个估计值,由于这个值会影响很多基于TCP的应用的连接复用和调优,所以在实际生产中,需要针对具体的应用来调整MSL的具体值(需要注意的是,由于MSL值是对于系统层面来说,所以调整后,会对系统中部署的全部应用产生影响)。下面说明了针对Linux系统和Windows系统调整MSL的方法。

Linux,以CentOS为例:

查看默认的MSL值(60s):

[root@DanCentOS65var]# cat /proc/sys/net/ipv4/tcp_fin_timeout

60

修改默认60为120:

[root@DanCentOS65var]# echo 120 > /proc/sys/net/ipv4/tcp_fin_timeout

修改完成后,重新加载配置文件:

[root@DanCentOS65var]# sysctl -p /etc/sysctl.conf

查看是否已经生效:

[root@DanCentOS65var]# sysctl -a | grep fin

net.ipv4.tcp_fin_timeout= 120

Windows上修改"2MSL"的值:

打开注册表编辑器(regedit):

ca506ffee29c9b04fa947f5b87c2d727.png

找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,在右侧找到TcpTimedWaitDelay这一个键值(Win2000之后的系统中可能会没有这个值,如果没有,创建一个即可):

8ce567160f937f0e47cf2296b4fa7fed.png

指定对应的值即可:

b04995cdd2b385e4fe0eed76c5123907.png

注意在Windows系统中,这个注册表键值就直接等于TIME_WAIT到CLOSED状态的等待市场,也就是2MSL的值,而不像Linux中,我们修改的是MSL的值。

Logo

更多推荐