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