近来线上陆续出现了一些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.

转载于:https://www.cnblogs.com/LuckWJL/p/9997007.html

tcp_tw_recycle和tcp_timestamps导致connect失败问题相关推荐

  1. Linux同时开启tcp_tw_recycle和tcp_timestamps导致TCP syn有时不响应故障排查

    问题描述 前几天,同事反馈从公司连接线上一台服务器有时候会失败,经过抓包发现,TCP握手过程失败.查了相关资料,发现是跟net.ipv4.tcp_tw_recycle和net.ipv4.tcp_tim ...

  2. SAP HU 序列号里的Sales Order号码不一致导致PGI失败问题之对策

    SAP HU & 序列号里的Sales Order号码不一致导致PGI失败问题之对策 笔者所在的项目上,某日收到业务部门用户报问题说某个DN发货过账,报错:"The indicato ...

  3. BCH阵营对立将导致共识失败?Cobra有话说!

    近日,nchain首席科学家Craig Wright提出的bitcoin SV节点引发了BCH社区各方在其发展方向上激烈争论,无论是孰对孰错,理念之争终归是为了BCH的未来发展.这同时也正说明了BCH ...

  4. 传真故障排除示例--传真模式不一致导致传真失败

    原因: 传真模式不一致(服务端T38.设备端T30)导致传真失败 故障现象:发送传真正常,无法接受传真 设备封包提示信息: 服务端->设备:  服务端要求传真模式为T.38 设备端->服务 ...

  5. 传真故障排除示例--编码不一致导致传真失败

    原因: 通话的首选编码与设备传真模式默认首选编码不一致导致传真失败 故障现象:发送传真正常,无法接受传真 设备封包提示信息: 服务端->设备:  服务端要求媒体的首选编码为  g711u 设备端 ...

  6. 成功解决无法连接到YLMF-201404228CG,在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败

    成功解决无法连接到YLMF-201404228CG,在建立与服务器的连接时出错.在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败 ...

  7. 今晚被两个bug 困扰---第一个,小程序数组传递到PHP后台变成了字符串,导致解析失败

    1.今晚被两个bug 困扰-第一个,小程序数组传递到PHP后台变成了字符串,导致解析失败 2.解决方法 小程序部分: var that = this; console.log(this.data.co ...

  8. F盘无法访问设备硬件出现致命错误,导致请求失败数据找回的方案

    硬盘打不开设备硬件出现致命错误,导致请求失败,是因为这个I盘的文件系统内部结构损坏导致的.要恢复里面的数据就必须要注意,这个盘不能格式化,否则数据会进一步损坏.具体的恢复方法看正文 工具/软件:Aur ...

  9. 移动硬盘提示无法访问设备硬件出现致命错误,导致请求失败的资料寻回方案

    J盘打不开设备硬件出现致命错误,导致请求失败,是因为这个I盘的文件系统内部结构损坏导致的.要恢复里面的数据就必须要注意,这个盘不能格式化,否则数据会进一步损坏.具体的恢复方法看正文 工具/软件:星空数 ...

最新文章

  1. leetcode算法题--在排序数组中查找数字 I
  2. Go语言集合(Map)
  3. java实现权限_Java实现权限管理的两种方式
  4. Kubernetes 架构与设计
  5. 常用功能错误不是问题,对待行为让人绝望
  6. SAP Query创建教程
  7. unity中的UV是什么
  8. 2021高考厦门一中成绩查询,2021年厦门中考成绩排名查询,厦门中考个人成绩排名查询...
  9. vue 项目使用Standardjs进行语法错误检测和修复
  10. 最详细的 Deepin安装idea2018及破解教程,有效期到2100年
  11. Matlab中pickic_高颜值甜品DIY |春季甜品Picnic野餐系列,一起过个惬意慵懒的午后时光❗️...
  12. kettle 9.1 连接hadoop clusters (CDH 6.2)
  13. scratch python插件_scratch插件开发文档
  14. LCD12864液晶显示模块的使用与分析
  15. 字体颜色 * 博客 * 好看
  16. 2021阿里云供应链大赛--需求预测与单级库存优化参赛总结
  17. 创新实验室实习生每周工作总结【实习第七周】
  18. js原生常用知识点总结
  19. 抽象类、接口、Objext 详解
  20. 银联国际推出开发者平台,创新升级技术服务能力

热门文章

  1. 推荐:Webpack2入门到深入的中文文档
  2. 进阶高端,2017年vivo手机用实力说话
  3. 查看linux系统的平均负载
  4. apache-2.4.x 编译安装方法
  5. DELL 向左走 向右走?(二)
  6. android ndk怎样加载o文件_JNI初探之NDK 开发环境配置
  7. 兵团教师计算机水平考试免考条件,兵团职称计算机考试政策.doc
  8. Flask-Login一些使用解释(根据官网和个人查找资料的理解并解释)
  9. sqlalchemy中的first_or_404()和get_or_404()使用(前端页面可视化操作——查询和添加)
  10. poj1422(最小路径覆盖问题)