想象一下客户端连接到服务器并抛开服务器推送,HTTP/2 指定客户端理论上可以发送尽可能多的数据帧,直到 EOS(流结束),服务器响应也是如此。这种交互类似于半双工,如 https://datatracker.ietf.org/doc/html/rfc9113#section-5.1.
所示。AFAICT 在 RFC8441 中指定的初始握手之后,WebSocket 数据通过 HTTP/2 数据帧传输,但 WebSocket 的全双工性质使得流状态的定义不切实际。
https://datatracker.ietf.org/doc/html/rfc8441#section-5.1显示了一个示例,但没有详细说明数据交换。也许我错过了什么?实现 RFC8441 的库会忽略流状态吗?
不清楚“半双工”的确切含义,但 HTTP/2 是“全双工”,如“两个方向的通信是同时进行的”。
鉴于此,WebSocket(也是全双工)完美地映射到 HTTP/2,因为 HTTP/2 数据帧包裹 WebSocket 帧。
您在 RFC 8441 (https://datatracker.ietf.org/doc/html/rfc8441#section-5.1) 中报告的示例显示了交互;它已被格式化,以便它首先显示从客户端到服务器的数据帧,然后显示从服务器到客户端的数据帧,但两者可以同时进行。
该示例还显示客户端仅发送 2 个 DATA 帧,但客户端(和服务器)可以发送大量 DATA 帧,所有这些帧都没有“end-stream”标志。
仅当 WebSocket 通信关闭(由应用程序或由于错误或超时)时,才会发送带有“end-stream=true”标志的最后一个 DATA 帧,其中包含 WebSocket CLOSE 帧。
如果您有一个 2 核客户端系统,则可以在 core0 上有 1 个线程从服务器读取数据帧,在 core1 上有 1 个线程将数据帧写入服务器,这是并行(同时)发生的。
HTTP/2 流状态无关紧要,因为 WebSocket 通信发生在 HTTP/2 流处于“打开”状态时,直到 WebSocket 层关闭通信为止。