TCP重新传输计时器覆盖/杀死TCP keepalive计时器,延迟断开连接发现

时间:2015-11-05 19:43:10

标签: linux sockets tcp keep-alive retransmit-timeout

机器 - linux,3.10.19内核

这是在一个大型分布式系统中,有几个服务器和客户端(在同一个以及不同的节点/机器上)彼此之间有TCP连接。

测试案例
客户端程序节点/机器被关闭(故意,测试用例),服务器知道断开连接的唯一方法是通过keepalive定时器(空闲时间= 40秒,4个探测器,探测时间= 10秒)。

好案例
这在大多数情况下工作正常,服务器知道客户端在[40,70]秒内出现故障。

不好的情况:
但是我遇到另一个独特的情况,当keepalive定时器运行时,服务器尝试向客户端发送一些数据,这反过来启动TCP重传定时器,它会覆盖/杀死keepalive定时器。重传定时器需要大约15分钟才能检测到另一端不再存在。

15分钟是服务器实现这一点的大量时间。我正在寻找别人处理这种情况的方法。我是否需要调整重传计时器值?

谢谢!

2 个答案:

答案 0 :(得分:0)

重传超时有一个完全独立的配置。

来自Linux的tcp.7 man page

  

tcp_retries2(整数;默认值:15;自Linux 2.2起)

     

重新传输TCP数据包的最大次数                 在放弃之前建立的国家。默认值为15,即                 对应的持续时间约为13至30分钟,                 取决于重传超时。 RFC 1122指定                 通常认为最短100秒的限制太短。

这可能是您需要调整的值,以更改检测连接是否消失所需的时间。

答案 1 :(得分:0)

我对linux内核版本4.3.0-1-amd64:

也有同样的问题
  • 我使用了连接到同一台交换机的服务器和客户端。
  • 在以下情况下,TCP保持活动机制正常对客户端和服务器起作用:

    • 当电缆断开和插座断开之间没有发送消息时(通过tcp keep-alive mecanism)。
    • 即使客户端/服务器应用程序尝试发送消息,当客户端/服务器和交换机(将链路状态设置为关闭)之间的电缆断开连接时。
  • 当交换机另一侧的电线被拔掉时,TCP Keep-Alive帧将被传输,直到发送一条应用消息。然后,发送TCP重传帧并停止发送TCP保持活动帧,这将阻止套接字关闭。