故障场景:
几台通过NAT访问一台服务器,服务器上开启了tcp_tw_recycle用于TIME_WAIT的快速回收

故障现象和分析步骤:
1) 通过NAT出口的客户端经常请求Web服务器无响应,telnet服务器端口不通,但是可以ping通。同一机房,有独立IP地址的服务器不存在这样的问题;
2) 在服务器抓包,发现服务端可以收到客户端的SYN请求,但是没有回应SYN,ACK,也就是说内核直接将包丢弃了。

解决方法:
1) 关闭服务其端的tcp_timestamps,故障解决,但是这么做存在安全和性能隐患;
2) 关闭tcp_tw_recycle,故障也可以解决。推荐NAT环境下的机器不要开启该选项;
3) 也就是说这两个参数不可能同时启用。

后记:
1) 当tcp_tw_recycle和tcp_timestamps同时打开时会激活TCP的一种隐藏属性:缓存连接的时间戳。60秒内,同一源IP的后续请求的时间戳小于缓存中的时间戳,内核就会丢弃该请求。NAT只改IP地址信息,但不会改变timestamp(TCP的时间戳不是系统时间,而是系统启动的时间uptime,所以两台机器的的TCP时间戳一致的可能性很小),所以很容易造成连接失败的情况。

2) TIME_WAIT状态是用于保障连接正常关闭的,并不会消耗过多资源。在高并发环境中tcp_tw_recycle和tcp_tw_reuse经常被打开用户快速回收和重用TIME_WAIT状态的socket,在资源有限的情况下这么多也无可厚非,不过也应该知道这么做会带来的后果。


转载自:http://www.libertyvps.com/thread-262-1-1.html