【问题标题】:idle TCP timeout for US carriers (or any carrier for that matter)美国运营商(或任何运营商)的空闲 TCP 超时
【发布时间】:2011-07-31 05:38:57
【问题描述】:

据我了解,运营商会删除任何空闲了几分钟的 tcp 连接。这就是为什么如果您想保持从客户端到后端的持久 tcp 连接,您必须双向发送 keep-alive。

我的问题是:保持活动的间隔应该是多少?

【问题讨论】:

    标签: android tcp timeout


    【解决方案1】:

    需要明确的是,除了端点之外,没有人可以删除 TCP 连接。这是因为 IP 网络协议是网络所能看到的一切,而且它在设计上是无状态的。

    然而,“终点”可能不是您所期望的。运营商可以在两者之间放置一个透明代理或具有 NAT 的路由器,此时它们确实需要保持状态才能正确转发数据。

    NAT 是您最大的问题,因为它更常见,如果路由器由于一段时间没有看到流量而决定放弃连接状态,并且端点在下一次尝试发送数据之前永远不会知道。

    启用SO_KEEPALIVE 的默认值为2 小时。因此,一个表现良好的路由器应该至少保持状态这么长时间,但不要把农场押在它上面。

    要回答您的具体问题...如果是我,我会用 15 分钟或更短的时间。

    请注意,只有一侧需要通过重新发送数据流的最后 1 个字节来发送保持活动状态,就好像它在网络上丢失一样。接收者丢弃它,因为它已经看到它,但会发送一个新的 ACK 作为回复,从而导致双向流量。

    【讨论】:

    • 但是 SO_KEEPALIVE 不容易配置
    • int 延迟 = X; setsockopt(sockfd,SOL_TCP,TCP_KEEPIDLE,&delay,sizeof(delay));整数计数 = X; setsockopt(sockfd,SOL_TCP,TCP_KEEPCNT,&count,sizeof(count));整数间隔 = X; setsockopt(sockfd,SOL_TCP,TCP_KEEPINTVL,&interval,sizeof(interval));诠释启用 = 1; setsockopt(sockfd,SOL_SOCKET,SO_KEEPALIVE,&enable,sizeof(enable));
    【解决方案2】:

    只有损坏的 NAT 才需要这样做。 AIUI,一个明智的 NAT 可以在需要检查活跃度时向连接的两端发送 TCP keepalive,并在足够多的连接无法引发响应时​​断开连接。

    唉,很多/大多数 NAT 都坏了。

    FWIW,iOS 的“多任务处理”具有“voip”功能,如果您的套接字接收到数据,或者可选地以近似的时间间隔(例如 keepalives),它将取消暂停您的应用程序;最小间隔大约是 300 秒,所以 300-1200 之间的时间可能会起作用。

    【讨论】:

      【解决方案3】:

      由于我不知道您保持连接活跃的具体原因,即使显然没有任何通信流量,过去 5 分钟是与几家美国运营商(其他有它更长)。不过,您应该知道他们可以随时更改此值,因此,如果您的应用程序将其作为其功能的一部分,那么如果您选择这样做,您可能会觉得很有趣。

      仅供参考...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-12
        • 2011-05-16
        • 2018-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多