一场由tcp_timestamps 引发的无解追击案

案例描述:我们的合作客户(国内知名电子支付企业)反应有四台机器调用我们的接口服务,但是奇怪的是四台中有两台是通的,有两台是不通的,不通的机器也是偶尔通偶尔不通,这个问题一直断断续续困扰了他们很久,刚开始我们认为是他们系统那里参数配置不对,就没有给予太多关注,毕竟我们还有好多合作客户,却没有问题;这个问题直到有一天,他们实在扛不住,实在找不出原因了,要求我们技术人员现场去帮他们排查,才开始了一场无解破解案。

那天接手了这个问题后,开始一对一让对方网络技术人员配合联合排查,分别从正常机器,不正常机器,出口网络设备,我方接收机器同时抓包测试;从抓包现象来分析的确是有重传现象,并且三台机器中偶尔一台通,另外两台就通不了;那天我们手工画了双方的 网络拓扑图,从中了解到一点 他们出去的时候做了S-NAT,并且在问题一开始他们试出了一个解决方法:再加一个外网ip 出来,四台机器不共用一个外网ip 出来,而是两个!这样有两台机器正常了。还有两台依然不正常。有点怪异。

中间的各种怀疑也不描述了,直到重看抓包,的确发现问题,对方在三次握手(这里就不做详细解释)的时候,发出syn包的时候,我方没有syn+ack 确认,对方一直tcp 重传,并且可以确认的是对方的syn 包的确到达我们了,是我们这边没有回复syn+ack!我们开始把注意力转向我方的网络情况。

三次握手过程截图:

对方出口截图:

我们的入口截图:

从源端口26414看,的确是同一连接请求从对方出口已经发出,到了我们迟迟没有syn+ack 回复,于是就有了不停的重传请求,连接超时。

刚开始怀疑nginx问题,怀疑keepd 问题,怀疑centos 问题,甚至怀疑底层虚拟化kvm/esxi 问题,做过的无尽测试排查这里就不描述了。但是从单方面一直没有突破,这个时候给了点希望,我方有台esxi ubuntu 的机器确实很正常的,对方三台机器都可以联通,于是就开始对比我们这边两台机器的内核配置参数 sysctl -a > sysctl.txt 导出对比。

通过对比主要怀疑了以下参数(具体作用大家可网上查阅):

tcp_sack

tcp_fack

tcp_syncookies

tcp_tw_recycle

tcp_retries1

tcp_timestamps

发现tcp_tw_recycle 这个参数二者是不一样的,于是改成一样。对方测试,恢复正常。再关掉,对方测试,重新异常。基本就锁定了这个参数。

tcp_tw_recycle默认是关闭的,有不少服务器,为了提高性能,开启了该选项,在一些高并发的 WebServer上,为了端口能够快速回收,打开了net.ipv4.tcp_tw_recycle。为什么我这里打开了快速回收,对方的服务器就连接异常了呢,仔细对比抓包发现,问题漏出了端倪。

对的,仔细看图只要是异常的,没有回复的syn 包,时间戳都是不对的,默认情况应该是递增的,才会连接正常。再结合对方网络是共用一个Ip做了S-NAT,问题原因找到了。

我方服务器打开了 tcp_tw_reccycle 了,就会检查时间戳,很不幸对方发来的包的时间戳是乱跳的(截图时间字段,准确来讲对方发来的时间戳是滞后的,这样的包我方肯定不会回复),所以服务器就把带了“倒退”的时间戳的包当作是“recycle的tw连接的重传数据,不是新的请求”,于是丢掉不回包,造成大量丢包。

##########################################################################################

疑问:为什么对方发来的时间戳是乱跳的?

通过对比对方的配置sysctl -a 发现,对端开启了tcp_timestamps,而且在我们tcp_tw_recycle被打开了话,会假设对端开启了tcp_timestamps,然后会去比较时间戳,如果时间戳变大了,就可以重用。但是,如果对端是一个NAT网络的话(如:一个公司只用一个IP出公网)或是对端的IP被另一台重用了,这个事就复杂了。建链接的SYN可能就被直接丢掉了(你可能会看到connection time out的错误)(如果你想观摩一下Linux的内核代码,请参看源码tcp_timewait_state_process)。

看到这里问题似乎已经解决了,但是不是,这不是最优的解决方法。因为从目前来看,我们得出两种解决方法:

1,我方关闭tcp_tw_recycle ,不开启回收功能,也就不会检查时间戳,这种包肯定会被响应了。

2.对方关闭tcp_timestamps, 这样发来的报文就不带时间戳。但是这两种方法各有长短优劣。

##########################################################################################

  1. 关闭tcp_tw_recycle ,好处:不能保证所有客户都关闭了tcp_timestamps情况下,可以避免类似问题发生。短处:若负载量高的情况下,web_server 的time_wait 状态量会直线飙升。官方建议是关闭该选项:

##########################################################################################

2.对方关闭tcp_timestamps.好处:问题迎刃而解 短处:查阅rfc 文档,这个tcp 可选字段会造成一些影响。

##########################################################################################

最后显示一个没有timestamp可选字段的报文,实地测试通过,也是正常可用:

有timestamp可选字段的报文:

至此,一场由tcp_timestamps 引发的无解追击案结束了。从这里得出任何事情一定要实事求是,仔细抓包分析,仔细查阅文档,用数据说话。不要整天猜测而不是去实地考察研究,这样只会浪费更多的时间,当然,文章还有很多纰漏之处,毕竟牵扯的技术点太多,望包涵指正。

时间: 2024-09-30 22:55:30

一场由tcp_timestamps 引发的无解追击案的相关文章

GDB实践:一场std::sort引发的coredump

