Q1
在家里无法打开公司的网站,经过各种测试,利用ping、dig域名,然后curl,都正常。但是网站依然无法打开。最后,采用抓包的方式,从包中看到syn-ack没有返回,然后就百度。
经过查找net.ipv4.tcp_timestamps=1,启用了时间戳。
原理如下:
tcp三次握手问题,当有一个用户的时间戳大于这个链接发出的syn中的时间戳,服务器上就会忽略掉这个syn,不返会syn-ack消息。用户表现无法正常完成tcp3次握手,从而不能打开web页面。在业务闲时,如果用户nat的端口没有被使用过时,就可以正常打开;业务忙时,nat端口重复使用的频率高,很难分到没有被使用的端口,从而产生这种问题。
解决:
net.ipv4.tcp_timestamps = 0
然后syctlp -p生效即可。
Q2
由于乱序,当发送rst包到对端的时候,连接还是establish的rst后,链接就会断开, 后来使得net.ipv4.tcp_timestamps = 0,问题解决。