TCP KeepAlive(套接字选项SO_KEEPALIVE
)由三个选项控制——机制触发的时间、探测间隔和连接被声明断开之后的失败探测数。
它们的默认值是:
- tcp_keepalive_time = 7200
- tcp_keepalive_intvl = 75
- tcp_keepalive_probes = 9
在 1¼ 分钟后发送探测听起来很合理,在 9 次失败探测后声明失败也是如此,但初始时间为2 小时背后的想法是什么?
甚至tcp(7)说
请注意,底层连接跟踪机制和应用程序超时可能要短得多。
启用 keepalive 的主要目的是防止任何有状态的网络元素丢弃状态信息,但这些元素往往会在几分钟内丢弃连接。对于一些速率受限的服务器,curl
用short--keepalive-time
似乎可以显着提高下载的可靠性。
那么为什么默认这么长呢?
TCP Keep-alive 是在防火墙的概念(更不用说状态防火墙或 NAT)可能还没有普及的时候定义的。来自RFC 1122(1989 年 10 月):
[...]
当时的主要思想不是关于丢失状态信息:
[...]
我浏览了更新的 RFC,但不能很好地提及保持活力。