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定时器,延迟断开连接发现的主要内容,如果未能解决你的问题,请参考以下文章

13.TCP的超时与重传

《TCP/IP具体解释》读书笔记(21章)-TCP的超时与重传

TCP 的超时与重传

TCP定时器

TCP定时器

每个发送的TCP数据包是否有一个重传定时器?