为什么许多websocket库实现自己的应用程序级别的心跳?

例如, socket.io具有pingIntervalpingTimeout设置,hapi的nes具有相似的心跳间隔设置。 这表面上是为了防止像过度热心的代理这样的任何中间体closures似乎是不活跃的连接。

但ping / pong框架是websocket协议的一部分,并且似乎达到了相同的目的。 那么为什么websocket库的实现者在应用层增加了另一个ping / pong层呢?

如果我被推测,那么万一websocket服务器正在处理一个不响应/支持websocket协议级别ping-pong的客户端。

我做了一些阅读,并做了一些testing,我认为这归结为:

  • WebSocket平台仅由服务器启动
  • 浏览器Websocket API不能发送ping帧,而来自服务器的入站ping不会以任何方式暴露
  • 这些ping都是关于keepalive,而不是存在
  • 因此,如果服务器没有正确的TCP拆卸(networking丢失/崩溃等),客户端不知道连接是否仍然打开
  • 在应用程序级别添加心跳是客户端build立服务器存在或不存在的一种方式。 这些必须作为正常的数据消息发送,因为这是所有的WebSocket API(浏览器)能够。