最近本着变被动为主动,将事后提前到事前,开展了一些典型问题排查活动。发现了一个锁的问题,问题改了之后上设备验证。上去把自己平时录得自动化脚本一跑,哎呦我x,怎么老是5分钟断一次链路,从未出现过啊。有规律必现问题,肯定是低级问题。把现象给一个兄弟说了之后,自己又去干其他事了。
兄弟看了很久的代码说没有问题。赶紧一起把流程排查了一遍,确实没有问题。开始加打印+抓包。
加了打印发现1s一次的心跳包,接近10s内一个包都没有,之后突然上来接近10个包。
tcp抓包发现,有些tcp包出现了重传,中间还夹带了ARP报文。后面突然一个大报文,这个报文带着F的flag,表示已经close了这条连接。
结论: 1. 心跳为1s一次,期间tcp连接出现过10s左右异常,tcp协议栈无法发现,但是被应用的保活报文发现,主动关闭了该连接。
2. tcp连接恢复的一瞬间,1s一次累积在协议栈缓冲区的报文,被tcp一次发送,从而导致远端突然接受到接近10条的报文。
怀疑有人在协议栈干坏事了,从未有问题的环境,成了一个必现问题。
如果不是被应用心跳发现tcp连接有短时间的异常,这种现象应该就是tcp粘包吧。
阅读(3914) | 评论(0) | 转发(0) |