近来线上陆续出现了一些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,
                   TCP_TIMEWAIT_LEN);

timestamp和tw_recycle同时开启的条件下,timewait状态socket释放的超时时间和rto相关;否则,超时时间为TCP_TIMEWAIT_LEN,即60s;

内核说明文档 对该参数的介绍如下:
    tcp_tw_recycle - BOOLEAN
    Enable fast recycling TIME-WAIT sockets. Default value is 0.
    It should not be changed without advice/request of technical
    experts.

原文链接:http://blog.sina.com.cn/u/2015038597

转载于:https://blog.51cto.com/chris1986/1569727

Linux tcp_timestamps相关相关推荐

  1. Linux centos7 Linux网络相关、firewalld和netfilter、netfilter5表5链介绍、iptables语法

    一. Linux网络相关 yum install net-tools ifconfig查看网卡ip ifup ens33开启网卡 ifdown ens33关闭网卡 设定虚拟网卡ens33:0 mii- ...

  2. 七周三次课(11月29日) 10.11 Linux网络相关 10.12 firewalld和netfilter 10.13 netfilter5表5链介绍 10.14 iptables语法...

    2019独角兽企业重金招聘Python工程师标准>>> 10.11 Linux网络相关 ifconfig 查看网卡ip (yum install net-tools) 安装 -a   ...

  3. Linux网络相关、firewalld、netfilter及其5表5链、iptables语法

    2019独角兽企业重金招聘Python工程师标准>>> 1.Linux 网络相关 ifconfig 查看网卡IP,见下图, net-tools 包之前安装过了,这边还可以执行这个命令 ...

  4. Linux网络相关知识

    2019独角兽企业重金招聘Python工程师标准>>> 10月25日任务 10.11 Linux网络相关 10.12 firewalld和netfilter 10.13 netfil ...

  5. 七周三次课(1月24日) 10.11 Linux网络相关 10.12 firewalld和netfilter 10.13 netfilter5表5链介绍 10.14 iptables语法...

    七周三次课(1月24日) 10.11 Linux网络相关 10.12 firewalld和netfilter 10.13 netfilter5表5链介绍 10.14 iptables语法 ====== ...

  6. mysql切换用户命令_linux基础04:linux用户相关的命令有哪些?怎样切换用户?

    通过前面的几节课,我们在windows系统中安装好了linux虚拟机,也通过xshell远程终端连接上了linux虚拟.从今天开始,我们就可以正式开始学习linux的知识了.今天,我们主要介绍的是用户 ...

  7. linux网络相关配置

    linux网络相关配置文件 linux系统一般来说分为两大类: 第一类:Debian系列:Debian.Ubuntu等: 第一类:RedHat系列:Redhat.Centos.Fedora等: lin ...

  8. Linux日常运维管理技巧(一)监控系统状态、监控网卡流量、监控IO性能、查看系统进程、查看网络状态、Linux下抓包tcpdump、Linux网络相关、DNS配置

    目录 监控系统状态 监控网卡流量 监控IO性能 查看系统进程 查看网络状态 Linux下抓包 Linux网络相关 监控系统状态 w/uptime查看系统负载 [root@zyshanlinux-01 ...

  9. 小白初解Linux基础相关

    本人对计算机及Linux等相关知识小白一个为避免自己时间过长导致忘记所以写下此博客 下面写的是我对自己随堂笔记的一些解析 如有某方面说的不透彻或错误 我会慢慢改进望 大牛们见谅. 在解析Linux基础 ...

  10. 10.11 Linux网络相关 10.12 firewalld和netfilter 10.13 ne

    七周三次课 10.11 Linux网络相关 10.12 firewalld和netfilter 10.13 netfilter5表5链介绍 10.14 iptables语法 10.11 Linux网络 ...

最新文章

  1. 数据库SQL2000连接测试
  2. pm2-zabbix 安装与配置
  3. 如何通过示例在Java中使用CopyOnWriteArraySet
  4. python--批量下载豆瓣图片
  5. 雷林鹏分享:jQuery EasyUI 树形菜单 - 创建带复选框的树形菜单
  6. mybatis写增删改时候的注意点
  7. pyhton基础中的要点一
  8. 21_在线支付原理与实现
  9. 【鱼眼镜头2】[鱼眼畸变模型]:评估了五个模型:radial,division,FOV,多项式(如双三次]和rational模型。【需要修改】
  10. 获取附近小区信息_怎么通过网上找到靠谱的租房信息?
  11. Vue 动态加载public图片和图片预览例子
  12. 看mysql安装在哪怎么看_mysql安装在哪儿怎么查看?
  13. char,varchar,nchar,nvarchar具体含义和区别
  14. 理学知识01-ppm、ppb、ppt换算
  15. 4.四大类(DDL、DML、DQL、DCL)
  16. Table storage engine for ‘******‘ doesn‘t have this option 问题
  17. eclipse报错!!!!
  18. 用open3d将stl格式转化为ply格式,并且单位从mm转为m
  19. 亚马逊的运营思路是什么?有没有教程?
  20. 易模3D建模教程| 20min教会你人像3D建模

热门文章

  1. vscode php断点调试,如何使用vscode断点调试laravel
  2. linux拷贝文件后几百行,我 的 一 些 练 习 题
  3. ie浏览器框架不显示_Python 爬虫(四):Selenium 框架介绍与使用
  4. Prim算法实现最小生成树MST(java)
  5. UML?类图中聚合和组合的区别
  6. 基础集合论 第一章 6 并集
  7. linux texlive 中文,Ubuntu 安装 TexLive2013 及中文支持
  8. mysql 存储引擎文件夹_4种常用MySQL存储引擎
  9. Harris角点检测原理分析
  10. [USACO07DEC]道路建设Building Roads