WebSocket乒乓球,为什么TCP不保持激活?

WebSocket乒乓球,为什么TCP不保持激活?,tcp,websocket,keep-alive,Tcp,Websocket,Keep Alive,向另一端发送乒乓球的WebSocket,另一端应该用乒乓球回应 在接收到Ping帧后,端点必须在中发送Pong帧 响应,除非它已接收到闭合帧。它应该 在可行的情况下尽快用Pong帧进行响应 以keepalive形式的TCP: [Y] 您向您的对等方发送一个keepalive probe数据包,其中没有数据,并且ACK标志已打开。您可以这样做,因为TCP/IP规范是一种重复的ACK,远程端点将没有参数,因为TCP是一种面向流的协议。另一方面,您将收到来自远程主机的回复(它根本不需要支持keepal

向另一端发送乒乓球的WebSocket,另一端应该用乒乓球回应

在接收到Ping帧后,端点必须在中发送Pong帧 响应,除非它已接收到闭合帧。它应该 在可行的情况下尽快用Pong帧进行响应

以keepalive形式的TCP:

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

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

此外,WebSocket总是通过TCP运行;它们不是传输层不可知的,因此TCP keepalive始终可用:

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


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

TCP keepalive的问题是:

  • 默认情况下,它处于关闭状态
  • 默认情况下,它以两小时的间隔运行,而不是像乒乓协议所提供的那样按需运行
  • 它在代理之间运行,而不是端到端
  • 正如@DavidSchwartz所指出的,它在TCP堆栈之间运行,而不是在应用程序之间,因此它不会告诉我们应用程序是否处于活动状态

  • 与WebSockets乒乓球的比较没有意义。TCP keepalive在启用时是自动且定时的,而WebSocket ping/pong是根据应用程序的要求执行的。

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

    .3.4乒乓球架

    WebSocket协议规范定义了 可用于保持活力、心跳、网络状态探测、, 延迟检测,等等。这些目前尚未公开 在API中

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


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

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

    您可以使用
    setsockopt(2)
    @Thomas在每个连接的基础上更改这两个连接。您可以在某些平台上更改间隔。不是Windows、FreeBSD、Solaris……而且,它做了错误的事情。我们想知道的是另一端的应用程序是否处于活动状态。正如您所提到的,由于TCP keepalives是在内核中处理的,所以它们不会告诉我们另一端的应用程序是否处于活动状态。@DavidSchwartz我相信这是最重要的原因。也许可以把这个问题转化为一个答案?在Ubuntu中,我看到大约每30秒左右就有一次来自客户端的keepalive ACK,默认设置为。它可以工作(我可以在远程非Ubuntu服务器TCP中设置40秒超时,并且连接仍然有效)。但是你关于过度分层的客户端、代理等的观点是一个喜欢WebSocket ping的很好的理由。我在接受这一点和@vtortola的答案之间左右为难,这两个都是很好的理由,但你还有一个更高的投票权,所以这里是:)@Thomas我觉得奇怪,你接受了一个基于另一个更完整答案的答案。这里有几个答案重复了这个信息,还有几个更完整。你的答案是。。。现在。“代理问题是我遗漏的主要问题,而这不是你最初的答案。@托马斯我说的是几个更好的答案,而不仅仅是一个。