【问题标题】:should TCP_KEEPIDLE be lower than TCP_KEEPINTVL?TCP_KEEPIDLE 是否应该低于 TCP_KEEPINTVL?
【发布时间】:2017-05-30 14:00:27
【问题描述】:

我正在使用 C 中的套接字(在 Ubuntu 上),我想使用 setsockopt 测试一些选项。

当我想测试 Keep Alive 选项时:TCP_KEEPIDLETCP_KEEPINTVL(都来自 IPPROTO_TCP 家族),我注意到了这种奇怪的行为:

预期行为 当我将 TCP_KEEPIDLE 设置为 1(秒)和 TCP_KEEPINTVL 设置为 3 时,Keep Alive 探针在空闲时间 1 秒后开始发送,然后每 3 秒发送一次。

意外行为 但是当我将TCP_KEEPIDLE 设置为 3,TCP_KEEPINTVL 设置为 1 时,也会每 3 秒发送一次探测(而不是 1),因此间隔是空闲时间,而不是我专门设置的时间。

是否有任何规范或文档说TCP_KEEPIDLE 总是低于或等于TCP_KEEPINTVL,或者它是一个错误?

谢谢。

【问题讨论】:

  • 无论如何,请将这些计时器至少乘以十。它们短得离谱。
  • 这不是问题。使用 Wireshark,我可以清楚地看到时机,并且差异非常显着。请记住,这不是出于实际目的,仅用于测试选项。
  • 远程主机是否向keepalive发送ack?我正在解决同样的问题,并且我怀疑,如果出现您描述的意外行为,keepalive 的确认被视为套接字活动。
  • @MirkoBanchi 那是将近 4 年前的事了,所以我不太记得了。 IIRC,ACK确实是即时发送的。套接字可能会认为 Keepalive 探测处于活动状态,从而重置空闲计时器,然后等待通过TCP_KEEPIDLE 设置的时间过去。这可以解释 3 秒间隔而不是 1 秒,但是文档似乎对标志之间的交互作用太浅了。我想我必须深入研究 Unix 的代码,但我不敢说我​​能看懂。

标签: c linux sockets ubuntu tcp


【解决方案1】:

以下是我的观察

TCP_KEEPIDLE 在连接空闲时出现。 TCP_KEEPIDLE 用于在连接空闲时发送 keepalive 探测。在这里,空闲连接意味着没有数据从客户端发送到服务器。因此,如果 TCP_KEEPIDLE 设置为 120 秒,则服务器将在 120 秒后向客户端发送 keepalive 探测。

TCP_KEEPINTVL 和 TCP_KEEPCNT 在连接中断时出现。 现在,让我们假设连接由于网络故障而中断。网络故障可以通过在客户端移除 LAN 电缆来产生。现在,服务器将在“TCP_KEEPINTVL * TCP_KEEPCNT”之后关闭连接。因此,如果 TCP_KEEPINTVL 为 75(这是 linux 上的默认值)并且 TCP_KEEPCNT 是 9(这是 linux 上的默认值),服务器将在 75 秒后发送 9 个探针,并在没有响应时关闭连接。


TCP_KEEPIDLE 和 TCP_KEEPINTVL 的关系

Qnx OS 中,我观察到 TCP_KEEPIDLE 和 TCP_KEEPINTVL 之间没有关系。 TCP_KEEPIDLE 可以低于 TCP_KEEPINTVL。

Linux OS 中,我观察到 TCP_KEEPIDLE 和 TCP_KEEPINTVL 之间存在关系。 TCP_KEEPIDLE 不能低于 TCP_KEEPINTVL。我认为这是一个错误。

【讨论】:

  • 感谢您花时间写下您的答案。然而,这并不能回答问题。我遇到的问题是TCP_KEEPIDLETCP_KEEPINTVL 之间的关系。如果您阅读有关我的问题的 cmets,您会发现这里的主要怀疑是 keep-alive 探针被视为活动,因此重置空闲时间,使 TCP_KEEPINTVL 无用。但是我找不到任何文档或源代码,所以我无法根据假设进行计划。
  • 我更新了我的评论。而且我相信您提到的这种情况是一个错误。
猜你喜欢
  • 2014-04-23
  • 2019-01-02
  • 2015-11-24
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
相关资源
最近更新 更多