持久 TCP 连接、长时间超时和 IP 跳跃移动设备

Posted

技术标签:

【中文标题】持久 TCP 连接、长时间超时和 IP 跳跃移动设备【英文标题】:Persistent TCP connections, long timeouts, and IP hopping mobile devices 【发布时间】:2010-10-19 15:32:42 【问题描述】:

我们有一个基于 HTTP 的长轮询方案的应用程序(尽管这个问题可能适用于任何基于 TCP 的协议)。我们的超时时间相当长,大约 30 分钟。

我们有时会看到移动设备相当频繁地从 IP 跳到 IP,每分钟左右,这会导致数十个长寿命套接字堆积在服务器上。不禁想到这会造成不必要的负担。

所以我猜测某些 IP 网关在设备跳出时关闭连接方面比其他网关更好。我能想到的解决这个问题的策略是:

减少超时(延长设备的电池寿命) 当用户重新连接时关闭最后一个活动连接(需要 cookie 或用户 ID 跟踪)

还有其他人吗?

【问题讨论】:

【参考方案1】:

我会考虑在您的服务器中使用 cookie 或某种 ID 关闭最后一个活动连接。是的,这是更多的工作,但是一旦用户跳转地址,您就可以找到旧的套接字并清理资源。绑定到用户名或类似的东西应该相当容易。

即使用户设备没有跳跃地址,您也可能遇到的另一个问题是,某些移动网络,也许您自己的网络可能有一个状态防火墙,它会清理未使用的套接字,这将导致连接问题,因为新连接将再次需要 syn/syn-ack。如果您注意到连接问题,请记住一些事情。

如果你决定玩keep alives,请不要太咄咄逼人,健谈的应用程序是移动网络的瘟疫,而那些在失去与服务器的连接时敲击网络的应用程序可能会导致各种问题网络(如果承运人流行,你也可以)。至少有一种回退机制来重试连接,甚至可能试图找出设备每分钟切换 IP 地址的原因。如果它运行正常,则不应发生。

***我在加拿大的一家移动运营商工作,但是,我的 cmets 并不反映我雇主的职位。

【讨论】:

我有点担心保活,因为任何数据活动都会唤醒收音机——这就是我将其设置为 30 分钟的原因。也不确定如何处理防火墙超时,不会轻易在服务器上注意到它:( @sehugg 在您所在的网络上,设备是否获得公共 IP 地址?如果是这样,我见过的一种成功的方法是当设备获得 IP 地址时,它向服务器注册,然后只监听传入的连接,当有人需要它时,服务器连接到设备。但是,运营商对此并不十分支持,可能会将其锁定。另一种方法是向设备发送短信,让你的设备拦截短信以唤醒应用程序做某事。 我没有运气连接到设备 - 用 UDP 尝试过一次。现在我明白了 Apple 的 APNS 和 Google 的 C2DM 等服务的价值 :) @sehugg 这些绝对是有价值的,但我从未看过它们以了解它们是如何工作的,因此它们可能会遇到一些类似的问题。我唯一知道它是如何工作的并且绝对可靠的是 Rim Relay 网络,在那里他们可以与无线运营商网络建立私人连接,并且可以在没有防火墙和干扰的情况下向设备发送数据。 Apple / Google 系统可能会使用非常相似的长民意调查,我认为这不是理想的,但我从来没有去拍摄过这些设备中的任何一个。【参考方案2】:

如果可以,请在套接字上打开 TCP keepalive,并给它们一个相当低的计时器(例如每 1-5 分钟)。只要您从套接字读取,您就会更快地检测到无法访问的对等点 - 并且与减少 30 分钟的应用程序超时相比,手机上的资源利用率更少。

【讨论】:

keepalive 不会像我们通过套接字发送数据一样减少设备的电池消耗吗? 是的,但不如在应用程序中处理它。

以上是关于持久 TCP 连接、长时间超时和 IP 跳跃移动设备的主要内容,如果未能解决你的问题,请参考以下文章

TCP长时间IDLE操作系统会清除连接么

如何配置套接字连接超时

如何配置套接字连接超时

为啥没有网络连接时 Alamofire 需要这么长时间才能超时?

如何使用 python 烧瓶防止 230 秒 azure 网关超时以进行长时间运行的工作负载

mysql长时间不操作会不会连接超时?怎么改?