tcp_tw_recycle+tcp_timestamp+NAT问题_貓的博客-CSDN博客_tcp_tw_recycle tcp_timestamp

标签: | 发表时间:2020-07-17 15:52 | 作者:
出处:https://blog.csdn.net

在排查一个超时问题的时候,又再一次遇到了  tcp_tw_recycle 在遇到 NAT 的场景下,可能导致丢包的问题, 掉进同一个坑两次,因此做一次记录; 特别是手抽改过系统tcp参数的应用,需要注意

 

现象

不同主机C1,C2上的相同模块(开启timestamp),通过NAT网关(1个出口ip)访问同一服务S,主机C1 connect成功,而主机C2 connect失败

 

故障模型

在以下架构的时候,需要特别留意这个问题

调用方/客户端(一般为多台机器) --> 客户端proxy/出口(一般为单个IP)–> 被调用方/服务端(单台/集群)

调用方/客户端(一般为多台机器) --> 客户端proxy/出口(一般为单个IP)–>  服务端负载均衡器 --> 被调用方/服务端(单台/集群)

图示:

 

解决方法

  • 服务器端不要将tcp_tw_recycle字段和tcp_timestamps字段同时设为1; 对于服务提供方,建议使用,主动权在服务端,可控性强

    1

    2

    3

    4

    5

    6

    7

    8

    9

    ## 修改 /etc/sysctrl.conf

    ## 其实系统默认就是这两个值

    net.ipv4.tcp_tw_recycle = 0

    net.ipv4.tcp_timestamps = 1

     

    ##酌情加上

    net.ipv4.tcp_max_tw_buckets = 36000

     

    sysctl -p

  • 客户端把tcp_timestamps字段设0,这样不会发送TCP选项字段中的timestamps选项;需要和客户端沟通做配置修改

建议关闭tcp_tw_recycle选项,而不是timestamp;因为 在tcp timestamp关闭的条件下,开启tcp_tw_recycle是不起作用的;而tcp timestamp可以独立开启并起作用。

 

分析

根据现象上述问题明显和tcp timestmap有关;查看linux 2.6.32内核源码,发现tcp_tw_recycle/tcp_timestamps都开启的条件下,60s(timewai时间)内同一源ip主机的socket connect请求中的timestamp必须是递增的。

网上随便搜都有源码分析,就不贴了

 

已知场景

客户端

负载均衡器

处理方案

例子

备注

任意 aws ELB 不处理   ELB有避免该情况的措施
  aws NLB 待测试    
  aws ALB 待测试    
  阿里云SLB 待测试    
服务器,合作方调用 LVS/单机环境 必须处理   很多时候,对方都会在出口使用proxy
一般终端用户(手机、电脑) LVS 建议处理    

 

net.ipv4.tcp_tw_recycle的去留

      net.ipv4.tcp_tw_recycle 快速回收time_wait有很好的效果;个人认为两类场景可以配置net.ipv4.tcp_tw_recycle=1
  • 高并发内部调用,一般不存在客户端proxy
  • 自己对上下游应用有较强的可控性

refer

http://blog.sina.com.cn/s/blog_781b0c850100znjd.html

https://colobu.com/2014/09/18/linux-tcpip-tuning/

http://blog.51cto.com/myfuture/876566

https://zhuanlan.zhihu.com/p/35684094

http://perthcharles.github.io/2015/08/27/timestamp-NAT/     ##这篇解释和引申比较透彻

相关 [tcp tw recycle] 推荐:

tcp/ip调优

- Lucseeker - 在路上
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;.

浅谈TCP优化

- - 火丁笔记
很多人常常对 TCP优化有一种雾里看花的感觉,实际上只要理解了TCP的运行方式就能掀开它的神秘面纱. Ilya Grigorik 在「 High Performance Browser Networking」中做了很多细致的描述,让人读起来醍醐灌顶,我大概总结了一下,以期更加通俗易懂. 传输数据的时候,如果发送方传输的数据量超过了接收方的处理能力,那么接收方会出现丢包.

TCP报文结构

- - 互联网 - ITeye博客
一、TCP报文结构如下:.  固定首部长度为20字节,可变部分0~40字节,各字段解释:. source port number:源端口,16bits,范围0~65525. target port number:目的端口,16bits,范围同上. sequence number:数据序号,32bits,TCP 连接中传送的数据流中的每一个字节都编上一个序号.

TCP 状态变化

- - 互联网 - ITeye博客
关闭socket分为主动关闭(Active closure)和被动关闭(Passive closure)两种情况. 前者是指有本地主机主动发起的关闭;而后者则是指本地主机检测到远程主机发起关闭之后,作出回应,从而关闭整个连接. 将关闭部分的状态转移摘出来,就得到了下图:. 通过图上,我们来分析,什么情况下,连接处于CLOSE_WAIT状态呢.

TCP/IP分享——链路层

- Goingmm - 弯曲评论
在张国荣自尽8周年纪念日,也就是愚人节的前几十分钟,终于把第二章弄完了. 首席似乎不是特别有空,我就斗胆在这里自己发了,从前面2期的反响来看,相当热烈,我也是摆出一副要杀要剐,悉听尊便的架势,这可能是受最近流行霸气外露的影响,批评几句又伤不了皮毛,也影响不了我的工作和正常生活,只要给大家带来快乐,我就很开心,似乎历史上很多想法都是在争吵中诞生的.

TFO(tcp fast open)简介

- chenqj - pagefault
原创文章,转载请注明: 转载自pagefault. 本文链接地址: TFO(tcp fast open)简介. 这个是google的几个人提交的一个rfc,是对tcp的一个增强,简而言之就是在3次握手的时候也用来交换数据. 这个东西google内部已经在使用了,不过内核的相关patch还没有开源出来,chrome也支持这个了(client的内核必须支持).

TCP/IP重传超时--RTO

- dennis - 一个故事@MySQL DBA
Shared by 子非鱼 安知余(褚霸). 概述:本文讨论主机在发送一个TCP数据包后,如果迟迟没有收到ACK,主机多久后会重传这个数据包. 主机从发出数据包到第一次TCP重传开始,RFC中这段时间间隔称为retransmission timeout,缩写做RTO. 本文会先看看RFC中如何定义RTO,然后看看Linux中如何实现.

TCP协议通讯流程

- - 操作系统 - ITeye博客
服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到后从accept()返回.

TCP短链接调优

- - 操作系统 - ITeye博客
最近在做一个项目,用到HttpClient查询数据,由于服务端强制做成了短链接(大家都知道http1.1默认是带有keepalive机制),导致了请求方TCP状态很多都是TIME_WAITZ状态,端口被全部占用,请求失败. net.ipv4.tcp_tw_reuse = 1 表示开启重用. 允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;.

TCP 的那些事儿(下)

- - 酷 壳 - CoolShell.cn
这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇《 TCP的那些事儿(上)》 上篇中,我们介绍了TCP的协议头、状态机、数据重传中的东西. 但是TCP要解决一个很大的事,那就是要在一个网络根据不同的情况来动态调整自己的发包的速度,小则让自己的连接更稳定,大则让整个网络更稳定. 在你阅读下篇之前,你需要做好准备,本篇文章有好些算法和策略,可能会引发你的各种思考,让你的大脑分配很多内存和计算资源,所以,不适合在厕所中阅读.