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

Tho*_*mas 63 tcp keep-alive websocket

WebSockets 可以选择将ping发送到另一端,另一端应该用pong响应.

收到Ping帧后,端点必须发送Pong帧作为响应,除非它已经收到一个关闭帧.它应该尽快响应Pong框架.

TCP 以keepalive的形式提供类似东西:

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

我认为TCP keepalive效率更高,因为它可以在内核中处理而无需将数据传输到用户空间,解析websocket框架,制作响应框架,然后将其交回内核进行传输.它也减少了网络流量.

此外,WebSockets 被明确指定为始终在TCP上运行; 它们不是传输层不可知的,因此TCP keepalive始终可用:

WebSocket协议是一种独立的基于TCP的协议.

那么为什么人们会想要使用WebSocket ping/pong而不是TCP keepalive?

use*_*421 64

TCP keepalive的问题是:

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

  • 而且,它做错了.我们想知道的是另一端的应用程序是否还活着.因为,正如您所提到的,TCP keepalive在内核中处理,它们不会告诉我们另一端的应用程序是否存活. (10认同)
  • @Thomas您可以在某些平台上更改间隔.不是Windows,FreeBSD,Solaris,...... (3认同)
  • 您可以使用 `setsockopt(2)` 在每个连接的基础上更改这两个。 (2认同)

Mat*_*247 41

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


vto*_*ola 20

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连接.