HTTP 优化
HTTP 1.0 → 1.1 的改进
1. 缓存控制增强
| 版本 | 机制 | 字段 |
|---|---|---|
| 1.0 | 时间戳判断,依赖服务器时钟 | If-Modified-Since、Expires |
| 1.1 | 内容摘要判断,更精准 | ETag、If-None-Match、If-Match、If-Unmodified-Since |
2. 增加了 Request 方法,有OPTIONS, PUT, DELETE, TRACE, CONNECT
3. 必须存在 Host 首部
- HTTP 1.0 默认一个 IP 对应一台服务器,无需 Host。随着虚拟主机兴起,同一 IP 可托管多个域名,Host 头用于区分目标主机
- 请求中若缺少 Host 头,服务器必须返回
400 Bad Request
4. range
客户端可只请求资源的某一段,服务器返回
206 Partial Content。用途:断点续传、多线程下载、视频拖拽播放。
5. 长连接(keep-alive)
- 问题:HTTP 1.0 每次请求都要建立 + 断开 TCP,三次握手四次挥手开销大。
- 方案:默认开启持久连接,只要双方未明确断开(
Connection: close),TCP 连接持续复用。
6. 管线化(Pipelining)
- 基于长连接,客户端可以不等响应就连续发送多个请求。
1.0: 请求A → 等待 → 响应A → 请求B → 等待 → 响应B
1.1: 请求A → 请求B → 请求C → 响应A → 响应B → 响应C

- 队首阻塞:HTTP 1.x 只能严格串行地返回响应,若响应A延迟,B、C 即使处理完也得等
使用多个 TCP 连接,每个客户端最多可以开启 6 个 TCP 连接
HTTP 1.x → 2.0 的改进
1. 二进制分帧层
HTTP 1.x 基于文本,HTTP 2.0 引入二进制分帧,定义了三个概念:
TCP 连接
└── 流(Stream):一个逻辑通道,有唯一 ID,双向
└── 消息(Message):对应一次 HTTP 请求或响应
└── 帧(Frame):最小传输单位,携带帧类型、流 ID 等
所有通信在一条 TCP 连接上完成,帧可乱序发送,接收端按流 ID 重组。

2. 多路复用
基于二进制分帧,同一 TCP 连接上可以并行交错发送多个请求/响应,互不干扰。
彻底解决了 HTTP 层的队头阻塞(但 TCP 层的队头阻塞仍存在,由 HTTP/3 解决)。
TCP 层对头阻塞:
TCP 是可靠传输协议,数据包必须按序到达 假设有 A、B、C 三个流在同一 TCP 连接上传输: [流A-帧1] [流B-帧1] [流C-帧1] [流A-帧2] ← 丢包! ↑ B 和 C 的数据已经到了,但 TCP 不允许越过丢失的包交付 → 所有流全部卡住,等待 A-帧2 重传
3. 头部压缩(HPACK 算法)
客户端和服务端各维护一张动态头部表:
- 首次请求:发送完整头部,双端同步记录
- 后续请求:相同的头部只发索引值,不重复传输
效果:大幅减少重复头部(如 Cookie、User-Agent)的传输开销。
HTTP 2.0 → 3.0 的改进
HTTP/3 将传输层从 TCP 换成 QUIC(基于 UDP),在应用层自己实现可靠传输,每个流独立,彻底解决 TCP 队头阻塞。同时 QUIC 内置 TLS,握手从 2-RTT 降至 1-RTT,首次连接后可 0-RTT。