HTTP进化史:从1.0到3.0的核心变革
引言
前面五篇我们讲了 HTTP 的报文结构、缓存、Cookie/Session/Token、HTTPS 加密和 TLS 握手。这些都是基于 HTTP/1.1 的。但 HTTP 已经发展了三十多年,从最初的 0.9 到如今的 3.0,经历了巨大变革。
HTTP/1.1 最大的痛点是队头阻塞——一个连接上只能同时处理一个请求,必须排队。HTTP/2 用多路复用解决了这个问题,HTTP/3 更进一步换掉了底层的 TCP,用QUIC(基于 UDP)实现了 0-RTT 连接和彻底的队头阻塞消除。
本文将系统讲解 HTTP 各版本的核心改进和原理。
第一部分:HTTP/1.0 — 短连接时代
一、主要特性
HTTP/1.0 相比 0.9 的重大改进:
引入了请求头和响应头
增加了 POST、HEAD 方法
引入了状态码
支持多种 Content-Type
二、致命缺陷:短连接
第二部分:HTTP/1.1 — 长连接与管道化
一、核心改进
| 改进 | 说明 |
|---|---|
| 长连接 | Connection: keep-alive(默认),一个连接可以发多个请求 |
| Host 头 | 一台服务器托管多个网站 |
| 管道化 | 不必等上一个响应回来就能发下一个请求 |
| 分块传输 | Transfer-Encoding: chunked,动态内容边生成边发送 |
| 缓存增强 | Cache-Control、ETag |
| 范围请求 | Range: bytes=0-1023,断点续传 |
二、长连接 vs 短连接
三、管道化(Pipelining)
四、HTTP/1.1 的队头阻塞
管道化的致命缺陷:响应必须按顺序返回。如果第一个请求的响应很慢(比如查数据库耗时 3 秒),后面的请求全被堵住。
第三部分:HTTP/2 — 多路复用
一、HTTP/2 的核心改进
| 改进 | 说明 |
|---|---|
| 二进制分帧 | 不再用文本,改用二进制帧 |
| 多路复用 | 一个连接并发处理多个请求/响应 |
| 头部压缩 | HPACK 算法压缩请求头/响应头 |
| 服务器推送 | 服务器可以主动推送资源给浏览器 |
| 流优先级 | 可以指定资源加载优先级 |
二、二进制分帧
HTTP/2 把报文拆成帧(Frame),每个帧属于一个流(Stream)。不同流的帧可以交错传输。
三、多路复用解决队头阻塞
四、头部压缩
HTTP/1.1 每次请求都携带完整头部,Cookie 和 User-Agent 等每次重复传输。HTTP/2 用HPACK算法压缩头部:
第一次传输完整的头部
后续只传输变化的字段
双方维护一个"字典",用索引代替完整字符串
五、服务器推送
六、HTTP/2 的队头阻塞(TCP 层面的)
HTTP/2 解决了 HTTP 层面的队头阻塞,但TCP 层面仍然存在队头阻塞。TCP 是可靠传输,一个包丢了,后续所有包都要等它重传——即使它们属于不同的流。
第四部分:HTTP/3 — QUIC 协议
一、HTTP/3 的核心改变:换掉 TCP
HTTP/3 不再使用 TCP,改用QUIC(基于 UDP)。
二、QUIC 的核心优势
三、各版本对比
| 对比项 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| 传输层 | TCP | TCP | UDP(QUIC) |
| 多路复用 | ❌ | ✅ | ✅ |
| 队头阻塞 | HTTP 层面 | TCP 层面 | 无 |
| 头部压缩 | 无 | HPACK | QPACK |
| 服务器推送 | ❌ | ✅ | ✅ |
| 连接迁移 | ❌ | ❌ | ✅ |
| 首次连接 | 3-RTT | 3-RTT | 1-RTT |
| 再次连接 | 3-RTT | 3-RTT | 0-RTT |
第五部分:面试题
1. Q:HTTP/1.1 和 HTTP/2 的主要区别?
A:HTTP/2 支持多路复用(一个连接并发多个请求)、头部压缩(HPACK)、服务器推送。HTTP/1.1 的管道化存在队头阻塞,HTTP/2 通过二进制分帧和流解决了这个问题。
2. Q:HTTP/2 和 HTTP/3 的区别?
A:HTTP/3 把底层从 TCP 换成了 QUIC(UDP)。QUIC 在用户态实现,内置 TLS 1.3,彻底解决了 TCP 层面的队头阻塞,支持 0-RTT 连接和连接迁移。
3. Q:HTTP/1.1 的队头阻塞和 HTTP/2 的队头阻塞有什么不同?
A:HTTP/1.1 的队头阻塞在 HTTP 层面(响应必须按顺序返回),HTTP/2 的队头阻塞在 TCP 层面(一个 TCP 包丢了,所有流都要等重传)。HTTP/3 彻底消除了队头阻塞。
4. Q:为什么 HTTP/3 基于 UDP 而不是 TCP?
A:TCP 在内核中实现,修改困难(二十多年才升级一次)。QUIC 在用户态实现,可以快速迭代。QUIC 在 UDP 之上实现了可靠传输、拥塞控制、TLS 加密,而且彻底解决了 TCP 的队头阻塞和连接迁移问题。
总结
一、版本演进核心
HTTP/1.0 → HTTP/1.1:长连接 + 管道化
HTTP/1.1 → HTTP/2:多路复用 + 头部压缩
HTTP/2 → HTTP/3:QUIC(UDP)替代 TCP,彻底解决队头阻塞
二、一句话记忆
HTTP/1.1 长连接但队头阻塞,HTTP/2 多路复用解决 HTTP 层面阻塞但仍有 TCP 层面阻塞,HTTP/3 用 QUIC 换掉 TCP 彻底消除队头阻塞并支持 0-RTT 和连接迁移。
