WebSockets have the option将ping发送到另一端,其中另一端应该用pong响应。
收到Ping帧后,端点必须发送Pong帧作为响应,除非它已经收到一个关闭帧。它应该尽快响应Pong框架。
以保持活动形式的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?
TCP keepalive的问题是:
除了EJP的答案,我认为它也可能与HTTP代理机制有关。 Websocket连接也可以通过(HTTP)代理服务器运行。在这种情况下,TCP keepalive只会检查到代理的连接,而不是端到端连接。
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和未经请求的乒乓帧,例如,尝试维护本地网络NAT映射,检测失败的连接,或向用户显示延迟度量。用户代理不得使用ping或未经请求的pongs来帮助服务器;假设服务器将在适合服务器需求时请求拨打。
WebSocket在开发时考虑了RTC,所以当我看到ping / pong功能时,我也看到了一种测量延迟的方法。 pong必须返回与ping相同的有效负载的事实,使发送时间戳非常方便,然后计算从客户端到服务器的延迟或反之。
TCP keepalive不会通过Web代理传递。 websocket ping / pong将通过网络代理转发。 TCP keepalive旨在监督TCP端点之间的连接。 Web套接字端点不等于TCP端点。 websocket连接可以在两个websocket端点之间使用多个TCP连接。