从抓包分析,发现三次握手请求端发送了syn之后,接收端没有相应ack,而接收端对应的端口是listening状态,而且netstat看没有什么连接,系统可用连接肯定是足够的。
猜测是时间戳问题导致,三次握手失败。
分析如果将出现问题的机器的时间戳去掉会不会解决问题。针对带有时间戳的tcp syn包不响应的问题,查阅了相关资料得知产生问题的原因是出问题系统中的注册表中有Tcp1323opts这个选项,会导致其在发包时加入时间戳,经过nat之后,如果前面相同的端口被使用过,且时间戳大于这个链接发出的syn中的时间戳,服务器上就会忽略掉这个syn,不返会syn-ack消息,表现为用户无法正常完成tcp3次握手。
目前看有两种方法解决:
(1) 是在服务器上修改变量
首先我们先查看一下我们服务器net.ipv4.tcp_timestamps的默认值,如果该值为0测说名不是该问题导致,如果是1我们需要将该值设置为1。
查看默认值的方法:[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_timestamps
修改该值的方法:vim /etc/sysctl.conf 添加 net.ipv4.tcp_timestamps=0
sysctl-p马上生效
(2)修改客户端的注册表Tcp1323Opts设置为0。