日期:2014-05-16  浏览次数:20733 次

Linux系统不响应SYN包的解决办法
关于syn为什么没有回应的问题真是郁闷了好久。
现象就是在客户端发出syn包的时候,服务器端对客户端的syn包不做任何回应。
在网上逛了逛,终于找到有人也发生了这样的情况,发生的原因解释如下:
当客户端发出的syn包带有时间戳的情况下,经过NAT转换后,如果使用的端口被之前使用过,而且时间戳大于本次syn包中的时间戳。系统将会直接丢弃。造成本次链接无法正常完成TCP/IP的3次握手。【该功能和rfc1323有关,后面有链接】
解决的方法很简单,分为两种:
在客户端:关闭rfc1323
在服务端:设置sysctl.conf里面tcp_timestamps=0也可以只用命令sysctl -w net.ipv4.tcp_timestamps=0

收集到的几种客户端的rfc参数位置
Linux:和服务器端的基本相同
微软为注册表方式,位置为【HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Tcp1323Opts】:
Windows XP:默认值为3
Windows 7 家庭版:默认值为1
Windows 7 旗舰版:没有找到这个键值

关于本文提到的技术解释:
Tcp1323Opts:http://technet.microsoft.com/en-us/library/cc938205.aspx
RFC1323:http://tools.ietf.org/html/rfc1323
最早看到解决这个问题的文章:http://www.spinics.net/lists/linux-net/msg17195.html