用于低延迟客户端到服务器消息的HTTP/2或WebSocket

用于低延迟客户端到服务器消息的HTTP/2或WebSocket,websocket,http2,Websocket,Http2,我要求web应用程序中的客户端到服务器消息具有非常低的延迟 我曾在stackoverflow上看到过几篇帖子,说最好使用WebSocket而不是HTTP来满足这一需求,但这已经是很久以前的事了 今天,在2018年,随着HTTP/2的发展,在这个用例中使用WebSocket是否仍然值得 HTTP/2有,这意味着不应该有等待时间——就像HTTP/1下一样,因为每个域的连接限制为6。这意味着它可以像你说的那样用于低延迟连接 然而,HTTP还有其他开销,比如HTTP头,这可能会给小型请求添加大量不必要的

我要求web应用程序中的客户端到服务器消息具有非常低的延迟

我曾在stackoverflow上看到过几篇帖子,说最好使用WebSocket而不是HTTP来满足这一需求,但这已经是很久以前的事了

今天,在2018年,随着HTTP/2的发展,在这个用例中使用WebSocket是否仍然值得

HTTP/2有,这意味着不应该有等待时间——就像HTTP/1下一样,因为每个域的连接限制为6。这意味着它可以像你说的那样用于低延迟连接

然而,HTTP还有其他开销,比如HTTP头,这可能会给小型请求添加大量不必要的额外数据,而web套接字则不会这样做

此外,HTTP/2不是全双工协议,因此只能响应请求(尽管由于服务器推送,可能会有多个响应)。您说您只需要在客户机-服务器消息传递中使用它,因此您可能不太关心这个问题

支撑HTTP/2的二进制帧层是一个全双工协议,因此理论上可能类似于WebSocket,但HTTP/2不允许这样做,除非您只是拖出请求和响应主体的发送来伪造(或)。事实上,它已经被批准,允许通过在HTTP/2数据帧中包装websockets消息,将HTTP/2二进制格式用于websockets。这还有一个额外的优点,即允许在同一连接上使用常规HTTP消息。在撰写本文时,它还没有在任何浏览器中可用(尽管即将发布和发布)。在此之前,WebSocket将恢复为HTTP/1.1


另请参见此问题和答案:

这将取决于您的客户和您的要求。如果您确信客户端不会关闭HTTP/2的底层TLS连接(即使在一段时间内未使用),则发送消息/请求的延迟可能与持久化websocket连接类似。如果客户端在一段空闲时间后关闭连接,并且需要建立新的TLS连接,则情况会更糟

在浏览器作为客户机的情况下,您知道web套接字连接将是持久的,并且不知道有关HTTP连接的任何信息。也许您可以通过向同一服务器上的SSE端点发出虚拟请求来强制浏览器保持连接,并保持连接,但这是一种解决方法

除了建立连接之外,这两种协议上都存在不同类型的开销(流控制和流头vs掩蔽),并且影响很可能只能根据实际应用需要进行估计

web应用程序中客户端到服务器消息的延迟非常低

我将此理解为您希望“连接”,然后在客户端和服务器之间发送低延迟消息

HTTP/2和Websocket都可以是二进制的,并且传输消息的帧具有类似的开销(几个字节),但是Websocket必须迭代整个消息以屏蔽有效负载,然后接收者必须逆转这一点。看

此外,Websocket原语的级别较低,例如,要有多个消息流,您必须自己完成,但使用HTTP/2很容易完成。裁判。在同一个应用程序中同时使用Websocket和HTTP时,服务器代码也变得更加复杂

使用HTTP/1.1 Websocket时,流控制可能是一个问题,但它是HTTP/2中的内置协议功能

服务器到客户端 使用HTTP/2,可以通过使用
fetch
response.body.getReader()高效地完成这项工作以获取一个。关于浏览器JavaScript中的流的一篇好文章:

客户端到服务器 目前,在HTTP中,从客户端向服务器发送消息的唯一方法是发送完整请求。流式请求主体已规划,但尚未由浏览器实现。请参阅关于流式请求正文