tcp_tw_recycle和tcp_timestamps导致connect失败问题 tcp timestamps 原理
1. 现象
第一个现象:模块A通过NAT网关访问服务S成功,而模块B通过NAT网关访问服务S经常性出现connect失败,抓包发现:服务S端已经收到了syn包,但没有回复synack;另外,模块A关闭了tcptimestamp,而模块B开启了tcp timestamp;
第二个现象:不同主机上的模块C(开启timestamp),通过NAT网关(1个出口ip)访问同一服务S,主机C1connect成功,而主机C2 connect失败;
2. 分析
根据现象上述问题明显和tcp timestmap有关;查看linux2.6.32内核源码,发现tcp_tw_recycle/tcp_timestamps都开启的条件下,60s内同一源ip主机的socketconnect请求中的timestamp必须是递增的。
源码函数:tcp_v4_conn_request(),该函数是tcp层三次握手syn包的处理函数(服务端);
源码片段:
if (tmp_opt.saw_tstamp&&
tcp_death_row.sysctl_tw_recycle&&
(dst =inet_csk_route_req(sk, req)) != NULL&&
(peer =rt_get_peer((struct rtable *)dst)) != NULL&&
peer->v4daddr == saddr) {
if(get_seconds()< peer->tcp_ts_stamp +TCP_PAWS_MSL &&
(s32)(peer->tcp_ts -req->ts_recent) >
TCP_PAWS_WINDOW) {
NET_INC_STATS_BH(sock_net(sk),LINUX_MIB_PAWSPASSIVEREJECTED);
gotodrop_and_release;
}
}
tmp_opt.saw_tstamp:该socket支持tcp_timestamp
sysctl_tw_recycle:本机系统开启tcp_tw_recycle选项
TCP_PAWS_MSL:60s,该条件判断表示该源ip的上次tcp通讯发生在60s内
TCP_PAWS_WINDOW:1,该条件判断表示该源ip的上次tcp通讯的timestamp 大于本次tcp
分析:主机client1和client2通过NAT网关(1个ip地址)访问serverN,由于timestamp时间为系统启动到当前的时间,因此,client1和client2的timestamp不相同;根据上述syn包处理源码,在tcp_tw_recycle和tcp_timestamps同时开启的条件下,timestamp大的主机访问serverN成功,而timestmap小的主机访问失败;
参数:/proc/sys/net/ipv4/tcp_timestamps -控制timestamp选项开启/关闭
/proc/sys/net/ipv4/tcp_tw_recycle - 减少timewait socket释放的超时时间
3. 解决方法
echo 0> /proc/sys/net/ipv4/tcp_tw_recycle;
tcp_tw_recycle默认是关闭的,有不少服务器,为了提高性能,开启了该选项;
为了解决上述问题,个人建议关闭tcp_tw_recycle选项,而不是timestamp;因为 在tcptimestamp关闭的条件下,开启tcp_tw_recycle是不起作用的;而tcptimestamp可以独立开启并起作用。
源码函数:tcp_time_wait()
源码片段:
if (tcp_death_row.sysctl_tw_recycle&&tp->rx_opt.ts_recent_stamp)
recycle_ok =icsk->icsk_af_ops->remember_stamp(sk);
......
if (timeo< rto)
timeo = rto;
if(recycle_ok) {
tw->tw_timeout = rto;
} else{
tw->tw_timeout = TCP_TIMEWAIT_LEN;
if (state ==TCP_TIME_WAIT)
timeo = TCP_TIMEWAIT_LEN;
}
inet_twsk_schedule(tw, &tcp_death_row, timeo,
TCP_TIMEWAIT_LEN);
timestamp和tw_recycle同时开启的条件下,timewait状态socket释放的超时时间和rto相关;否则,超时时间为TCP_TIMEWAIT_LEN,即60s;
内核说明文档 对该参数的介绍如下:
tcp_tw_recycle - BOOLEAN
Enable fastrecycling TIME-WAIT sockets. Default value is 0.
It should not bechanged without advice/request of technical
experts.
原文链接:http://blog.sina.com.cn/u/2015038597
更多阅读
DropDownList的SelectedValue不存在导致出错的问题解决 dropdownlist的value
两个表,是一对多的关系,两个表之间的关系我没有做约束,所以a表中的外键所指向的记录可以被任意删除这就导致一个问题了,程序里面本来是用DropDownList的数据绑定是用了SelectedValue来默认选择所指向的记录,但是当该记录已经被删除也
解决有道云笔记QQ总是授权失败问题 有道云笔记授权出错
有道云笔记QQ总是授权涉及到三个东西:有道云笔记软件、浏览器和QQ,因此逐个排除1.首先重装有道云笔记,然后QQ授权登录,还是失败,排除有道云笔记的问题;2.更换默认浏览器,原来使用firefox,换成IE,然后QQ授权登录,还是失败,排除浏览器的问题;
转载 迈达斯关于规范中长期荷载组合和短期荷载组合的问题 荷载短期效应组合
原文地址:迈达斯关于规范中长期荷载组合和短期荷载组合的问题作者:babyface1#关于规范中长期荷载组合和短期荷载组合的问题[精品好帖]问题现象:A类预应力混凝土构件考虑荷载长期效应组合下的正截面混凝土的拉应力验算时,根据规范规定
详解TCP/IP协议丢失问题 tcp ip协议详解 卷2
很多朋友在局域网出现问题后,当进行修复时发现TCP/IP协议丢失了,这让网络设置与配置都无从下手,网上对于这个问题的解决方法是从别的电脑拷贝过来,或直接重装系统,这让很多朋友大为恼火,只是一个协议的丢失,却要重装整个系统。针对这个问题
应用程序正常初始化失败问题解决流程 岛风go正常初始化失败
问题情境:在项目中使用了visual leakdetector,调试时 程序无法启动报错“应用程序正常启动失败”解决流程:查看vs输出信息最后一条是"LDR: LdrpWalkImportDescr