为什么许多websocket库实现自己的应用程序级别的心跳?
例如, socket.io具有pingInterval
和pingTimeout
设置,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(浏览器)能够。