CentOS下存在大量的TCP TIME_WAIT解决方法

来源:互联网 发布:htc windows mobile 编辑:程序博客网 时间:2024/05/21 20:27

查看TIME_WAIT的数量:

netstat  -anp | grep TIME_WAIT |wc -l


查看TCP状态:

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


TIME_WAIT状态的socket一般需要等到2分钟时间后,socket才会被回收。


修改/etc/sysctl.conf文件,加入以下内容:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30


/sbin/sysctl -p让参数生效。

参数的含义:
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 修改系統默认的 TIMEOUT 时间


参数生效以后,再用 netstat -n -p -t发现大量的TIME_WAIT 已不存在

-----------------------------------------------------------------------------------------------------------------------------------


关于TIME WAIT

--------------客户端主动关闭连接-----------------------
注意一个问题,进入TIME_WAIT状态的一般情况下是客户端。
大多数服务器端一般执行被动关闭,服务器不会进入TIME_WAIT状态。
当在服务器端关闭某个服务再重新启动时,服务器是会进入TIME_WAIT状态的。
举例:
1.客户端连接服务器的80服务,这时客户端会启用一个本地的端口访问服务器的80,访问完成后关闭此连接,立刻再次访问服务器的
80,这时客户端会启用另一个本地的端口,而不是刚才使用的那个本地端口。原因就是刚才的那个连接还处于TIME_WAIT状态。
2.客户端连接服务器的80服务,这时服务器关闭80端口,立即再次重启80端口的服务,这时可能不会成功启动,原因也是服务器的连
接还处于TIME_WAIT状态。


如果time wait过多,则会占用机器的很多端口,如果超过系统的最大端口数,则系统将不会处理新的连接

0 0
原创粉丝点击