Pages

Monday, 21 December 2015

/proc/sys/net/ipv4/tcp_timestamps 问题

#cat /proc/sys/net/ipv4/tcp_timestamps
"1" 以一种比重发超时更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。
2.6内核以上,这个参数默认为1。但是我最近碰到个问题,有台机器A,在公司内部用公司网络,在linux和安卓系统访问的时候网络不同。表现为80端口不同,但是ping是正常的。在windows和ios设备上访问A的80端口也是正常的。
最开始问题时出现在安卓客户端上,我以为是客户端的问题,随后我发现在安卓设备上telnet A 80 端口不通,这样的话就是网络层面的问题了。(安卓下面测试网络工具可以用 ping & dns)
但是现在是安卓有问题,IOS设备没有问题。而且在安卓设备访问其他网页或者刷微博都正常,也就是说安卓设备网络没有问题,问题应该出在机器A上面。或者说公司网络设备的问题?因为在安卓设备上切换成3G访问A机器的80端口也是正常的。
参考资料:
1、http://www.linuxidc.com/Linux/2011-04/34003.htm
2、http://www.ibm.com/developerworks/cn/linux/l-hisock.html
3、http://t.cn/8keXs6g

你的客户或者你的服务器在一个 NAT 后面,如果开启这个参数,会导致服务器能收到三次握手的 SYN 但是不会返回任何的 SYN+ACK,其结果是客户无法访问你的网站。可以通过 tcpdump 或者下面的这个查看:
# netstat -s | grep timestamp
tcp_timestamps 是 tcp 协议中的一个扩展项,通过时间戳的方式来检测过来的包以防止 PAWS(Protect Against Wrapped Sequence numbers),可以提高 tcp 的性能,2.6 的内核默认是打开的。只要 client/server/nat/loadbalancer 不同时打开该选项就不会出现上面的问题。
最后将/proc/sys/net/ipv4/tcp_timestamps 改为了0,问题解决。
update 
今天又碰到这个问题。现象是游戏里充值偶尔失败,后来发现充值调用游戏服务器里杜接口偶尔网络不通。我当时第一反应就想到了这个问题。修改参数后立马就生效了。
刚查看到这篇文章 http://www.360doc.com/content/12/1127/16/1073512_250564255.shtml ,建议修改tcp_tw_recycle 而不是修改timestamp,说的很有道理,明天测试下。
然后就是在何种情况下会出现这种问题,这个需要在翻资料学习下,然后以后避免此类问题。
cat /proc/sys/net/ipv4/tcp_timestamps
cat /proc/sys/net/ipv4/tcp_tw_recycle

sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_tw_recycle=1