WebSockets ping / pong,为什么不用TCP keepalive?

时间:2014-04-23 08:00:55

标签: tcp websocket keep-alive

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?

4 个答案:

答案 0 :(得分:56)

TCP keepalive的问题是:

  1. 默认情况下已关闭。
  2. 默认情况下,它以两小时的间隔运行,而不是Ping / Pong协议提供的按需运行。
  3. 它在代理之间运行,而不是端到端。

答案 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连接。