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

问题描述 投票:60回答:4

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 websocket keep-alive
4个回答
59
投票

TCP keepalive的问题是:

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

40
投票

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


19
投票

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相同的有效负载的事实,使发送时间戳非常方便,然后计算从客户端到服务器的延迟或反之。


15
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.