TCP_KEEPIDLE应该低于TCP_KEEPINTVL吗?

时间:2017-01-15 17:57:36

标签: c linux sockets ubuntu tcp

我正在使用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,或者它是否是错误?

感谢。

1 个答案:

答案 0 :(得分:0)

以下是我的观察

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 操作系统中,我观察到TCP_KEEPIDLE 和TCP_KEEPINTVL 之间存在关系。 TCP_KEEPIDLE 不能低于 TCP_KEEPINTVL。我认为这是一个错误。