Contents

net.ipv4.tcp_tw_recycle 这个参数稍微熟悉linux的同学应该都不陌生,网上随便一搜,凡是解决TCP time wait的文章都提到把这个改成1能快速回收time wait连接。
我之前的记录是这样写的

net.ipv4.tcp_tw_recycle = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

但是这里忽略了一个很重要的参数 net.ipv4.tcp_timestamps,这个参数默认就是1

timestamp为TCP/IP协议栈提供了两个功能:
a. 更加准确的RTT测量数据,尤其是有丢包时 – RTTM
b. 保证了在极端情况下,TCP的可靠性 – PAWS

但这两个参数同时为1的时候,而且client端在NAT网络环境中,就很容易出现TCP握手异常,表现为端口间歇性出现telnet不通。
因为NAT环境中,与服务器建立连接的同一个ip,实际包含了多个client,这些client机器的timestamp可能并不是完全同步,这就有可能造成2个client同时向服务器发起握手,后发起握手的client由于timestamp比前一个发起握手的client小,服务器就判断后发起握手的client数据包是异常而丢弃。

这种情况在之前一直被忽略了,直到最近经常被投诉访问网页出现 timeout现象才通过抓包一步一步分析,发现服务器不返回某些封包。
还可以通过以下命令查看因为timestamp而丢弃的封包数,如果不断增大则说明有问题

1
2
3
4
ubuntu@test:~$ netstat -s |grep timestamp
timestamp request: 32
timestamp replies: 32
766 packets rejects in established connections because of timestamp

所以在这种情况下,建议tcp_tw_recycle设置0,因为tcp_timestamps如果为0,则tcp_tw_recycle也不会生效。
特此记录

Contents