net.ipv4.tcp_timestamps引发的tcp syn无响应案

    在我目前一个高并发的项目中,一度出现服务器不再响应任何TCP的syn请求,新的客户端死活介入不了服务。出现该状态之前由于并发亮的增加,曾经优化过服务器,主要是将TIME-WAIT sockets重新用于新的TCP连接,优化如下:

1.修改/ect/sysctl.conf

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

2.修改/etc/security/limit.conf

* soft nofile 2000000
* hard nofile 2000000

    所以怀疑优化的这些参数出现问题了,通过查阅资料,发现tcp_timestamps默认是开启,如果再把tcp_tw_recycle设置为1,则60s内同一源ip主机的socket connect请求中的timestamp必须是递增的。也就是说服务器打开了 tcp_tw_reccycle了,就会检查时间戳,如果对方发来的包的时间戳是乱跳的或者说时间戳是滞后的,这样服务器肯定不会回复,所以服务器就把带了“倒退”的时间戳的包当作是“recycle的tw连接的重传数据,不是新的请求”,于是丢掉不回包,就出现了开始说的syn不响应。

解决方法:在/etc/sysctl.conf文件中再添加如下一行:

net.ipv4.tcp_timestamps=0
表示不再检查时间戳,并执行sysctl -p来生效,至此服务器恢复服务

你可能感兴趣的:(net.ipv4.tcp_timestamps引发的tcp syn无响应案)