TIME_WAIT 太多的解决办法

TIME_WAIT

客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口状态为TIME_WAIT.主动关闭的一方在发送最后一个 ack 后

就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间

这个是TCP/IP必不可少的,也就是“解决”不了的,也就是TCP/IP设计者本来是这么设计的

主要有两个原因

1。防止上一次连接中的包,迷路后重新出现,影响新连接

(经过2MSL,上一次连接中所有的重复包都会消失)

2。可靠的关闭TCP连接

在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。

TIME_WAIT 并不会占用很大资源的,除非受到攻击。

还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态

1

netstat -an

查看下,发现系统中有很多time_wait的连接。因此直接用一下命令查看详细情况

1

netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}‘

具体的解决方式

vim /etc/sysctl.conf

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

//修改系統默认的 TIMEOUT 时间

/sbin/sysctl -p   //保存后生效

目前看来最好的办法是让每个TIME_WAIT早点过期。

在linux上可以这么配置:

#让TIME_WAIT状态可以重用,这样即使TIME_WAIT占满了所有端口,也不会拒绝新的请求造成障碍
echo "1" > /proc/sys/net/ipv4/tcp_tw_reuse
#让TIME_WAIT尽快回收,我也不知是多久,观察大概是一秒钟
echo "1" > /proc/sys/net/ipv4/tcp_tw_recycle

很多文档都会建议两个参数都配置上,但是我发现只用修改tcp_tw_recycle就可以解决问题的了,TIME_WAIT重用TCP协议本身就是不建议打开的。

不能重用端口可能会造成系统的某些服务无法启动,比如要重启一个系统监控的软件,它用了40000端口,而这个端口在软件重启过程中刚好被使用了,就可能会重启失败的。linux默认考虑到了这个问题,有这么个设定:

#查看系统本地可用端口极限值
cat /proc/sys/net/ipv4/ip_local_port_range

用这条命令会返回两个数字,默认是:32768 61000,说明这台机器本地能向外连接61000-32768=28232个连接,注意是本地向外连接,不是这台机器的所有连接,不会影响这台机器的80端口的对外连接数。但这个数字会影响到代理服务器(nginx)对app服务器的最大连接数,因为nginx对app是用的异步传输,所以这个环节的连接速度很快,所以堆积的连接就很少。假如nginx对app服务器之间的带宽出了问题或是app服务器有问题,那么可能使连接堆积起来,这时可以通过设定nginx的代理超时时间,来使连接尽快释放掉,一般来说极少能用到28232个连接。

时间: 2024-08-03 05:53:16

TIME_WAIT 太多的解决办法的相关文章

TIME_WAIT 太多的解决办法[转载]

TIME_WAIT 客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口状态为TIME_WAIT.主动关闭的一方在发送最后一个 ack 后 就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间 这个是TCP/IP必不可少的,也就是“解决”不了的,也就是TCP/IP设计者本来是这么设计的 主要有两个原因 1.防止上一次连接中的包,迷路后重新出现,影响新连接 (经过2MSL,上一次连接中所有的重复包都会消失) 2.可靠的关闭TCP连

android DatePicker / TimePicker 占空间太大的解决办法

DatePicker 与 TimePicker 控件占用的空间是固定的,没有参数可以更改. 如果修改 length 和 width 属性,只会让控件被切割,显示将不完整.很多人说可以使用 scale 属性来放大或缩小 android:scaleX="0.8" android:scaleY="0.8" 这种方法虽然会缩小控件,但控件还是没法显示全. 找到的一个不错的解决办法是,用 Java 反射机制获取控件相关属性,然后修改.代码如下: Field[] fields

linux QQ使用实践兼wine QQ2013版本太低无法使用解决办法

本人系统debian7,安装完系统后就搜索了QQ使用,这可是最基本的功能.参考http://www.longene.org/forum/viewtopic.php?f=6&t=4700 摘要一部分:+-----------------------------------------------------------------------+安装说明:+-----------------------------------------------------------------------+

MyEclipse代码编辑器中汉字太小的解决办法(中文看不清)

问题描述:新安装的myeclipse 2014,代码编辑器中汉字很小看不清 解决办法:调整字体即可.通过菜单Windows——Preferences,输入font过滤选择Colors and Fonts选项,右边选择Basic——Text Font,点击Edit修改字体,将字体属性的脚本由“西欧语言”修改为“中欧字符”即可.

MySQL ibdata1文件太大的解决办法

在MySQL数据库中,如果不指定innodb_file_per_table=1参数单独保存每个表的数据,MySQL的数据都会存放在ibdata1文件里,时间久了这个文件就会变的非常大. 下面是参考网上的一些资料,把数据分别保存在各数据库子目录里的方法,这样新产生的ibdata1文件就不会太大了.下面是在Ubuntu 14.04.12 x64,MySQL5.5上对ibdata1进行瘦身,操作过程的整理. 1.备份数据库中的数据. mysqldump -u root -p --extended-in

vsftp登录时间太长的解决办法

与ssh一样,vsftp的配置文件默认开启了DNS反向解析,这可能会造成用户在登陆到FTP服务器的时候奇慢无比,只要在配置文件中禁用DNS反向解析即可解决文件. 编辑/etc/vsftpd/vsftpd.conf 添加 reverse_lookup_enable=NO 重启vsftpd服务后问题解决,现在登陆看看,是不是秒进了~

docker pull 太慢了解决办法

使用阿里云镜像加速器 [[email protected] ~]# /etc/docker [[email protected] ~]# vi /etc/docker/daemon.json { "registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"] } [[email protected] ~]# systemctl daemon-reload [[email protected] ~]# syst

mysql打开文件数太多的解决办法

http://www.orczhou.com/index.php/2010/10/mysql-open-file-limit/ http://www.cnblogs.com/end/archive/2013/02/02/2890018.html 然后, 以root身份重新启动 mysqld. 在这里, 尽管 my.cnf 中指定的运行用户不是root, 一样可以以root身份来启动mysqld, 否则 open_files_limit 选项无法生效, 因为内核限制了普通用户的最多打开文件数.

git clone速度太慢的解决办法

思路: git clone特别慢是因为github.global.ssl.fastly.net域名被限制了.只要找到这个域名对应的ip地址,然后在hosts文件中加上ip–>域名的映射,刷新DNS缓存便可. 实施方法: 1.在网站 https://www.ipaddress.com/ 分别搜索: github.global.ssl.fastly.net github.com 2.在hosts文件末尾添加两行(对应上面查到的ip) 151.101.185.194 github.global-ssl