【发布时间】:2011-07-31 05:38:57
【问题描述】:
据我了解,运营商会删除任何空闲了几分钟的 tcp 连接。这就是为什么如果您想保持从客户端到后端的持久 tcp 连接,您必须双向发送 keep-alive。
我的问题是:保持活动的间隔应该是多少?
【问题讨论】:
据我了解,运营商会删除任何空闲了几分钟的 tcp 连接。这就是为什么如果您想保持从客户端到后端的持久 tcp 连接,您必须双向发送 keep-alive。
我的问题是:保持活动的间隔应该是多少?
【问题讨论】:
需要明确的是,除了端点之外,没有人可以删除 TCP 连接。这是因为 IP 网络协议是网络所能看到的一切,而且它在设计上是无状态的。
然而,“终点”可能不是您所期望的。运营商可以在两者之间放置一个透明代理或具有 NAT 的路由器,此时它们确实需要保持状态才能正确转发数据。
NAT 是您最大的问题,因为它更常见,如果路由器由于一段时间没有看到流量而决定放弃连接状态,并且端点在下一次尝试发送数据之前永远不会知道。
启用SO_KEEPALIVE 的默认值为2 小时。因此,一个表现良好的路由器应该至少保持状态这么长时间,但不要把农场押在它上面。
要回答您的具体问题...如果是我,我会用 15 分钟或更短的时间。
请注意,只有一侧需要通过重新发送数据流的最后 1 个字节来发送保持活动状态,就好像它在网络上丢失一样。接收者丢弃它,因为它已经看到它,但会发送一个新的 ACK 作为回复,从而导致双向流量。
【讨论】:
只有损坏的 NAT 才需要这样做。 AIUI,一个明智的 NAT 可以在需要检查活跃度时向连接的两端发送 TCP keepalive,并在足够多的连接无法引发响应时断开连接。
唉,很多/大多数 NAT 都坏了。
FWIW,iOS 的“多任务处理”具有“voip”功能,如果您的套接字接收到数据,或者可选地以近似的时间间隔(例如 keepalives),它将取消暂停您的应用程序;最小间隔大约是 300 秒,所以 300-1200 之间的时间可能会起作用。
【讨论】:
由于我不知道您保持连接活跃的具体原因,即使显然没有任何通信流量,过去 5 分钟是与几家美国运营商(其他有它更长)。不过,您应该知道他们可以随时更改此值,因此,如果您的应用程序将其作为其功能的一部分,那么如果您选择这样做,您可能会觉得很有趣。
仅供参考...
【讨论】: