帧与流表达请求和响应

HTTP/2把通信拆成不同类别的帧,HEADERS承载字段,DATA承载消息内容,SETTINGS等帧表达连接控制。每个请求及其响应关联一个流,不同流的帧可以在同一连接中交错出现,而不是必须等整份响应发完才开始另一份。

这些编码安排没有替换资源、方法和状态等核心意义。GET、响应状态和字段仍按HTTP语义解释;不能因为报文从文本格式变成二进制帧,就假定应用操作、缓存或账号授权规则也被自动改写。

参考:[1]

字段压缩与连接状态

HPACK用预定义静态表和逐步更新的动态表表示重复字段,还可为字面字符串采用固定Huffman编码。字段块因此可能依赖之前的压缩状态,解码器不能把连接中每一段字段都当成彼此完全独立的压缩文件。

帧层还有严格的字段块组织规则。一个字段块可能跨HEADERS和CONTINUATION等帧,但按同一连接顺序处理压缩状态;数据流多路复用不意味着任何帧都能在任何位置任意插入。协议约束使双方能一致重建原字段序列。

参考:[1] [2]

两级流量控制与底层阻塞

HTTP/2对各流及连接整体分别进行流量控制,用WINDOW_UPDATE增加接收方允许的额度;基础规范中只有DATA帧消耗这种窗口,重要控制帧不受同样额度限制。它保护的是接收端资源,不等同于TCP为网络拥塞调整发送的机制。

多个HTTP流最终仍共用TCP的有序字节流。底层发生丢失而需要补齐时,即使缺失部分只涉及一个交换,也可能延后其他流的交付。因此多路复用扩大并发机会,却不承诺在所有网络和工作负载下都更快,更不能说它消除了所有队头阻塞。

参考:[1] [3]