主要对比HTTP1,HTTP2的协议特性和性能优化点。

HTTP/2 的优化主要体现在三个方面。

头部压缩 HPACK

第一,头部压缩(HPACK)。对常见 HTTP 头部通过静态表和 Huffman 编码压缩近一半体积,后续请求还可建立动态表,压缩率可达 90%。但动态表会占用内存,越大越影响并发能力,因此服务器需限制连接时长或请求次数。

Stream 并发

第二,Stream 并发。多个 Stream 复用 1 个 TCP 连接,节省握手时间,减少慢启动影响。不同 Stream 的帧可乱序发送,但同一 Stream 内的帧必须有序。此外还支持设置 Stream 优先级。

一个 connection 中可以包含多个 Stream,而每个 Stream 都有一个唯一的 Stream ID,客户端发起的 Stream ID 是奇数,服务器发起的 Stream ID 是偶数。每个 Stream 中有 Message。而每个 Message 中又有 Frame。

服务器支持主动推送资源

第三,Server Push。服务器可主动推送资源,推送前先发 PUSH_PROMISE 帧告知客户端,再用偶数号 Stream 发送数据。

总结

不过 HTTP/2 仍存在队头阻塞问题,只是从 HTTP 层下移到了 TCP 层。由于 TCP 是字节流协议,必须保证数据完整连续,当前序字节未到达时,后续数据只能在内核缓冲区等待,HTTP/2 应用层无法读取,这就是 TCP 层的队头阻塞。

解决方案就是 HTTP/3 —— 直接放弃 TCP,改用 UDP 作为传输层协议。