0

机器 - linux,3.10.19 内核

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

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

好的案例:
这在大多数情况下都可以正常工作,服务器会在 [40,70] 秒内知道客户端已关闭。

坏情况:
但是我遇到了另一种独特的情况,即当保活计时器运行时,服务器尝试向客户端发送一些数据,这反过来又启动了覆盖/终止保活计时器的 TCP 重传计时器。重传计时器需要大约 15 分钟才能检测到另一端不再存在。

15 分钟对于服务器来说是很长的时间来实现这一点。我正在寻找其他人如何处理这种情况的方法。我需要调整我的重传计时器值吗?

谢谢!

4

2 回答 2

1

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

从 Linux 的tcp.7 手册页

tcp_retries2(整数;默认值:15;从 Linux 2.2 开始)

TCP 数据包在放弃前在已建立状态下重传的最大次数。默认值为 15,对应的持续时间大约在 13 到 30 分钟之间,具体取决于重传超时。RFC 1122 指定的 100 秒的最小限制通常被认为太短。

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

于 2015-11-07T01:33:20.377 回答
0

我对 linux 内核版本 4.3.0-1-amd64 有同样的问题:

  • 我使用了一个服务器和一个客户端,连接到同一个交换机。
  • TCP keep-alive 机制在以下情况下对客户端和服务器正常工作:

    • 当电缆断开和套接字断开之间没有消息发送时(通过 tcp keep-alive 机制)。
    • 即使客户端/服务器应用程序尝试发送消息,客户端/服务器和交换机(将链接状态设置为关闭)之间的电缆断开连接。
  • 当交换机另一侧的电线被拔出时,TCP Keep-Alive 帧会被传输,直到应用消息被发送。然后,发送 TCP Retransmission 帧并且停止发送 TCP keep-alive 帧,从而防止套接字关闭。

于 2017-12-21T07:51:32.257 回答