【发布时间】:2016-10-21 10:32:18
【问题描述】:
我需要在任何连接上启用 TCP keepalive,现在我正在努力处理我们测试用例的结果。我认为这是因为我不太了解何时发送第一个 keepalive 探测。我在 Linux 上 tcp_keepalive_time 的文档中阅读了以下内容:
最后一个数据包发送(简单的ACKs不被认为是数据)和第一个keepalive探测之间的间隔;之后 连接被标记为需要保持活动,此计数器未使用任何 进一步
其他一些消息来源指出这是连接空闲的时间,但他们没有进一步定义这意味着什么。我还研究了史蒂文斯以找到一个更正式的定义,因为我想知道在考虑重传时“发送的最后一个数据包”实际上意味着什么。
在我的测试用例中,我有一个连接,其中数据仅以相当高的速率从服务器发送到客户端。为了测试 keepalive,我们拔掉了客户端 NIC 上的电缆。我现在可以看到网络堆栈尝试发送数据并进入重传状态,但没有发送保持活动探测。重传时不发送keep alive探针是否正确?
【问题讨论】:
-
如果您“以相当高的速率发送”,那么您的“启用 TCP keepalive”的要求一开始就没有意义。
-
@EJP 我们还有其他连接,例如不要发送任何数据,以及仅以低速率发送的其他数据。此外,这是客户直接对我们提出的要求。他们在全球范围内使用它。
-
我假设您指的是在所有连接上设置 SO_KEEPALIVE(默认为“关闭”)?如果是这样,您只会在之后看到一个 keepalive 数据包(Linux 上的默认值为 2 小时),但拔出技巧应该可以工作(如果它没有发送其他数据)。
-
@rogerdpack 是的,我们必须在默认情况下启用所有连接上的保持活动作为客户的强制性要求。直到发送第一个保持活动数据包的时间还包括 TCP 重试时间。 cnicutar 的回答提供了详细信息。
标签: linux sockets tcp keep-alive retransmit-timeout