了解 HTTP/2 如何通过单一 TCP 连接、二进制分帧和多路复用技术彻底解决 HTTP/1.x 的性能瓶颈。

为什么需要 HTTP/2?

在 HTTP/1.x 时代,浏览器为了加速加载需要开启多个并行 TCP 连接,但受限于“队头阻塞(Head-of-line blocking)”,依然面临高延迟问题。HTTP/2 的出现是为了在不改变 HTTP 语义的前提下,极大地优化传输效率。

连接创建:ALPN 协议升级

虽然 HTTP/2 理论上支持明文(h2c),但主流浏览器强制要求 HTTPS。连接创建步骤如下:

  1. TCP 三次握手: 建立基础通讯通道。
  2. TLS 握手与 ALPN: 在 TLS 握手阶段,客户端通过 ALPN (Application-Layer Protocol Negotiation) 扩展告诉服务器:“我支持 h2”。服务器确认后,后续数据按 HTTP/2 格式传输。

核心机制:二进制分帧 (Binary Framing)

这是 HTTP/2 性能飞跃的基石。它将 HTTP 信息拆分为更小的帧(Frame),并采用二进制格式编码。

  • HEADERS 帧: 用于传输 HTTP 头部。
  • DATA 帧: 用于传输原始报文内容。

二进制格式比纯文本更易于解析,且能有效减少传输中的错误。

通讯步骤:多路复用 (Multiplexing)

多路复用允许在同一个 TCP 连接上交错地发送多个请求和响应。

1. 流 (Stream) 的创建

每个请求/响应对被分配一个唯一的 流 ID。客户端和服务器可以同时在一个连接上开启多个流。

2. 乱序传输

不同流的帧可以乱序发送。例如,图片 A 的一部分 DATA 帧可以在网页 B 的 HEADERS 帧之后立即发送,无需等待网页 B 传输完毕。

3. 接收端重组

接收方根据 流 ID 将零散的帧重新组装成完整的 HTTP 消息。

头部压缩 (HPACK)

HTTP 头部包含大量重复信息(如 User-Agent, Cookie)。HTTP/2 使用 HPACK 算法,在客户端和服务器端共同维护一张索引表,只传输变化的头部字段,极大地节省了带宽。

服务端推送 (Server Push)

服务器可以主动向浏览器推送资源。例如,当浏览器请求 index.html 时,服务器预测到它还需要 style.css,便会在浏览器请求前主动推送,从而减少一次往返时间。

部署提示: HTTP/2 必须依赖受信任的 SSL/TLS 证书才能在现代浏览器中激活。前往 CertificateHub 申请免费证书,立享高性能加速。

总结

HTTP/2 通过将请求拆分为“流”与“帧”,打破了 HTTP/1.x 串行传输的枷锁。它是现代 Web 高速访问的幕后功臣。如果您希望进一步追求零延迟,可以了解基于 UDP 的 HTTP/3