什么是 HTTP/2?
HTTP/2 是 HTTP 协议的一次重大修订(标准化为 RFC 7540),引入二进制分帧、多路复用、标头压缩和服务器推送等机制,相比 HTTP/1.1 大幅提升 Web 性能。HTTP/2 与 HTTP/1.1 的比较
| 特性 | HTTP/1.1 | HTTP/2 |
|---|---|---|
| 格式 | 基于文本 | 二进制 |
| 连接 | 多个(每个主机 6-8 个) | 单个多路复用连接 |
| 请求处理 | 顺序处理 | 并行流 |
| 标头压缩 | 无 | HPACK 压缩 |
| 服务器推送 | 不支持 | 支持 |
| 优先级 | 无 | 流优先级 |
HTTP/2 的工作方式
HTTP/1.1 (Head-of-Line Blocking):
Connection 1: Request A ──────────► Response A
Connection 2: Request B ──────────► Response B
Connection 3: Request C ──────────► Response C
(Multiple connections, sequential per connection)
HTTP/2 (Multiplexing):
Single Connection:
├── Stream 1: Request A ──► Response A
├── Stream 2: Request B ──► Response B
├── Stream 3: Request C ──► Response C
└── All interleaved on same connection
主要特性
二进制分帧层
HTTP/2 Frame Structure:
┌─────────────────────────────────────┐
│ Length (24 bits) │
├─────────────────────────────────────┤
│ Type (8 bits) │ Flags (8 bits) │
├─────────────────────────────────────┤
│ Stream Identifier (32 bits) │
├─────────────────────────────────────┤
│ Frame Payload (variable) │
└─────────────────────────────────────┘
HPACK 标头压缩
| 场景 | HTTP/1.1 标头 | HTTP/2 标头 |
|---|---|---|
| 首次请求 | ~800 字节 | ~800 字节 |
| 后续请求 | 每次约 ~800 字节 | ~20-50 字节(已索引) |
流优先级
Priority Tree:
Root (connection)
├── CSS (weight: 256, high priority)
├── JavaScript (weight: 220)
└── Images (weight: 110, lower priority)
服务器要求
| 服务器 | HTTP/2 支持 |
|---|---|
| nginx | 1.9.5+ |
| Apache | 2.4.17+ (mod_http2) |
| Node.js | 8.4+ (native) |
| IIS | Windows 10/Server 2016+ |
性能收益
- 降低延迟:单个连接消除了 TCP 握手开销
- 更高压缩率:重复请求的标头大小可减少 85-90%
- 并行加载:所有资源可以同时加载
- 服务器推送:在浏览器请求前主动发送资源
最佳实践
1. 启用 TLS:HTTP/2 实际上要求 HTTPS(浏览器会强制执行)
2. 减少域名分片:多个域名现在反而会损害性能
3. 停止拼接文件:多路复用降低了打包的必要性
4. 谨慎使用服务器推送:只推送关键资源
5. 监控性能:验证 HTTP/2 是否改善了具体使用场景
HTTP/2 通过更高效地利用网络连接,为大多数网站带来显著的性能提升。