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

时间:2016-03-05 22:50:32

标签: node.js http websocket socket.io

例如socket.iopingIntervalpingTimeout设置,hapi的nes具有类似的心跳间隔设置。这表面上是为了防止任何中间人如过热的代理人关闭似乎是不活跃的连接。

但是ping/pong frames是websocket协议的一部分,似乎也有同样的目的。那么为什么websocket库实现者在应用程序级别添加另一层ping / pong呢?

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

1 个答案:

答案 0 :(得分:2)

我做了一些阅读并做了一些测试,我认为归结为:

  • Websocket ping仅由服务器启动
  • 浏览器Websocket API无法发送ping帧,并且服务器中的传入ping未以任何方式公开
  • 这些ping都是关于keepalive,而不是存在
  • 因此,如果服务器在没有正确的TCP拆卸(网络丢失/崩溃等)的情况下离开,客户端不知道连接是否仍然打开
  • 在应用程序级别添加心跳是客户端建立服务器存在或缺少服务器的一种方式。这些必须作为普通数据消息发送,因为这是所有Websocket API(浏览器)都能够的。