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):
找到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters,在右侧找到TcpTimedWaitDelay这一个键值Win2000之后的系统中可能会没有这个值,如果没有,创建一个即可):
指定对应的值即可:
注意在Windows系统中,这个注册表键值就直接等于TIME_WAIT到CLOSED状态的等待市场,也就是2MSL的值,而不像Linux中,我们修改的是MSL的值。
相关资源:潮湿敏感等级MSL_潮敏等级对应烘烤时间-硬件开发文档类资源-CSDN…
打开CSDN,阅读体验更佳
网络术语MSL/TTL/RTT
MSL(Maximum Segment Lifetime)最大报文生存时间 每个TCP实现必须选择一个MSL。它是任何报文段被丢弃前在网络内的最长时间。这个时间是有限的,因为TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL时间。RFC 793指出MSL为2分钟,现实中常用30秒或1分钟。 2MSL 当TCP执行主动关闭,并发出最浏览器打开
为什么TIME_WAIT的时间是2MSL
MSL指的是任何IP数据报能够在因特网上存活的最长时间。 TIME_WAIT的状态是为了等待连接上所有的分组的消失。单纯的想法,发送端只需要等待一个MSL就足够了。这是不够的,假设现在一个MSL的时候,接收端需要发送一个应答,这时候,我们也必须等待这个应答的消失,这个应答的消失也是需要一个MSL,所以我们需要等待2MSL。(更多的内容参考 《UNIX 网络编程》第3版 2.7 节)浏览器打开
msl3等级烘烤时间_msl湿敏等级对应表_程绵羊的博客
元件的湿度敏感等级MSL):IPC将其分为1、2、2a、3、4、5、5a、6共8个等级,其湿度敏感级别 逐级递增. 防潮包装袋MBB):一种为了阻止水蒸气进入而设计用来… PCB MSL 湿敏等级只做开封后生产过程中的停留时间的参考,不做烘烤…
2MSL到底有多长_m673010624的博客_2msl是多久
2MSL到底有多长 以前一直不知道2MSL到底有多长,直到看到这个比喻 https://juejin.im/post/5b29d2c4e51d4558b80b1d8c 钱老给的具体答案是4分钟
MSLMaximum Segment Lifetime)报文最大生存时间
MSLMaximum Segment Lifetime)报文最大生存时间 Windows:MSL=2 minlinuxUbuntu,CentOs):MSL=60s Unix:MSL=30s浏览器打开
linux下定时任务
<br />为当前用户创建cron服务<br />1. 键入 crontab -e 编辑crontab服务文件<br /> 例如 文件内容如下:<br /> */2 * * * * /bin/sh /home/admin/jiaoben/buy/deleteFile.sh <br /> 保存文件并并退出<br /> */2 * * * * /bin/sh /home/admin/jiaoben/buy/deleteFile.sh<br /> */2 * * * *浏览器打开
Linux和Windows系统修改MSL的值
MSL,即Maximum Segment Lifetime,一个数据分片(报文)在网络中能够生存的最长时间,在RFC 793中定义MSL通常为2分钟,即超过两分钟即认为这个报文已经在网络中被丢弃了。对于一个TCP连接,在双方进入TIME_WAIT后,通常会等待2倍MSL时间后,再关闭掉连接,作用是为了防止由于FIN报文丢包,对端重发导致与后续的TCP连接请求产生顺序混乱,具体原理这里就不详浏览器打开
MSL最大报文生存时间默认值
最新发布
MSL不同系统的默认值 Windows : MSL = 2 minlinuxUbuntu, CentOs) : MSL = 60s Unix : MSL = 30s浏览器打开
MSL、TTL及RTT的区别
1、 MSL 是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。TCP报文 (segment)是ip数据报(datagram)的数据部分,具体称谓请参见《数据在网络各层中的称呼》一文;2、ip头中有一个TTL域,TTL是 time to live的缩写,中文可以译为“生存时间”,这个生存时间是浏览器打开
Linux下的时间修改及查看
一、系统时间分为两种: 1.硬件时间。 2.软件时间。 查看硬件时间:hwclock 查看系统时间;date 二、修改时间 date命令的相关参数 首先介绍一下命令符表示的意思 -S:把时间设为自己所描述的时间。 #例如:date -S“2019-02-15 12:00”…浏览器打开
msl、ttl及rtt的区别 TCP控制字段标志
热门推荐
http://wushank.blog.51cto.com/3489095/1135060 一、 msl、ttl及rtt的区别 1、 MSL 是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为tcp报文 (segment)是ip数据报(datagram)的浏览器打开
如何解决TIME_WAIT过多的解决办法(附Socket中的TIME_WAIT状态详解)
http://hi.baidu.com/xzhijun/blog/item/3a5f49609d443cd58cb10d01.html浏览器打开
最近网站流量有些上升,感觉到访问速度有些慢;用netstat -na命令发现系统中有大量状态为TIME-WAIT的TCP连接,google了下;修改了/etc/sysctl.conf中一些内核参数;解决了TCP连接中TIME-WAIT sockets的问题。
编辑/etc/sysctl.conf文件,增加如下内容:
#vi /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
再执行以下命令,让修改结果立即生效:
sysctl -p
用以下语句看了一下服务器的TCP状态:
netstat -n | awk ‘/^tcp/ {++state[$NF]} END {forkey in state) print key,” “,state[key]}’
返回结果如下:
TIME_WAIT 4654
FIN_WAIT1 576
FIN_WAIT2 91
ESTABLISHED 866
SYN_RECV 654
CLOSING 285
LAST_ACK 78
效果:处于TIME_WAIT状态的sockets从原来的20000多减少到5000左右;同时处于SYN_RECV等待处理状态的sockets也下降了。
通过上面的设置以后,你可能会发现一个新的问题,就是netstat时可能会出现这样的警告:
warning, got duplicate tcp line
这正是上面允许tcp复用产生的警告,不过这不算是什么问题,总比不允许复用而给服务器带来很大的负载合算的多
尽管如此,还是有解决办法的:
1、 安装rpm包:
[root@root2 opt]# rpm -Uvh net-tools-1.60-62.1.x86_64.rpm
Preparing… ########################################### [100%]
1:net-tools ########################################### [100%]
[root@root2 opt]#
对于下载的是源码的rpm则需要使用以下方法安装:
2、 安装rpm源码包方法:
a) 安装src.rpm:
# [root@root1 opt]# rpm -i net-tools-1.60-62.1.src.rpm
……
b) 制作rpm安装包:
[root@root1 opt]# cd /usr/src/redhat/SPECS/
[root@root1 SPECS]# rpmbuild -bb net-tools.spec
c) rpm包的升级安装:
[root@root1 SPECS]# pwd
/usr/src/redhat/SPECS
[root@root1 SPECS]# cd ../RPMS/x86_64/
[root@root1 x86_64]# rpm -Uvh net-tools-1.60-62.1.x86_64.rpm
3、 再使用netstat来检查时系统正常。
附录:
内核参数说明:
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1800 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死(本站正好采用的是squid+apache,修改前面几项参数后time_wait连接数依旧没有减少,最后修改了此参数)。
net.ipv4.route.gc_timeout = 100 路由缓存刷新频率,当一个路由失败后多长时间跳到另一个
默认是300
net.ipv4.tcp_syn_retries = 1 对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右。
TCP状态的变迁图:
状态描述:
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
TCP中TIME_WAIT的相关原理:
在socket的TIME_WAIT状态结束之前,该socket所占用的本地端口号将一直无法释放。编写过高TCP并发并且采用短连接方式进行通讯的软件程序的人,都可能体会到,这样的通讯系统在高并发高负载下运行一段时间后,就常常会出现做为客户端的程序无法向服务端建立新的socket连接的情况。此时用”netstat-anp”命令查看系统将会发现机器上存在大量处于TIME_WAIT状态的socket连接,并且占用大量的本地端口号。最后,当该机器上的可用本地端口号被占完,而旧的大量处于TIME_WAIT状态的socket尚未被系统回收时,就会出现无法向服务端创建新的socket连接的情况。此时的通讯系统几乎停转,空有再好的性能也发挥不出来。
如果能够在客户端程序主动关闭socket之前,让该socket的接收队列中仍保留一些数据(至少要有多余的一个字节的数据),然后调用close关闭,那么上述的无法向服务端创建新的socket连接的情况将不会出现。这是因为当socket的接收队列中仍有数据未被应用程序读走就被强行关闭时,操作系统(至少在笔者验证过的操作系统上的确如此)的TCP/IP协议栈驱动程序会在底层主动向服务端发送一个要求结束TCP连接的控制包,并将该TCP包头的flag控制字段中的RESET位置位,从而迅速结束了此TCP连接。这其实是操作系统对TCP连接断开的一种异常处理。而正常情况下(socket 的接收队列中无未读数据),当应该程序调用close关闭连接时,底层驱动程序向服务端发送的要求结束TCP连接的控制包头的flag控制字段中是将 FIN位置位,并且严格遵循上图所示的状态转换过程,最终到达TIME_WAIT状态并持续2*MSL的时间。
awk命令解释
netstat -n | awk ‘/^tcp/ {++state[$NF]} END {forkey in state) print key,” “,state[key]}’
/^tcp/
滤出tcp开头的记录,屏蔽udp, socket等无关记录。
state[]
相当于定义了一个名叫state的数组
NF
表示记录的字段数,如上所示的记录,NF等于6
$NF
表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT
state[$NF]
表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数
++state[$NF]
表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一
END
表示在最后阶段要执行的命令
forkey in state)
遍历数组
print key,” “,state[key]
打印数组的键和值,中间用 制表符分割,美化一下。