【发布时间】:2014-06-07 22:23:55
【问题描述】:
WebSockets have the option 向另一端发送 ping,另一端应该用 pong 响应。
在收到 Ping 帧后,端点必须发送 Pong 帧 响应,除非它已经收到关闭帧。这应该 尽快回复 Pong 框架。
TCPoffers something similarkeepalive形式:
[Y]你向你的对等方发送一个没有数据的keepalive探测包,并且ACK标志打开。由于 TCP/IP 规范,您可以这样做,作为一种重复的 ACK,并且远程端点将没有参数,因为 TCP 是面向流的协议。另一方面,您将收到来自远程主机的回复(根本不需要支持 keepalive,只需要 TCP/IP),没有数据和 ACK 集。
我认为 TCP keepalive 更有效,因为它可以在内核中处理,而无需将数据传输到用户空间、解析 websocket 帧、制作响应帧并将其交还给内核传播。网络流量也更少。
此外,WebSockets are explicitly specified 始终通过 TCP 运行;它们与传输层无关,因此 TCP keepalive 始终可用:
WebSocket 协议是一个独立的基于 TCP 的协议。
那么为什么要使用 WebSocket ping/pong 而不是 TCP keepalive?
【问题讨论】:
-
实际上从来没有使用过 WebSocket ping/pong 因为no API was created。由于答案中提到的原因,一个人也从不使用 TCP keepalive。这是一个很好的例子,说明分层如何在不解决问题的情况下引入复杂性:每一层都必须实现相同的特性,但每一层都有其自身的用处。因此,应用程序仍然必须在所有其他层之上实现自己的 keepalive。
标签: tcp websocket keep-alive