首页 > 解决方案 > 基于 HTTP/2 的 WebSockets 和 GOAWAY

问题描述

我对 HTTP/2 上的 WebSockets 如何在带有 GOAWAYs 的浏览器(特别是 Firefox,因为这是我知道的唯一一个支持 H2 上的 Websockets)上的工作感兴趣。

现在,我知道 GOAWAY 是连接级别的事件,如果是 IIUC,WebSocket/H2 连接实际上是一个已升级的 H2 流。

假设我们现在从服务器获得了 GOAWAY - 我们是否希望浏览器只关闭支持 WebSocket 连接的 H2 流,CloseEvent代码为 1001?是否有一些其他事件被触发/需要添加到 WebSocket API,例如,ongoaway

标签: websockethttp2

解决方案


现在,我知道 GOAWAY 是连接级别的事件,如果是 IIUC,WebSocket/H2 连接实际上是已升级的单个 H2 流。

单个 HTTP/2 连接可能有多个 HTTP/2 流,每个流都可能是基于 HTTP/2“升级”流的 WebSocket(请参阅本节)。

目标是使用单个 TCP 连接可能承载多个协议,因此一些流是普通 HTTP/2 而一些流是基于 HTTP/2 的 WebSocket 的情况是可能的。

当服务器发送连接级别 GOAWAY 时,我希望客户端按照本节中的指定做出反应。

特别是服务器可能会发送一个“优雅的”GOAWAY,因此客户端不会打开新的流。

当服务器即将发送 GOAWAY 时,它应该安排发送一个包含 WebSocket帧的终端(即endStream=true)帧,这将在浏览器中产生一个。DATACloseCloseEvent

我认为不应该将任何事件添加到浏览器的 WebSocket API,HTTP/2 上的传输对于客户端应用程序应该是完全透明的,就像在使用或时使用 HTTP/1.1 或 HTTP/2 是透明的XMLHttpRequest一样fetch()


推荐阅读