WebSockets ping/pong,为什么TCP不保持活动



WebSockets可以选择向另一端发送ping,其中另一端应该用pong进行响应。

收到Ping帧后,端点必须在中发送Pong帧响应,除非它已经接收到Close帧。它应该在实际可行的情况下尽快使用Pong框架进行响应。

TCP提供了类似的保活形式:

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

我认为TCP保活更有效,因为它可以在内核中处理,而无需将数据传输到用户空间、解析websocket帧、创建响应帧,然后将其交回内核进行传输。它也减少了网络流量。

此外,WebSocket被明确指定为始终在TCP上运行;它们与传输层无关,因此TCP保持活动始终可用:

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

那么,为什么要使用WebSocket乒乓而不是TCP保活呢?

TCP保持活动的问题有:

  1. 默认情况下处于禁用状态
  2. 默认情况下,它以两小时为间隔运行,而不是像Ping/Pong协议那样按需运行
  3. 它在代理之间运行,而不是端到端
  4. 正如@DavidSchwartz所指出的,它在TCP堆栈之间运行,而不是在应用程序之间运行,因此它不会告诉我们应用程序是否处于活动状态

与WebSockets乒乓球的比较没有意义。TCP保持活动是自动的,并且在启用时是定时的,而WebSocket乒乓是根据应用程序的要求执行的。

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

http://www.whatwg.org/specs/web-apps/current-work/multipage/network.html#ping-和乒乓帧

.3.4乒乓帧

WebSocket协议规范定义了Ping和Pong帧可用于维持生命、心跳、网络状态探测,延迟检测等等。这些目前尚未公开API中。

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

WebSockets是在考虑RTC的情况下开发的,所以当我查看ping/pong功能时,我也看到了一种测量延迟的方法。pong必须返回与ping相同的有效负载,这使得发送时间戳,然后计算从客户端到服务器的延迟非常方便,反之亦然。

TCP keepalive不会通过web代理传递。网络套接字乒乓球将通过网络代理转发。TCP保持活动旨在监督TCP端点之间的连接。Web套接字终结点不等于TCP终结点。一个网络套接字连接可以在两个网络套接字端点之间使用多个TCP连接。

最新更新