WebSockets have the option将ping发送到另一端,另一端应该用pong响应。
收到Ping帧后,端点必须发送Pong帧 响应,除非它已经收到一个关闭框架。这应该 尽快回应Pong框架。
以keepalive形式的TCP offers something similar:
[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?
答案 0 :(得分:56)
TCP keepalive的问题是:
答案 1 :(得分:39)
除了EJP的答案,我认为它也可能与HTTP代理机制有关。 Websocket连接也可以通过(HTTP)代理服务器运行。在这种情况下,TCP keepalive只会检查到代理的连接,而不是端到端连接。
答案 2 :(得分:18)
http://www.whatwg.org/specs/web-apps/current-work/multipage/network.html#ping-and-pong-frames
.3.4 Ping和Pong帧
WebSocket协议规范定义了Ping和Pong帧 可用于保持活力,心跳,网络状态探测, 延迟检测,等等。这些目前尚未公开 在API中。
用户代理可以根据需要发送ping和未经请求的pong帧 尝试维护本地网络NAT映射的示例 检测失败的连接,或向用户显示延迟指标。 用户代理不得使用ping或未经请求的pongs来帮助服务器; 假设服务器将在适当的时候请求拨打 服务器的需求。
WebSockets在开发时考虑了RTC,因此当我查看ping / pong功能时,我也看到了一种测量延迟的方法。 pong必须返回与ping相同的有效负载的事实,使发送时间戳非常方便,然后计算从客户端到服务器的延迟或反之。
答案 3 :(得分:14)
TCP keepalive没有通过Web代理传递。 websocket ping / pong将通过网络代理转发。 TCP keepalive旨在监督TCP端点之间的连接。 Web套接字端点不等于TCP端点。 websocket连接可以在两个websocket端点之间使用多个TCP连接。