TCP 保持活动参数不被遵守

TCP 保持活动参数不被遵守

我的 Linux 机器上运行着一台服务器,也在该服务器上运行了以下命令:

$ cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
$ cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
$ cat /proc/sys/net/ipv4/tcp_keepalive_probes
9

我的服务器侦听端口 58080,并且我在代码中设置了 TCP keep-alive 并在其上创建了一个连接。然后我设置 Wireshark 跟踪此连接;输出的屏幕截图如下所示:

数据包

您可以看到第一个 keep-alive 数据包在 7200 秒后发送,即预期的 2 小时(“tcp_keepalive_time”的值)。不过,我还希望每个探测在 75 秒时发送(“tcp_keepalive_intvl”的值);但我看到每个探测都是在 2 小时内发送的。

有人可以告诉我为什么我的“tcp_keepalive_intvl”配置选项没有得到遵守吗?

更新

似乎指定大于保持活动时间的保持活动间隔会导致遵守间隔时间......

答案1

在与一位超级聪明的同事讨论后,我们认为我们已经找出了问题所在,但尚未证明这一点。可能发生的情况是,仅当未收到保持活动 ACK 时才考虑保持活动间隔。因此,2 小时后,如果没有收到第一个保持活动数据包的 ACK,则将在 75 秒后发送第二个数据包,并以 75 秒的间隔重复发送,直到收到 ACK。

事实证明,只有当间隔大于保持活动时间时才考虑间隔,这是由于 Linux 保持活动机制的工作方式所致,如上所述我的另一个问题

答案2

确实,从文档

tcp_keepalive_time

最后发送的数据包(简单的 ACK 不被视为数据)与第一个保活探测之​​间的间隔;连接被标记为需要保持活动后,该计数器不再使用

tcp_keepalive_intvl

后续保活探测之​​间的间隔,无论连接同时交换了什么

tcp_keepalive_probes

在考虑连接死亡并通知应用程序层之前要发送的未确认探测的数量

相关内容