首先,一些更正。
令牌h2c
指的是明文 HTTP/2(因此是c
in h2c
)。在第二个项目符号中,您说大多数网站都使用它,但实际上很少有人这样做,因为浏览器没有实现它。绝大多数网站使用h2
.
令牌h2
指的是 encrypted h2c
,或等效h2c
地通过 TLS。
当客户端和服务器协商说话h2
时,客户端发送的字节被加密并一直加密传输到服务器。这意味着中介没有机会解密流量(谢谢)。
在这种情况下,HTTP/2规范所指的“跳”就是客户端和服务器之间的整个网段。
然而,HTTP/2 规范需要是通用的,并且在定义诸如 HTTP/2 之类的有线协议时不必担心浏览器和 Web 服务器如何交互。
想象这样一种情况,客户端对server1
using执行 HTTP/2 请求h2
,并且server1
需要调用server2
来完成请求,这次使用h2c
. 例如,server1
可以是前端“代理”,根据某些逻辑将请求转发到“正确的”后端服务器。
在这种情况下,您有 2 个跃点:client-server1 和 server1-server2。
每个跃点应用自己的流量控制。
例如,假设客户端将一个大文件上传到服务器。通常,客户端流控制发送窗口很小,例如默认的 65535 个八位字节。在停止上传之前,客户端最多只能发送 65535 个八位字节。
这 65535 个八位字节由server1
. 现在server1
成为客户端以便与server2
. 让我们假设server1
的客户端在与 通信时配置了一个小得多的流控制窗口server2
,比如说只有 16384 个八位字节。
在此示例中,server1
将上传延迟到server2
16384 个八位字节后,并且必须设法保持剩余的 65535-16384 个八位字节等待server2
通知(通过 WINDOW_UPDATE 帧)上传的数据已被消耗。
当server1
客户端收到来自 WINDOW_UPDATE 的消息时server2
,它可以发送更多数据到server2
;而且,它必须决定是向客户端发送 WINDOW_UPDATE(因为它与客户端的流控制窗口现在有额外的 16384 个八位字节的空间)还是再等一会儿。例如,它可以发送另外 16384 个八位字节到server2
,并且只有在收到第二个 WINDOW_UPDATE 之后server2
才能决定向客户端发送一个 WINDOW_UPDATE(更新 16384+16384 个八位字节)。
从上面的例子可以看出,客户端 和 之间的流控制与 和 之间的流控制相关server1
但独立。server1
server2
您可能还想阅读此答案以讨论有关流量控制策略实现的讨论。