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