【发布时间】:2011-04-23 21:07:27
【问题描述】:
更新:如果您想省去冗长的序言,请跳至答案。
TCP/IP 连接 KeepAlive 被指定为至少每两个小时一次:https://www.rfc-editor.org/rfc/rfc1122#page-101。问题是这是在 1989 年编写的,并且担心发送额外的 KeepAlive 数据包的成本!然而,它仍然是大多数操作系统根据规范在一段时间不活动后通过连接的套接字发送 KeepAlives 的默认时间!当然,现在大多数连接在此之前超时,如果不活动,并且如果通过 Internet 连接到对等点,那么在您不知情的情况下,连接就会在此之前死掉(尽管设置的超时高于此值 - 我怀疑是因为中间的路由器表不会打扰保留它还活着 - 我一直想知道泄露的最后一条消息去了哪里... 更新: 原因是可能在您或远程主机端的“路由器”是“有状态的”并且可以感知连接并且在一段时间不活动后断开连接-您通过Internet经过的路由器无法断开您的连接-他们不在乎-数据包只是发送到它必须去的地方)。因此,我看到了 2 种常见的解决方案来保持 Internet 上的连接:
- 忽略(编辑: 已向我指出,这并没有忽略规范,它只是更改了默认值)规范并将系统范围内的 KeepAlive 间隔更改为低于 2 小时,或者2) 实施您自己的“KeepAlive”系统,定期轮询对等方。
不管怎样;什么是合适的(发送 KeepAlive 的不活动时间)?我已经看到了从 1 秒到默认 2 小时的所有内容。似乎这个数字已经被吸走了......如果我有一个可能从世界任何地方连接的客户端应用程序,那么什么是安全和合理的时期(我想要一个单一的持久连接)?通过互联网连接到世界另一端的许多跳远的对等点,连接在 301 秒后终止(尽管您只有在尝试发送某些内容时才知道)所以将周期设置为 300 秒似乎是一个神奇的数字 -我在死亡前 1 秒获得了 KeepAlive - 这个间隔从来没有让我失望过……但它安全吗?
编辑:这个特殊的连接是在 C# 3.0 中实现的,所以欢迎使用代码。
【问题讨论】:
-
大多数与 TCP 相关的超时是 90 秒,所以我会每 60 秒发送一次保活
-
谢谢,但我需要的不仅仅是这些 - 你有任何例子吗?在我的情况下,5 分钟(300 秒)似乎很好,我很难想象什么时候需要少于这个时间(因为我连接到世界的另一端),也许是拨号 - 在这种情况下我需要让 KeepAlive 有更多时间在发送后到达对等方...
-
我想很清楚,路由器不持有 TCP 连接,它不关心,它对任何连接都没有状态。纯路由功能仅查看 IP 标头(第 3 层)以查看数据包的去向,并且它的路由表是预先计算的。包括 NAT(包括在家庭“路由器”上)和防火墙在内的全状态节点可能会感知连接,并且每个节点都有自己的超时。在几乎任何网络上,保持活动的流量都很小。但是,不要在移动网络上将此设置得太低,因为它会浪费大量资源。
-
谢谢,这清楚了很多-这将其范围缩小到我的设备必须比外部连接保持不活动的本地连接更长的时间-这解释了为什么在他们的客户端部署到外部之前不会遇到这些问题..如果您将其放入答案中,我可以将其标记为答案.. 谢谢!
-
@Kevin:你也知道家庭用户有状态的节点通常会在多长时间后断开 TCP 连接?