我试图澄清/理解websocketsover是否HTTP/2也会使用流通过 TCP 连接进行多路复用。RFC8441 的第 5 节似乎暗示了这一点
成功处理打开握手后,对等方应使用 CONNECT 事务中的 HTTP/2 流继续执行 WebSocket 协议 [RFC6455],就像 [RFC6455] 中提到的 TCP 连接一样。此时 WebSocket 连接的状态为 OPEN,如 [RFC6455] 第 4.1 节所定义。
HTTP/2 流关闭也类似于 [RFC6455] 的 TCP 连接关闭。有序的 TCP 级闭包表示为 END_STREAM 标志([RFC7540],第 6.1 节)。RST 异常由 RST_STREAM 帧([RFC7540],第 6.4 节)和 CANCEL 错误代码([RFC7540],第 7 节)表示。
但我的困惑来自于这样一个事实:即使使用 HTTP/1.1,虽然浏览器中的选项卡共享与同一主机的底层 TCP 连接(例如 chrome 建立 6 个 TCP 连接),但在不同选项websocket卡中创建到同一主机的连接会导致不同的 TCP每个选项卡中的连接。
我不确定为什么两者之间存在差异以及是否也可能websockets相同HTTP/2。
有哪位高手可以解释一下。谢谢。
但我的困惑来自于这样一个事实:即使使用 HTTP/1.1,虽然浏览器中的选项卡共享与同一主机的底层 TCP 连接(例如 chrome 建立 6 个 TCP 连接),但在不同选项卡中创建到同一主机的 websocket 会导致不同的结果每个选项卡中的 TCP 连接。
您是对的,不幸的是,这就是 HTTP/1.1 的当前状况。
正如您所指出的,RFC 8441 已被指定用于解决此问题,并通过 HTTP/2 流搭载 WebSocket“连接”,因此可以只打开一个到源服务器的 TCP 连接,并将该连接用于两个 HTTP /2 通信并用于 WebSocket 通信。
HTTP/1.1 和 HTTP/2 之间的差异源于 HTTP/1.1 WebSocket 连接无法(有效)池化这一事实。每个 WebSocket 连接都绑定到一个特定的 URI(例如ws://host/path1),并且应用程序更典型的是为不同的 URI 打开不同的 WebSocket 连接(而不是为同一 URI 打开多个 WebSocket 连接)。因为它们不能被集中,所以浏览器基本上必须允许无限数量的它们,每次new WebSocket(...)从 JavaScript 调用时都会有一个新的。
使用 HTTP/2,您将能够在同一 HTTP/2 连接内打开新的 HTTP/2流。并发流的数量取决于浏览器实现,但通常在 100 个左右(如果不是更多),这为 HTTP/2 和 WebSocket 留下了足够的并发性(除非客户端应用程序确实滥用 WebSocket)。
幸运的是,无需更改客户端应用程序即可利用此功能。当浏览器和服务器支持它时,您的应用程序将使用更少的资源(仅一个 TCP 连接),而不是现在使用的大量资源。
[免责声明,我是Jetty中此类功能的实现者]
我们已经看到一些浏览器实现了此功能,并且我们正在 Jetty 10.0.x 服务器中完成此功能的实现,请参阅https://github.com/eclipse/jetty.project/issues/3537。
| 归档时间: |
|
| 查看次数: |
2473 次 |
| 最近记录: |