tcp_tw_recycle和tcp_timestamps导致connect失败问题

转载 2015年11月17日 18:14:51

tcp_tw_recycle和tcp_timestamps导致connect失败问题

 (2012-02-01 18:40:32)
标签: 

tcp_tw_recycle

 

timestamp

 

connect

 

syn

 

tcp

分类: 内核
    近来线上陆续出现了一些connect失败的问题,经过分析试验,最终确认和proc参数tcp_tw_recycle/tcp_timestamps相关;
1. 现象
    第一个现象:模块A通过NAT网关访问服务S成功,而模块B通过NAT网关访问服务S经常性出现connect失败,抓包发现:服务S端已经收到了syn包,但没有回复synack;另外,模块A关闭了tcp timestamp,而模块B开启了tcp timestamp;
    第二个现象:不同主机上的模块C(开启timestamp),通过NAT网关(1个出口ip)访问同一服务S,主机C1 connect成功,而主机C2 connect失败;

2. 分析
    根据现象上述问题明显和tcp timestmap有关;查看linux 2.6.32内核源码,发现tcp_tw_recycle/tcp_timestamps都开启的条件下,60s内同一源ip主机的socket connect请求中的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);
                goto drop_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;因为 在tcp timestamp关闭的条件下,开启tcp_tw_recycle是不起作用的;而tcp timestamp可以独立开启并起作用。
    源码函数:  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,
   

如何使用gyp管理c++工程(ubuntu版)

1.简介gyp是google为chromium项目开发的管理工具,功能类似于cmake。gyp只能产生编译脚本,真正的编译工作还有靠其他工具,我选择了ninja。2.安装gyp和ninja $ s...

nodejs添加C++模块

安装node-gyp 新建hello.cc: Node的JavaScript引擎用的是Google开源的V8 JavaScript引擎(Chrome浏览器所用的引擎),所以简单介绍下v8中的一些概...

tcp_tw_recycle和tcp_timestamps导致connect失败问题

近来线上陆续出现了一些connect失败的问题,经过分析试验,最终确认和proc参数tcp_tw_recycle/tcp_timestamps相关; 1. 现象     第一个现象:模块A通过N...
  • starean
  • starean
  • 2013年08月31日 23:51
  • 871

公网服务器或客户端为 NAT 网络的服务器不要同时开启 tcp_tw_recycle 和 tcp_timestamps

背景及现象服务器:公网服务器 客户端:外网手游客户端 玩家侧现象:大批处于同一局域网内的内侧玩家连接服务器超时,但是切换成 4G 之后连接顺畅。 服务端现象:netstat -s" 显示 “pa...

记录一次,三次握手中缺少第二次握手导致的问题(即缺少SYN ACK返回,实际是tcp_tw_recycle设置导致的问题)

三次握手中缺少第二次握手导致的问题阿里云新购的ECS,镜像使用的微柳科技的Centos7+PHP环境,实际使用中发现如下现象: 1.公司IP/某常用IP经常无故无法连接服务器(包括ssh-22,my...
  • kk1946n
  • kk1946n
  • 2017年10月24日 10:54
  • 78

net.ipv4.tcp_tw_recycle 与 网络连接失败

最近从公司内网使用线上应用,很多同事都反映时断时连的,抓包看不时会有连接失败的情况(奇怪的是总是卡住约11秒),但其实最终是会成功的,但由于客户端的超时都是10秒,所以表现出来的就是总是服务不可用,出...

tcp_tw_recycle参数引发的系统问题

启用TIME-WAIT状态sockets的快速回收,这个选项不推荐启用。在NAT(Network Address Translation)网络下,会导致大量的TCP连接建立错误。...

tcp短连接TIME_WAIT问题解决方法大全(3)——tcp_tw_recycle

【tcp_tw_recycle和tcp_timestamps】 参考官方文档(http://www.kernel.org/doc/Documentation/networking/ip-sysctl....

关于内核参数tcp_tw_recycle

最近上线了一个手机类的网站,发现测试中苹果和安卓的系统访问效果区别很大。安卓系统访问的时候速度明显比较慢。然后进行排查, 当时环境是网站跑在系统是centos 5的虚拟机,物理机是centos 6 。...
  • zhsh87
  • zhsh87
  • 2013年09月17日 17:02
  • 1555

【经验总结】tcp_tw_recycle参数引发的故障

tcp_tw_recycle参数引发的故障 By Eric  故障描述:     2010年9月7日,新上线的手机游戏论坛有部分地区用户反应登陆游戏时出现不能登陆或登陆超时等情况,观察用户同时在...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:tcp_tw_recycle和tcp_timestamps导致connect失败问题
举报原因:
原因补充:

(最多只允许输入30个字)