HTTP2上的WebSocket也会在流中多路传输吗?

HTTP2上的WebSocket也会在流中多路传输吗?,websocket,http2,Websocket,Http2,我试图澄清/理解HTTP/2上的websockets是否也将使用流通过TCP连接进行多路复用。RFC8441的结果似乎表明了这一点 成功处理开始握手后,对等方应使用CONNECT事务中的HTTP/2流继续使用WebSocket协议[RFC6455],就像[RFC6455]中提到的TCP连接一样。根据[RFC6455]第4.1节的定义,此时的WebSocket连接状态为打开状态 HTTP/2流闭包也类似于[RFC6455]的TCP连接闭包。有序TCP级闭包表示为结束流标志([RFC7540],第6

我试图澄清/理解
HTTP/2
上的
websockets
是否也将使用流通过TCP连接进行多路复用。RFC8441的结果似乎表明了这一点

成功处理开始握手后,对等方应使用CONNECT事务中的HTTP/2流继续使用WebSocket协议[RFC6455],就像[RFC6455]中提到的TCP连接一样。根据[RFC6455]第4.1节的定义,此时的WebSocket连接状态为打开状态

HTTP/2流闭包也类似于[RFC6455]的TCP连接闭包。有序TCP级闭包表示为结束流标志([RFC7540],第6.1节)。RST异常由RST_流帧([RFC7540],第6.4节)和取消错误代码([RFC7540],第7节)表示

但我的困惑源于这样一个事实:即使使用HTTP/1.1,当浏览器中的选项卡共享到同一主机的底层TCP连接(例如,chrome创建6个TCP连接)时,在不同选项卡中创建到同一主机的
websocket
会导致每个选项卡中存在不同的TCP连接

我不知道这两者之间的区别是什么&如果
websockets
over
HTTP/2
也一样的话

任何能澄清的专家。谢谢

在不同选项卡中为同一主机创建websocket会导致每个选项卡中的TCP连接不同

WebSocket连接始终是一个新的TCP连接,因为它必须执行升级到WebSocket连接的HTTP/S请求,因此如果成功,就不再是HTTP/S连接。WebSocket连接是不同的,不能共享或重用,这与HTTP/S连接不同(假设使用了keep alives)

在不同选项卡中为同一主机创建websocket会导致每个选项卡中的TCP连接不同

WebSocket连接始终是一个新的TCP连接,因为它必须执行升级到WebSocket连接的HTTP/S请求,因此如果成功,就不再是HTTP/S连接。WebSocket连接是不同的,不能共享或重用,这与HTTP/S连接不同(假设使用了keep alives)

但我的困惑是,即使使用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连接)。 因为它们不能被合并,浏览器基本上必须允许无限数量的它们,每次从JavaScript调用
newWebSocket(…)
,都会有一个新的

使用HTTP/2,您将能够在同一HTTP/2连接中打开新的HTTP/2流。 并发流的数量取决于浏览器的实现,但如果不是更多的话,通常在100左右,这就为HTTP/2和WebSocket留下了大量的并发性(除非客户端应用程序真的滥用WebSocket)

幸运的是,不需要更改客户端应用程序就可以利用此功能。 当浏览器和服务器支持它时,您的应用程序将使用更少的资源(仅一个TCP连接),而不是它现在使用的许多资源

[免责声明,我是中此类功能的实现者]

我们已经看到一些浏览器实现了此功能,我们正在Jetty10.0.x服务器中完成此功能的实现,请参阅

但我的困惑是,即使使用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连接)。 因为它们不能被合并,浏览器基本上必须允许无限数量的它们,每次从JavaScript调用
newWebSocket(…)
,都会有一个新的

使用HTTP/2,您将能够在同一HTTP/2连接中打开新的HTTP/2流。 并发流的数量取决于浏览器的实现,但如果不是更多的话,通常在100左右,这就为HTTP/2和WebSocket留下了大量的并发性(除非客户端应用程序真的滥用WebSocket)

幸运的是,不需要更改客户端应用程序就可以利用此f