websocket - 基于 HTTP/2 的 WebSockets 和 GOAWAY
问题描述
我对 HTTP/2 上的 WebSockets 如何在带有 GOAWAYs 的浏览器(特别是 Firefox,因为这是我知道的唯一一个支持 H2 上的 Websockets)上的工作感兴趣。
现在,我知道 GOAWAY 是连接级别的事件,如果是 IIUC,WebSocket/H2 连接实际上是一个已升级的 H2 流。
假设我们现在从服务器获得了 GOAWAY - 我们是否希望浏览器只关闭支持 WebSocket 连接的 H2 流,CloseEvent
代码为 1001?是否有一些其他事件被触发/需要添加到 WebSocket API,例如,ongoaway
?
解决方案
现在,我知道 GOAWAY 是连接级别的事件,如果是 IIUC,WebSocket/H2 连接实际上是已升级的单个 H2 流。
单个 HTTP/2 连接可能有多个 HTTP/2 流,每个流都可能是基于 HTTP/2“升级”流的 WebSocket(请参阅本节)。
目标是使用单个 TCP 连接可能承载多个协议,因此一些流是普通 HTTP/2 而一些流是基于 HTTP/2 的 WebSocket 的情况是可能的。
当服务器发送连接级别 GOAWAY 时,我希望客户端按照本节中的指定做出反应。
特别是服务器可能会发送一个“优雅的”GOAWAY,因此客户端不会打开新的流。
当服务器即将发送 GOAWAY 时,它应该安排发送一个包含 WebSocket帧的终端(即endStream=true
)帧,这将在浏览器中产生一个。DATA
Close
CloseEvent
我认为不应该将任何事件添加到浏览器的 WebSocket API,HTTP/2 上的传输对于客户端应用程序应该是完全透明的,就像在使用或时使用 HTTP/1.1 或 HTTP/2 是透明的XMLHttpRequest
一样fetch()
。
推荐阅读
- github-actions - Github Actions 创建 .env 文件
- ssl - ClipGrab - 下载 youtube-dl 时出错:SSL 握手失败
- visual-studio - Visual Studio 键盘快捷键
- c++ - 正确编译使用 TRE 正则表达式库的 C++ 代码
- core-data - 当用户更改全局对象时重新初始化合并发布者
- mysql - Kubernetes集群中部署的应用如何实现线程安全?
- firebase - 使用 Firebase 将验证码发送到电子邮件以进行两步验证
- c# - CodecQuery.FindAllAsync 在查询没有子类型的音频编解码器时通过 try/catch 崩溃
- node.js - NextJS 和 KeystoneJS 网站无法获取 GraphQL 数据(错误:没有名为“public”的可执行架构可用)
- tensorflow - BERT 模型微调和迁移到 TF2