websockets必须有心跳吗?

Posted

技术标签:

【中文标题】websockets必须有心跳吗?【英文标题】:Must websockets have heartbeats? 【发布时间】:2017-09-08 08:09:00 【问题描述】:

当我阅读 websockets 时,通常会提到心跳是必须具备的。 MDN 甚至写了一个special opcode for heartbeats。

但是心跳是 websocket 的必需部分吗?我是否必须实现它,否则我的 websocket 将被浏览器或其他标准终止?

【问题讨论】:

Websocket 的使用非常广泛,因此心跳或 ping/pong 的概念更多的是对最佳实践的建议,而不是任何强制性的建议。 【参考方案1】:

RFC 6455,WebSocket 协议的当前参考,定义了一些控制框架来传达有关 WebSocket 的状态:

关闭:0x8 平:0x9 乒乓:0xA

Ping 和 Pong 用于 heartbeat 并允许您检查客户端是否仍然响应。请参阅下面的quote:

Ping 帧既可以用作保持连接,也可以用作 验证远程端点是否仍然响应。

但是当客户端收到 Ping 时,必须将 Pong 发送回服务器。见quote:

在收到 Ping 帧后,端点必须发送 Pong 帧 响应,除非它已经收到关闭帧。它应该 尽快回复 Pong 框架。

底线

在设计客户端和服务器时,是否支持心跳取决于您。但如果您需要检查连接是否仍然存在,Ping 和 Pong 帧是执行此操作的标准方法。

请记住,如果发送了一个 Ping 而没有发回一个 Pong,一个对等点可能会假设另一个对等点不再存在。

【讨论】:

是网页浏览器实现的还是我需要自己手动编码? 嗨。当 Pong 未发回连接关闭时?或连接仍然存在?当乒乓球不发回时乒乓球停止?我在哪里可以找到这些信息?【参考方案2】:

它是强制性的或不是强制性的,取决于客户端和服务器的实现。如果您连接到要求您用 PONG 回答 PING 的服务器,如果您不回复,您可能会断开连接。如果您是服务器并且客户端正在向您发送 PING,则相同。

服务器和客户端的实现各不相同(有无数种),但是 浏览器的 javascript 客户端不发送 PING,也不提供任何 API 来执行此操作,尽管它使用 PONG 回复 PING。

【讨论】:

点赞!这里有个小疑问,我在节点上做一个 websocket 客户端来连接 bitfinex 和 binance,bitfinex 发送心跳消息但 binance 没有,我应该 ping 他们不管他们是否发送心跳消息,或者我应该只 ping 他们每 30 秒如果他们不发送心跳消息?【参考方案3】:

乒乓球不是强制性的。它们很有用,因为它们允许检测断开的连接。 (如果线路上没有一些流量,就无法检测到断开的连接。)

请注意,在浏览器中,WebSocket 心跳不可访问。如果您需要您的浏览器客户端代码来检测断开的连接,那么您必须在应用程序级别实现心跳。

【讨论】:

以上是关于websockets必须有心跳吗?的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot集成Websocket,前端监听心跳实现

uniapp+websocket实现在线聊天

rxjs 和 websocket - 我需要心跳吗?

hpsocket默认心跳

Android websock 应用

我的 websocket 的服务器源检查安全吗?