我需要对已连接的WebSocket 进行'ping'吗?

4
我希望保持Websocket连接的存活时间不确定。套接字理想情况下会定期发送数据,但这并不保证,而且我也不想做出假设,因为用户可能处于空闲状态。
我有一个对象来存储所有Websocket连接的引用。我是否应该每隔x分钟或秒钟安排一个函数?基本上遍历所有连接,ping它们,然后丢弃那些没有收到pong的连接?还是需要启用自动保持连接的标志?
我在服务器上使用ws库,但在客户端本地创建websocket连接。

1
我反对这个。如果一些网络管理员负责中间连接的某个路由器或其他设备,已经决定通过它的连接足够重要而被丢弃,那么你真的没有必要试图欺骗他/它不这样做。无论如何,你实际上无法阻止它发生:你仍然必须处理丢失的连接;那么好处在哪里?值得注意的是,HTTP是大约全球使用最广泛的应用协议,它并不这样做。 - user207421
那么,你会如何排除过时的连接呢?在这里,“过时”意味着它们尚未发出关闭事件,但已不可用。 - naughty boy
socket.io(使用webSocket连接)添加了定期ping以检测陈旧的连接,并帮助保持网络基础设施不会超时非活动连接。这很容易自己添加(webSocket协议甚至定义了ping和pong数据包),或者您可以在客户端和服务器上使用socket.io,它将为您完成此操作。 - jfriend00
1个回答

4

在客户端到目标服务器的网络路径中,您无法很好地知道有多少个代理、防火墙、NAT等存在。其中任何一个都可能有自己单独的空闲计时器。使用TCP keepalive可能会起作用,但仅适用于从客户端到下一跳的TCP会话,这可能实际上并不是最终服务器。

基于上述原因,我建议,您应该定期ping已连接的WebSocket会话。从保持连接的角度来看,从服务器收到pong与否都不重要;您只需确保路径上的所有设备看到某些流量以重置它们的空闲计时器。

显然,您需要权衡每隔多长时间ping已连接的WebSocket会话与产生的开销之间的关系;例如每1秒ping一次会有点过分。您可能需要进行一些微调,通过实验确定适合您需求的ping间隔。

希望这有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接