我正在使用C中的套接字(在Ubuntu上),我想用setsockopt
测试一些选项。
当我想测试 Keep Alive 选项时:TCP_KEEPIDLE
和TCP_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
,或者它是否是错误?
感谢。
答案 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。我认为这是一个错误。