HTTP/2 在应用层与 TCP 之间插入二进制分帧层:消息被拆成带类型的帧(HEADERS、DATA、SETTINGS、WINDOW_UPDATE 等),每帧 9 字节头部含长度、类型、标志位和 31 位流标识符。请求/响应归属不同的流(Stream),同一连接上多个流的帧可以任意交错传输,接收方按流 ID 重组——这就是多路复用:一条 TCP 连接并发承载任意多个请求,消灭了 HTTP/1.1 的串行等待与多连接开销。
配套机制:1)HPACK 头部压缩——静态表(常见头名值)+ 动态表(连接内缓存,引用索引代替重复传输)+ Huffman 编码,Cookie 等大头的重复开销显著下降;2)流优先级——帧依赖树 + 权重,浏览器用它让关键资源先行(实际支持参差不齐,RFC 9113 已简化为 Extensible Priorities);3)服务器推送——服务器主动推送关联资源,但因缓存协调困难实践失败,Chrome 已移除;4)流控——流级与连接级两级窗口。遗留问题:TCP 层队头阻塞依旧(见相关题目)、TLS 成事实必需(浏览器只支持 h2 over TLS)。追问方向:HPACK 动态表的安全风险(CRIME 类攻击的考量)、0-RTT 连接合并(coalescing)的证书要求。
(约 440 字)