工作记录 - Linux 的socket TCP keep-alive功能在特定情况下失效的原因

55 篇文章 1 订阅
54 篇文章 0 订阅

问题

TCP socket keep-alive 失败,导致正在进行的业务失败。

分析

根据数据报文发现,每次tcp ack keep-alive数据报文请求发送后如果发送别的数据,就会出现socket超时, 判断是内核处理tcp keepalive出现问题导致的。

问题重现

我根据这种情况,实现了一个类似的socket,发送keep-alive然后在程序中sleep特定时间,然后发送数据,模拟紧跟着的情况,在正常Linux系统中是没有问题的,但是到了我们的设备中就出现问题了。

原因

Linux 发送keep-alive request的ack会有一个flag记录发送状态,如果收到了响应这个flag会被重置。这样在keep-alive timer到期后检测就不会出现问题,然而我们的内核中如果紧接着又数据报文发送,收到的ack会走另一条路径,这个flag不会被重置,导致的问题。

解决方案

就是将这个flag移到前面,不论收到的是正常的ack还是tcp keep-alive的ack都重置这个flag.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钱国正

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值