MD 状态:🌱 分类:AI与智能 更新:2026/5/29

HTTP/2

[!abstract] 一句话定义 HTTP/2 是 HTTP 协议的第二个主要版本,通过多路复用、头部压缩、服务端推送等技术,解决了 HTTP/1.1 的队头阻塞问题,大幅提升 Web 性能。

为什么需要它?

想象你打开一个包含 50 个资源的网页。在 HTTP/1.1 下,浏览器需要建立 6-8 个 TCP 连接,每个连接串行请求资源,前面的请求慢了会阻塞后面所有请求(队头阻塞)。用户看到的是白屏等待。HTTP/2 让所有请求在一个连接上并行传输,页面加载时间可减少 50% 以上。

核心直觉

类比:餐厅点餐

版本类比
HTTP/1.0每道菜都要等前一道上完才能点下一道,换一桌客人要换一张桌子
HTTP/1.1可以连续点菜(持久连接),但厨师一次只能做一道菜(串行处理)
HTTP/2厨师有多个灶台同时做菜(多路复用),还能提前准备你可能会要的菜(服务端推送)

它是怎么工作的?

版本演进概览

graph LR
    A[HTTP/1.0<br/>1996] -->|持久连接| B[HTTP/1.1<br/>1997]
    B -->|二进制分帧| C[HTTP/2<br/>2015]
    C -->|QUIC/UDP| D[HTTP/3<br/>2022]
    
    style A fill:#ffcccc
    style B fill:#ffffcc
    style C fill:#ccffcc
    style D fill:#ccccff

HTTP/2 核心机制

sequenceDiagram
    participant Client as 客户端
    participant Server as 服务器
    
    Note over Client,Server: HTTP/1.1: 串行请求(队头阻塞)
    Client->>Server: 请求 A
    Server-->>Client: 响应 A(耗时 2s)
    Client->>Server: 请求 B
    Server-->>Client: 响应 B(耗时 1s)
    Client->>Server: 请求 C
    Server-->>Client: 响应 C(耗时 1s)
    Note over Client,Server: 总耗时: 4s
    
    Note over Client,Server: HTTP/2: 多路复用(并行传输)
    Client->>Server: 请求 A + 请求 B + 请求 C
    Server-->>Client: 响应 C 片段
    Server-->>Client: 响应 A 片段
    Server-->>Client: 响应 B 片段
    Server-->>Client: 响应 C 片段
    Server-->>Client: 响应 A 片段
    Note over Client,Server: 总耗时: 2s

关键技术细节

1. 二进制分帧层

  • HTTP/1.x 是文本协议,解析复杂且易出错
  • HTTP/2 将数据拆分为更小的帧(Frame),用**流(Stream)**标识属于哪个请求
  • 帧格式:Length (9 bits) + Type (8 bits) + Flags (8 bits) + Stream ID (31 bits) + Payload

2. 多路复用(Multiplexing)

  • 一个 TCP 连接上可以并行发送多个请求/响应
  • 每个请求/响应拆分成帧,帧之间可以交错发送
  • 通过 Stream ID 区分不同请求的帧

3. 头部压缩(HPACK)

  • HTTP/1.x 每次请求都携带完整头部(Cookie 等可达数 KB)
  • HTTP/2 使用 HPACK 算法:维护头部字段表,只发送差异部分
  • 压缩率可达 80%-95%

4. 服务端推送(Server Push)

  • 服务器可以主动推送客户端可能需要的资源
  • 例如:请求 index.html 时,服务器主动推送 style.cssscript.js
  • 减少一轮 RTT(往返时间)

关键组件 / 核心要素

组件作用类比
帧(Frame)最小通信单位,携带特定类型数据快递包裹
消息(Message)一个完整的请求或响应,由多个帧组成一批快递
流(Stream)一个完整的请求-响应双向帧序列,有唯一 ID快递单号
连接(Connection)一个 TCP 连接,可承载多个流快递员

与相关概念的关系

[!info] vs HTTP1.1

  • 队头阻塞:HTTP/1.1 在应用层有队头阻塞,HTTP/2 在应用层解决了,但 TCP 层仍有
  • 连接数:HTTP/1.1 需要 6-8 个连接,HTTP/2 只需 1 个
  • 协议格式:HTTP/1.1 是文本,HTTP/2 是二进制
  • 头部处理:HTTP/1.1 每次完整发送,HTTP/2 增量压缩

[!info] vs HTTP3

  • 传输层:HTTP/2 基于 TCP,HTTP/3 基于 QUIC(UDP)
  • 队头阻塞:HTTP/2 在 TCP 层仍有队头阻塞,HTTP/3 完全解决
  • 连接建立:HTTP/2 需要 TCP+TLS 握手(2-3 RTT),HTTP/3 只需 1 RTT
  • 连接迁移:HTTP/2 切换网络需要重建连接,HTTP/3 支持无缝迁移

[!tip] 被 HTTPS 使用 现代 HTTPS 站点普遍采用 HTTP/2,浏览器要求 HTTP/2 必须使用 TLS

典型应用场景

  • 高并发 Web 应用 — 一个连接承载所有请求,减少连接开销
  • 移动端网页 — 网络不稳定时,多路复用避免单个慢请求阻塞整体
  • API 服务 — 微服务间通信,头部压缩减少重复元数据传输
  • 实时应用 — 服务端推送可替代部分长轮询场景

HTTP/1.1 vs HTTP/2 详细对比

特性HTTP/1.0HTTP/1.1HTTP/2
连接方式短连接(一次请求一个连接)持久连接 + 管线化单连接多路复用
协议格式文本文本二进制分帧
头部压缩无(仅支持 gzip body)HPACK 静态/动态表
队头阻塞严重存在(管线化不完善)应用层无,TCP 层仍有
服务端推送不支持不支持支持
并发连接数N 个请求 N 个连接6-8 个连接1 个连接
优先级控制支持流优先级
典型延迟

常见误解与陷阱

[!danger] ❌ 误以为:HTTP/2 完全解决了队头阻塞 ✅ 实际上:HTTP/2 只解决了应用层的队头阻塞,TCP 层的队头阻塞仍然存在(HTTP/3 通过 QUIC/UDP 才完全解决)

[!danger] ❌ 误以为:HTTP/2 不需要优化 ✅ 实际上:HTTP/2 改变了优化策略——不再需要域名分片、资源合并(雪碧图),但仍有其他优化点

[!danger] ❌ 误以为:HTTP/2 一定比 HTTP/1.1 快 ✅ 实际上:在高延迟、丢包严重的网络下,TCP 层队头阻塞可能导致 HTTP/2 性能不如多个 HTTP/1.1 连接

延伸阅读

  • 想深入理解原理 → 阅读 RFC 7540(HTTP/2 规范)和 RFC 7541(HPACK 规范)
  • 想看工程实践 → 浏览器开发者工具 Network 面板可查看 HTTP/2 帧信息
  • 想了解前沿进展 → 关注 HTTP/3(RFC 9114)和 QUIC 协议

关联笔记

前置知识HTTP协议基础 · TCP三次握手 同族概念HTTP1.1 · HTTP3 · HTTPS 应用场景Web性能优化 · Nginx配置 · CDN加速