一. 首先说下tcp端口的几种状态:
1、LISTENING状态
FTP
服务启动后首先处于侦听(LISTENING
)状态。
2、ESTABLISHED
状态
ESTABLISHED
的意思是建立连接。表示两台机器正在通信。
3、CLOSE_WAIT
对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT
此时我方要调用close()
来使得连接正确关闭
4、TIME_WAIT
我方主动调用close()
断开连接,收到对方确认后状态变为TIME_WAIT
。TCP
协议规定TIME_WAIT
状态会一直持续2MSL
(即两倍的分 段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT
状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情 况下,尽量不要主动断开连接,以减少TIME_WAIT
状态造成的资源浪费。
目前有一种避免TIME_WAIT
资源浪费的方法,就是关闭socket
的LINGER
选项。但这种做法是TCP
协议不推荐使用的,在某些情况下这个操作可能会带来错误。
5、SYN_SENT状态
SYN_SENT
状态表示请求连接,当你要访问其它的计算机的服务时首先要发个同步信号给该端口,此时状态为SYN_SENT
,如果连接成功了就变为 ESTABLISHED
,此时SYN_SENT
状态非常短暂。但如果发现SYN_SENT
非常多且在向不同的机器发出,那你的机器可能中了冲击波或震荡波 之类的病毒了。这类病毒为了感染别的计算机,它就要扫描别的计算机,在扫描的过程中对每个要扫描的计算机都要发出了同步请求,这也是出现许多 SYN_SENT的原因。
二、如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,
vim /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
让参数生效。
time_wait
的设计,是基于tcp
的四次挥手,上面改的那些内核参数的修改并非一劳永逸,可以参考:系统调优,你所不知道的TIME_WAIT
和CLOSE_WAIT