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

WebSockets 可以select向另一端发送ping命令,另一端应该用乒乓键响应。

一旦收到一个Ping帧,端点必须发送一个Pong帧作为响应,除非它已经收到一个closures帧。 它应该尽快与庞框架响应。

TCP以Keepalive的forms提供了类似的东西 :

[Y] ou向对方发送一个keepalive探测包,里面没有数据,ACK标志打开。 你可以这样做,因为TCP / IP规范,作为一种重复的ACK,而远程端点将没有参数,因为TCP是一个面向stream的协议。 另一方面,您将收到来自远程主机的回复(根本不需要支持keepalive,只是TCP / IP),没有数据和ACK。

我认为TCP keepalive效率更高,因为它可以在内核中处理,而不需要将数据传输到用户空间,parsingwebsocket框架,制作响应帧,然后将其传回内核进行传输。 这也less了networkingstream量。

此外, 明确指定 WebSocket始终通过TCP运行; 它们不是传输层不可知的,所以TCP keepalive始终可用:

WebSocket协议是一个独立的基于TCP的协议。

那么为什么要使用WebSocket ping / pong而不是TCP keepalive呢?

TCP keepalive的问题是:

  1. 它默认closures。
  2. 它按照默认的时间间隔运行两个小时,而不是按照Ping / Pong协议提供的按需。
  3. 它在代理之间运行,而不是端到端。

除了EJP的答案,我认为它也可能与HTTP代理机制有关。 Websocket连接也可以通过(HTTP)代理服务器运行。 在这种情况下,TCP保持活动只会检查到代理的连接,而不是端到端的连接。

http://www.whatwg.org/specs/web-apps/current-work/multipage/network.html#ping-and-pong-frames

.3.4乒乓帧

WebSocket协议规范定义了可用于保活,心跳,networking状态探测, 延迟检测等的Ping和Pong帧。 这些目前不在API中公开。

用户代理可以根据需要发送ping和未经请求的pong帧,例如试图维持本地networkingNAT映射,检测失败的连接或向用户显示延迟度量 。 用户代理不得使用ping或未经请求的pongs来帮助服务器; 假定服务器将在适当的时候为服务器的需求请求砰砰声。

WebSocket已经在RTC的基础上开发出来了,所以当我查看ping / pongfunction时,我也看到了一种测量延迟的方法。 pong必须返回与ping相同的有效负载这一事实,使得发送时间戳非常方便,然后计算从客户端到服务器的延迟或反之。

TCP Keepalive不会通过Web代理传递。 websocket ping / pong将通过web代理进行转发。 TCP keepalive旨在监督TCP端点之间的连接。 Web套接字端点不等于TCP端点。 websocket连接可以在两个websocket端点之间使用多个TCP连接。