主要对比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 作为传输层协议。