TCP重传定时器覆盖/杀死TCP keepalive定时器,延迟断开连接发现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP重传定时器覆盖/杀死TCP keepalive定时器,延迟断开连接发现相关的知识,希望对你有一定的参考价值。
机器 - linux,3.10.19内核
这是在一个大型分布式系统中,有几个服务器和客户端(在同一个以及不同的节点/机器上)彼此之间有TCP连接。
测试用例: 客户端程序节点/机器被关闭(故意,测试用例),服务器知道断开连接的唯一方法是通过keepalive定时器(空闲时间= 40秒,4个探测器,探测时间= 10秒)。
好案例: 这在大多数情况下工作正常,服务器知道客户端在[40,70]秒内出现故障。
不好的情况: 但是我遇到另一个独特的情况,当keepalive定时器运行时,服务器尝试向客户端发送一些数据,这反过来启动TCP重传定时器,它会覆盖/杀死keepalive定时器。重传定时器需要大约15分钟才能检测到另一端不再存在。
15分钟是服务器实现这一点的大量时间。我正在寻找别人处理这种情况的方法。我是否需要调整重传计时器值?
谢谢!
重传超时有一个完全独立的配置。
来自Linux的tcp.7 man page:
tcp_retries2(整数;默认值:15;自Linux 2.2起)
放弃之前TCP数据包在已建立状态下重新传输的最大次数。默认值为15,对应于大约13到30分钟的持续时间,具体取决于重新传输超时。 RFC 1122指定的最小限制为100秒通常被认为太短。
这可能是您需要调整的值,以更改检测连接是否消失所需的时间。
我对linux内核版本4.3.0-1-amd64也有同样的问题:
- 我使用了连接到同一台交换机的服务器和客户端。
- 在以下情况下,TCP保持活动机制可以正常地为客户端和服务器工作: 当电缆断开和插座断开之间没有发送消息时(通过tcp keep-alive mecanism)。 即使客户端/服务器应用程序尝试发送消息,当客户端/服务器和交换机(将链路状态设置为关闭)之间的电缆断开连接时。
- 当交换机另一侧的电线被拔掉时,TCP Keep-Alive帧将被传输,直到发送一条应用消息。然后,发送TCP重传帧并停止发送TCP保持活动帧,这将阻止套接字关闭。
以上是关于TCP重传定时器覆盖/杀死TCP keepalive定时器,延迟断开连接发现的主要内容,如果未能解决你的问题,请参考以下文章