在Linux中使用如下的命令查看Linux内核中各种状态的socket
netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
在答主电脑中如下所示:
各个状态的socket:
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
如果目前内核中存在大量处于TIME_WAIT状态的socket,那么说明这些socket还没有被释放掉,它们还占用着资源,这样就有可能导致操作系统的负载过高,怎么解决这个问题呢?
通过调整内核参数来解决:
vim /etc/sysctl.conf
增加如下内容:
#表示开启SYN cookies,当出现SYN等待队列溢出时,启用cookies来处理,可以防范少量SYN攻击,默认为0,表示关闭。
net.ipv4.tcp_syncookies = 1
#表示开启重用,允许将TIME_WAIT状态的socket重新用于新的TCP连接,默认为0,表示关闭。
net.ipv4.tcp_tw_reuse = 1
#表示开启TCP连接中的TIME_WAIT状态的socket的快速回收机制,默认为0,表示关闭。
net.ipv4.tcp_tw_recycle = 1
#修改系统默认的TIMEOUT时间,默认是1分钟。
net.ipv4.tcp_fin_timeout = 30
执行下面命令让参数生效:
/sbin/sysctl -p