Linux系统无法建立TCP连接、不响应SYS包的问题解决

分类:CentOS运维 阅读:45533 次

开发人员反馈,说有时能连接到服务器,有时又不能连接到服务器,频繁出现连接断线的情况,这个问题已经困扰他们一两个月了。通过使用Wireshark在服务器抓包,的确如开发人员说的那样:客户端请求服务器建立TCP连接时,向服务器发送SYS包,但服务器却对该SYS包不作任何回应,所以才出现连接断线的情况。抓包结果如下:

Linux系统无法建立TCP连接、不响应SYS包的问题解决

从抓包截图中可以清晰地看到,客户端的35425端口连续3次向服务器的80端口发送SYS包,请求建立TCP连接。但服务器却未回应,没有将回应包发送到客户端的35425端口,因此客户端认为建立TCP连接失败,表现出现的现象就是连接断线或网络断开等。

经查询,对发生这种服务器不响应客户端SYS包请求的解释如下:

当客户端发出的SYS包带有时间戳的情况下,经过NAT转换后,如果使用的端口在之前已经使用过,而且之前相同端口的SYS包中携带时间戳大于本次SYS包中的时间戳。在这种情况下,Linux系统内核将会直接丢弃本次SYS包,造成本次链接无法正常完成TCP/IP的3次握手。【该功能和rfc1323有关:http://tools.ietf.org/html/rfc1323】

上面的说法可能有些绕口,不容易理解,举个例子来说明一下。假如处于同一内部网络的主机A和主机B通过NAT网关(1个ip地址,且端口也相同)访问serverN,由于timestamp时间为系统启动到当前的时间,因此,主机A和主机B的timestamp不相同;这时,timestamp大的主机访问serverN成功,而timestmap小的主机则访问serverN失败。

解决该问题的方法为:关闭TCP的timestmap功能,即不启用时间戳。

# vi /etc/sysctl.conf,设置

view plain copy

  1. net.ipv4.tcp_timestamps = 0

  2. ## 默认情况下,该值为1,即启用

然后执行# sysctl -p 使配置生效,这样就不会出现间歇性断线的情况了.