【问题标题】:Do I need to `ping` connected websocket connections?我需要“ping”连接的 websocket 连接吗?
【发布时间】:2016-04-21 00:20:14
【问题描述】:

我想在未定义的时间内保持 Websocket 连接处于活动状态。理想情况下,套接字会每隔一段时间发送一次数据,但这并不能保证,而且我也不想做出假设,因为用户可能处于空闲状态。

我有一个存储对所有 websocket 连接的引用的对象。我是否适合每 x 分钟安排一次功能?秒?基本上遍历所有连接,对它们执行 ping 操作,然后丢弃那些没有收到 pong 的连接?还是我需要启用一个自动保持连接活动的标志?

我在服务器上使用 ws 库,但在客户端本地创建 websocket 连接。

【问题讨论】:

  • 我反对这个。如果某些负责连接中间的路由器或其他设备的网络管理员认为通过它的连接非常宝贵,可以丢弃,那么您真的没有必要欺骗他/它不这样做。无论如何,您实际上无法阻止它的发生:您仍然必须处理断开的连接;那么好处在哪里呢?值得注意的是,大约是地球上最常用的应用程序协议 HTTP 并没有这样做。
  • 那么您将如何排除陈旧的连接?在这种情况下,陈旧意味着它们没有发出关闭事件,但不再可用。
  • socket.io(使用 webSocket 连接)添加了一个常规 ping 来检测过时的连接并帮助防止网络基础设施超时非活动连接。添加自己是非常可行的(webSocket 协议甚至定义了 ping 和 pong 数据包),或者您可以在客户端和服务器上使用 socket.io,它会为您完成。

标签: sockets tcp websocket


【解决方案1】:

在客户端,没有什么好方法可以知道从客户端机器到目标服务器的网络路径中有多少代理、防火墙、NAT 等。。其中任何一个都可以有自己独立的空闲计时器。使用 TCP keepalive可能有效,但用于从您的客户端到下一个跃点的 TCP 会话 - 实际上可能是也可能不是最终服务器。

鉴于上述情况,我建议,您应该定期 ping 您连接的 WebSocket 会话。从通过网络中间盒(可能是复杂的)链保持连接活跃的角度来看,您是否从服务器接收 pong 是无关紧要的;您只是想确保路径上的所有东西都能看到一些流量,以便重置它们的空闲计时器。

显然,您希望在 ping 连接的 WebSocket 会话的频率与产生的开销之间进行权衡;例如,每 1 秒 ping 一次会有点多。您可能需要一些微调来通过实验确定适合您需要的 ping 间隔。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多