问题描述

前几天,同事反馈从公司连接线上一台服务器有时候会失败,经过抓包发现,TCP握手过程失败。查了相关资料,发现是跟net.ipv4.tcp_tw_recyclenet.ipv4.tcp_timestamps两个参数有关,将net.ipv4.tcp_tw_recycle改为0,问题解决。

排查过程

在PC上通过wireshark抓包发现,失败的时候,TCP syn包是一直在重传的。在server端通过tcpdump抓包发现,PC侧发的syn包是已经到达,所以基本排除网络问题。tcpdump抓包中确实看不到server端响应的syn-ack,所以基本判定问题出在server段,接下来就是分析为啥server端不响应。
net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_timestamps = 1同时间开启,当多个PC经过NAT设备访问同一server的时候,受TCP PAWS(Protect Against Wrapped Sequence Numbers)影响,后发起连接的PC可能因为tcp options中的timestamp比前面PC的timestamp小,而导致syn不被响应。
linux服务器上可以通过netstat -s查看是否存在该问题。如果多次执行下面的命令,发现数字再增加,说明存在该问题,而且现在还在发生。

[root@anonymous ~]# netstat -s | grep "connections rejected because of time stamp"26 passive connections rejected because of time stamp
[root@anonymous ~]#

关于PAWS的检查机制,是对于处于TIME_WAIT状态的tcp连接的对端IP,为了防止来自同一IP的延迟数据的干扰,需要在60秒(#define TCP_PAWS_MSL 60)内新来的syn报文TCP options中的timestamp是递增的。详细解释可以参考RFC1323。

注意

排查过程中发现,windows系统和linux系统TCP syn options中timestamp是单调递增的,所以刚才描述的问题通常在多个PC经过NAT访问同一server的时候才容易复现。而测试中发现Mac系统本身syn报文options中的timestamp波动比较大,所以此问题很容易用Mac复现,只需要对着开启recycle和tcp_timestamps的server连续发起几次请求就可以。

总结

该问题将net.ipv4.tcp_tw_recyclenet.ipv4.tcp_timestamps改为0都可以解决,不建议将net.ipv4.tcp_timestamps改为0,因为它对精准计算RTT(Round-Trip Time))有用。此外,tcp_tw_recycle从4.12版本内核开始被移除了。我找了一个5.14版本的测试了下,确实不支持该配置了。

[root@test ~]# sysctl -p
sysctl: cannot stat /proc/sys/net/ipv4/tcp_tw_recycle: No such file or directory
[root@test ~]#

Linux同时开启tcp_tw_recycle和tcp_timestamps导致TCP syn有时不响应故障排查相关推荐

  1. tcp_tw_recycle和tcp_timestamps导致connect失败问题

    近来线上陆续出现了一些connect失败的问题,经过分析试验,最终确认和 proc参数tcp_tw_recycle/tcp_timestamps相关: 1. 现象 第一个现象 模块A通过NAT网关访问 ...

  2. Java进程CPU占用高导致的网页请求超时的故障排查

    作者:荣书 来源:https://blog.51cto.com/rongshu/2426712 一.发现问题的系统检查: 一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load a ...

  3. 记一次AD域域管理员密码更改导致某系统群集管理器故障排查解决过程

    环境描述 某公司有一套系统,2台Windows2003系统,采用自带的群集管理器功能实现双机热备功能,正常情况下,服务器10.1.1.1承载中间件应用服务,服务器10.1.1.2承载数据库服务,仅当其 ...

  4. mc java 连接超时_Java进程CPU占用高导致的网页请求超时的故障排查

    一.发现问题的系统检查: 一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load average超过4负载很大,PID为7163的进程占用到了800%多.  二.定位故障 根据这 ...

  5. Linux C/C++编程:netstat分析tcp状态转移(socket通信)

    TCP 服务器 #include <stdlib.h> #include <stdio.h> #include <sys/socket.h> #include &l ...

  6. Linux内存耗尽宕机6,转载:Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案...

    原文链接: https://blog.csdn.net/u014740338/article/details/66975550 问题描述 Linux内存使用量超过阈值,使得Java应用程序无可用内存, ...

  7. Linux TCP SYN包不返回问题解析

    http://www.saview.net/archives/93 Linux TCP SYN包不返回问题解析 现象描述及排查过程: 最早是在网站图片cache集群中出现监控系统偶尔报告vip连接超时 ...

  8. Linux 网络编程学习笔记——三、TCP 协议详解

    目录 一.TCP 服务的特点 传输层协议主要有 TCP 协议和 UDP 协议,前者相对于后者的特点是:面向连接.字节流和可靠传输. 使用 TCP 协议通信的双方必须先建立连接,然后才能开始数据的读写. ...

  9. 如何起Linux服务器的21端口,linux下开启ftp的21号端口

    linux下开启ftp的21号端口 1.先运行vsftpd服务: #service vsftpd start 2.通过iptables开放21号端口 (1) 先查看iptables设置: #iptab ...

最新文章

  1. 雪碧图工具sprity(20151201更新修复了同时合并多张图的bug)
  2. 数组去重是面试中经常问到的问题
  3. Web Hacking 101 中文版 九、应用逻辑漏洞(一)
  4. python读取坐标文本文件_使用python读取txt坐标文件生成挖空矿山_探矿批量
  5. 这儿有一个使你网页性能提升10倍的工具
  6. ant vue 树形菜单横向显示_丝滑般 Vue 拖拽排序树形表格组件Vue-DragTreeTable
  7. Synchronized的底层实现原理(看这篇就够了)
  8. 有道词典Chrome划词插件
  9. 【第9篇】Python爬虫实战-银行卡归属地查询
  10. 思科交换机配置【串口初始配置】
  11. 语义分割CCNet-Criss Cross Network论文中注意力机制Criss Cross Attention模块的tensorflow代码实现
  12. python如何抓取网页里面的文字_python如何爬取网页中的文字
  13. 一位美国教授给研究生的怎样记读书笔记的建议(中文总结)
  14. 《算法笔记》——基础篇习题选择结构
  15. php加粉网源码,PHP独角发卡网源码
  16. 智能算法---蚁群算法介绍
  17. 正圆锥体空间方程_电路原理中三相缺相保护器是如何工作的,正负序与它有什么关系...
  18. C++的继承(一): 让蟋蟀继承蚱蜢
  19. 西安翻译学院东区计算机教室,西安翻译学院:200间教室跨进智慧时代
  20. 如果我们失联了,怎么办?

热门文章

  1. 从MapGIS K9到MapGIS 10到MapGIS 10.3 Server
  2. cobar mysql5.6_Cobar介绍及配置
  3. 创建Java Web工程
  4. Carla 使用神经网络训练自动驾驶车辆---数据采集部分
  5. 编写一程序,输入月份号,输出该月的英文月名。例如,输入3,则输出“March“,要求用指针数值处理。
  6. 使用PCA9685控制多个舵机
  7. TCP协议的RST标志
  8. Java基于nfs-client包实现NFS协议连接linux服务器进行文件上传与下载操作源码
  9. matlab如何将三维转为二维_matlab 三维矩阵转二维矩阵(转)
  10. 安装黑群晖找不到局域网电脑_简单几招,教你如何隐藏电脑上的文件,保证让其他人找不到!...