以前只掌握gdb一些基础知识,还没有真正"实战"过.刚好最近同事一个进程coredump了,原因比较深,正好利用这个机会来分析下 // @ 运行:gdb [可执行程序] -c [coredump文件] gdb edu_info_recommend_svr -c core_edu_info_recomm // @ 查看堆栈信息:bt (backtrace) (gdb) bt 10 #0 0x00007fa0809b6144 in __strcmp_sse42 () from /lib64

一场由空格引发的错误数据

背景 有一张单据,某一个字段A异常,开始调错.A的值为 "正常值+""正常值++"  "正常值+++" "正常值++++++"等多了1-N个加号不等 错误数据 原因分析 追踪到数据操作LOG日志,发现添加的时候就是A错误数据.A的值是直接从cookie中获取的,而cookie是登陆时候方法缓存到浏览器的. 由此判断 1.cookie错误 2.提交数据后台解析参数错误 3.不排除 SP(数据操作验证存储过程) 修改.其他修改等

[2001-2003美/新等合拍经典奇幻大片][魔戒1-3][BD-RMVB][中英字幕/1280x720高清晰版]

新西兰, 指环王, 英语, 美国, 大片 ◎译 名 魔戒首部曲:魔戒现身/指环王:护戒使者/指环王:友谊之戒◎片 名 The Lord Of The Rings The Fellowship Of The Ring◎年 代 2001◎国 家 新西兰/美国◎类 别 动作/冒险/幻想◎语 言 英语◎字 幕 中英双字◎IMDB评分 8.8/10  368,289 votes Top 250: #18 ◎文件格式 X264 + AC3◎视频尺寸 1024 x 576/1280 x 720◎文件大小 1C

短线观点:股市就是投机天堂

评论人士无限震惊地发现,针对中国的股票正在上演一场赌博.引发担忧的直接原因是在香港上市的中国太阳能企业汉能薄膜发电(HTF)周三暴跌,以及业务范围囊括育马.金融多个领域的高银集团(Goldin)旗下两家公司股票暴跌.http://issuu.com/bz0e9qqeld http://issuu.com/o9nqsb8ctt http://issuu.com/dddrciu13u http://issuu.com/5rnj7gawtg http://issuu.com/16gurhwzza ht

周鸿祎:需格外注意的五点用户体验

技术人员出身的产品经理非常有潜力,因为他懂技术,跟技术人员能更好的挑选技术方案.但我看到很多技术人员在做产品中犯的一个共同错误,太想要把自己的技术展现给用户,把先进的技术概念给用户. 这就是忘了从用户角度出发,用户到今天,特别是体验时代,什么叫体验时代?在电脑还是即刻时代的时候,电脑越复杂越好,能够输入复杂的指令,但是当一个产业,比如今天苹果都成了街机,电脑已经成了标配情况下,电脑从专家时代进入到大众时代,这时候体验就变得更加重要,用户甚至都不知道苹果用了什么CPU,很多拿苹果的白富美.高富帅不

周鸿祎:如何做好产品经理

我刚才来的时候,会议主办方跟我讲,今天来交流的很多人是设计师.产品经理,据说还有 50 位公司的高管,我今天希望跟大家有一个交流,对很多公司高管来讲,我其实有一个建议,过去这种公司分工特别明确,做一个产品好像变成一个生产线,有人负责策划,称为产品经理,有人负责项目实施,称为项目经理,还有专门做 UE,我后来没搞清 UX 和 UE 怎么区分,曾经有一个大公司跟我讲半天,UX 是用户体验,UE 做 UED,分的非常细,我听了半天,这两个角色至少从我的从业生涯来说,我觉得很难区分,最后可能还有负责做研

技术永不孤独:中国为什么一定要成为世界AI的参与者?

这一次AI的浪潮,或许是中国第一次和整个世界站在了同一个起跑线上,而且这一次我们毫无疑问跑进了第一梯队.此前我们介绍过由O'Reilly和Intel主办的AI Conference,这场集结了全球顶尖AI产业力量的会议选择了四个城市--北京.纽约.旧金山.伦敦. 我们介绍过很多中国的AI产业,也介绍过很多海外的AI产业.但是在这场全球共同的事业中,我们似乎未曾了解过海外AI产业是如何看待中国AI的.他们会把我们看做一个可敬的对手?还是一个莫大的威胁?亦或是最佳的合作伙伴? 外国AI从业者这样看待

4年前淘宝被斥“售假”,马云是这样回应的

拼多多这段时间是当之无愧的舆论主角.7月26日,拼多多在美国纳斯达克上市.上市当天,发行价为19美元,收盘价为26.7美元,大涨40.53%,市值接近300亿美元,成功上市的拼多多成了备受瞩目的明星企业.可惜好景不长,在拼多多上市之后,一场由"假货"引发的舆论风暴正在向拼多多涌来.拼多多"假货"风暴,比预想的来得更早7月27日,一张"拼多多平台上7.5元销售原价888元贝因美红爱加奶粉"的橱窗图开始在网络流传并引起围观,由于价格较低,又涉及假奶粉

4星|《剑桥中国经济史:古代到19世纪》:经济学视角看中国古代史

剑桥中国经济史:古代到19世纪 万志英教授对自青铜时代至20世纪初这3000年间中国经济发展各种制度的基础.延续以及中断进行了详尽而通俗的研究 作者是海外汉学家.全书从经济学的角度重新梳理了中国古代史,有不少独到的视角与细节.比如说对古代史的分期,与我见过的任何一本书的分期都不同,唐朝以安史之乱为节点被拦腰分成两节归入前后两个时期,前半部分划入从北魏成熟期开始的中国再统一时期,后半部分到北宋灭亡属于第一次经济转型期. 书中涉及到大量历史书上不太提及的经济学问题,比如人民收入水平,粮食价格,实际的