HTTP/2 或用于低延迟客户端到服务器消息的 Websockets
HTTP/2 or Websockets for low latency client to server messages
我要求我的 Web 应用程序中的客户端到服务器消息的延迟非常低。
我在 Whosebug 上看到过几篇帖子说最好使用 websockets 而不是 HTTP 来满足这个要求,但那是很久以前的事了。
在 2018 年的今天,随着 HTTP/2 的进步,是否仍然值得将 websockets 用于此用例?
HTTP/2 有 multiplexing,这意味着应该没有等待时间 - 就像 HTTP/1 由于每个域的 6 个连接限制。所以这意味着它可以用于您所说的低延迟连接。
然而,HTTP 仍然存在其他开销,例如 HTTP headers,这可能会向您不会使用 Web 套接字的小请求添加大量不必要的额外数据。
此外 HTTP/2 不是全双工协议,因此只能响应请求(尽管由于服务器推送可能有多个响应)。你说你只需要这个用于 client-server 消息传递,所以这对你来说可能不太重要。
支撑 HTTP/2 的二进制框架层是一个全双工协议,因此理论上可以类似于 websockets 但 HTTP/2 不允许这样做 - 除非你只是拖出请求和响应的发送身体来伪造这个 (long polling or Server-Sent Events). In fact Websockets over HTTP/2 has been approved which will allow the HTTP/2 binary format to be used for websockets by wrapping websockets messages in the HTTP/2 Data frame. This has the added advantage of also allowing regular HTTP messages on the same connection. It is not yet available in any browser at the time of writing (though coming in version 65 of FireFox and Chrome has started an implementation)。在那之前,Websockets 恢复到 HTTP/1.1.
另请参阅此问题和答案:Does HTTP/2 make websockets obsolete?
这将取决于您的客户和您的要求。如果您确定您的客户端不会关闭 HTTP/2 的底层 TLS 连接(即使有一段时间未使用),发送 message/request 的延迟可能类似于持久的 websocket 连接。如果客户端在空闲一段时间后关闭连接,需要建立新的 TLS 连接,情况会更糟。
在浏览器作为客户端的情况下,您知道Web 套接字连接将是持久的,而对HTTP 连接一无所知。也许您可以通过向同一服务器上的 SSE 端点发出虚拟请求并保持连接来强制浏览器保持连接,但这是一种解决方法。
除了连接建立之外,两种协议都有不同类型的开销(flow-control & stream headers vs masking),其影响很可能只能根据实际应用需求来估计.
very low latency for client to server messages in my web application.
我读到这个是因为你想 "connect" 然后在 客户端 和 [=33] 之间发送 低延迟消息 =]服务器.
HTTP/2 和 Websocket 都可以是二进制的,并且传输消息的帧具有相似的开销(几个字节),但是 Websocket 必须遍历整个消息以 mask 有效负载,然后接收方必须将其反转。参见 What is the mask in a WebSocket frame?
此外,Websocket 原语更底层,例如要拥有多个消息流,您必须自己完成,但使用 HTTP/2 可以轻松完成。参考 Podcast about HTTP/2。在同一应用程序中同时使用 Websocket 和 HTTP 时,服务器代码也会变得更加复杂。
流量控制可能是使用 HTTP/1.1 Websocket 的问题,但在 HTTP/2.
中是内置协议功能
服务器到客户端
这可以通过 HTTP/2 有效地完成,方法是使用 fetch
和 response.body.getReader();
获得 ReadableStream. A good article about streams in browser JavaScript: 2016 - the year of web streams。
客户端到服务器
目前在 HTTP 中从客户端向服务器发送消息的唯一方法是发送完整请求。流式请求正文已计划但尚未由浏览器实现。请参阅 关于流式请求正文。
我要求我的 Web 应用程序中的客户端到服务器消息的延迟非常低。
我在 Whosebug 上看到过几篇帖子说最好使用 websockets 而不是 HTTP 来满足这个要求,但那是很久以前的事了。
在 2018 年的今天,随着 HTTP/2 的进步,是否仍然值得将 websockets 用于此用例?
HTTP/2 有 multiplexing,这意味着应该没有等待时间 - 就像 HTTP/1 由于每个域的 6 个连接限制。所以这意味着它可以用于您所说的低延迟连接。
然而,HTTP 仍然存在其他开销,例如 HTTP headers,这可能会向您不会使用 Web 套接字的小请求添加大量不必要的额外数据。
此外 HTTP/2 不是全双工协议,因此只能响应请求(尽管由于服务器推送可能有多个响应)。你说你只需要这个用于 client-server 消息传递,所以这对你来说可能不太重要。
支撑 HTTP/2 的二进制框架层是一个全双工协议,因此理论上可以类似于 websockets 但 HTTP/2 不允许这样做 - 除非你只是拖出请求和响应的发送身体来伪造这个 (long polling or Server-Sent Events). In fact Websockets over HTTP/2 has been approved which will allow the HTTP/2 binary format to be used for websockets by wrapping websockets messages in the HTTP/2 Data frame. This has the added advantage of also allowing regular HTTP messages on the same connection. It is not yet available in any browser at the time of writing (though coming in version 65 of FireFox and Chrome has started an implementation)。在那之前,Websockets 恢复到 HTTP/1.1.
另请参阅此问题和答案:Does HTTP/2 make websockets obsolete?
这将取决于您的客户和您的要求。如果您确定您的客户端不会关闭 HTTP/2 的底层 TLS 连接(即使有一段时间未使用),发送 message/request 的延迟可能类似于持久的 websocket 连接。如果客户端在空闲一段时间后关闭连接,需要建立新的 TLS 连接,情况会更糟。
在浏览器作为客户端的情况下,您知道Web 套接字连接将是持久的,而对HTTP 连接一无所知。也许您可以通过向同一服务器上的 SSE 端点发出虚拟请求并保持连接来强制浏览器保持连接,但这是一种解决方法。
除了连接建立之外,两种协议都有不同类型的开销(flow-control & stream headers vs masking),其影响很可能只能根据实际应用需求来估计.
very low latency for client to server messages in my web application.
我读到这个是因为你想 "connect" 然后在 客户端 和 [=33] 之间发送 低延迟消息 =]服务器.
HTTP/2 和 Websocket 都可以是二进制的,并且传输消息的帧具有相似的开销(几个字节),但是 Websocket 必须遍历整个消息以 mask 有效负载,然后接收方必须将其反转。参见 What is the mask in a WebSocket frame?
此外,Websocket 原语更底层,例如要拥有多个消息流,您必须自己完成,但使用 HTTP/2 可以轻松完成。参考 Podcast about HTTP/2。在同一应用程序中同时使用 Websocket 和 HTTP 时,服务器代码也会变得更加复杂。
流量控制可能是使用 HTTP/1.1 Websocket 的问题,但在 HTTP/2.
中是内置协议功能服务器到客户端
这可以通过 HTTP/2 有效地完成,方法是使用 fetch
和 response.body.getReader();
获得 ReadableStream. A good article about streams in browser JavaScript: 2016 - the year of web streams。
客户端到服务器
目前在 HTTP 中从客户端向服务器发送消息的唯一方法是发送完整请求。流式请求正文已计划但尚未由浏览器实现。请参阅