外观
HTTP 版本演进:从 1.0 到 3
约 1175 字
HTTP/1.1 活了二十多年,HTTP/2 普及了快十年,HTTP/3 也开始铺开。 每个版本都是为了解决上一个版本的「疼」。按「问题→解法」的顺序讲, 比背时间线有用。
一、HTTP/1.0:用完就散
1996 年的规矩:一个请求一个 TCP 连接,响应完了连接就关。
请求 HTML ──► 连接1 ──► 响应完关闭
请求 CSS ──► 连接2 ──► 响应完关闭
请求 JS ──► 连接3 ──► 响应完关闭一个页面十个资源?建十个连接,关十个连接。TCP 三次握手的开销 付了十遍。慢,而且浪费 —— 那个年代带宽小,感觉不明显, 后来页面越来越重,问题就藏不住了。
二、HTTP/1.1:Keep-Alive 与管道
1999 年的 1.1 修了两个问题:
1. 持久连接(Keep-Alive)
连接不关了,复用:
连接1:请求 HTML → 请求 CSS → 请求 JS → …(都走同一个连接)响应头 Connection: keep-alive。TCP 握手只付一次, 十个资源省九次。这是 1.1 最大的贡献,也是它长寿的原因。
2. 其他改进
- 管道化(Pipelining):不等上一个响应,连续发多个请求 —— 理论美好,实际因为「响应必须按顺序返回」,头部阻塞问题还在, 浏览器基本没用起来;
- 缓存控制:
Cache-Control、ETag登场(详见 HTTP 缓存详解); - Host 头:同一 IP 能托管多个域名,虚拟主机的基础。
遗留问题:队头阻塞
虽然连接能复用,但一个连接上的响应必须排队:
请求1(大图,10秒)→ 请求2(小CSS)→ 请求3(JS)
↑ 请求1 没返回,请求2、3 干等着浏览器解法很粗暴:对同一域名开 6-8 个 TCP 连接并行下载。 但连接一多,TCP 拥塞控制又互相踩脚。凑合能用,但别扭。
三、HTTP/2:多路复用
2015 年,基于 Google 的 SPDY。核心就一招:多路复用。
一个 TCP 连接上,请求和响应拆成「帧」,乱序发送、按流 ID 组装:
连接1:
流1(HTML):帧1 帧5 帧9…
流3(CSS):帧2 帧6…
流5(JS) :帧3 帧7…
→ 三个流并行,互不等待队头阻塞没了。派生改进:
- 头部压缩(HPACK):HTTP 头大量重复(Cookie、User-Agent…), 用索引表压缩,省 50%-90% 头部流量;
- 服务端推送:服务端主动推资源(实践里太容易过度推送,后来衰了);
- 流优先级:CSS 优先于图片,浏览器说了算。
HTTP/2 的暗疾:多路复用治了 HTTP 层的队头,但TCP 层的队头阻塞 还在 —— 一个 TCP 连接上丢包,所有流一起等重传。大文件下载场景 尤其明显。这坑留给了 HTTP/3。
四、HTTP/3:换掉 TCP,上 QUIC
2018 年标准化,2022 年起各大厂铺开。核心思路: 不修 TCP 了,直接换传输层。
基于 QUIC 协议(Quick UDP Internet Connections):
- 跑在 UDP 上:没有 TCP 的握手和队头阻塞,自己实现可靠传输;
- 流独立:一个流丢包,只影响这个流(TCP 是全体干等);
- 连接迁移:用连接 ID 标识连接,手机 WiFi 切 4G 不断线 (TCP 靠四元组标识,网络一换连接就死);
- 握手更快:QUIC 把「TCP 握手 + TLS 握手」合成一轮, 首次连接 1-RTT,重连 0-RTT。
代价:UDP 在部分企业网络/防火墙上被限速或封锁(改协议的痛), 服务端和 CDN 要专门支持。所以现状是 HTTP/2 主流,HTTP/3 增长中。
五、一张对比表
| 特性 | 1.0 | 1.1 | 2 | 3 |
|---|---|---|---|---|
| 连接复用 | ❌ | ✅ Keep-Alive | ✅ 多路复用 | ✅ QUIC 流 |
| 队头阻塞 | 连接级 | 请求级 | HTTP 层没了,TCP 层还在 | 流级隔离 |
| 头部压缩 | ❌ | ❌ | ✅ HPACK | ✅ QPACK |
| 传输层 | TCP | TCP | TCP | UDP(QUIC) |
| 加密 | 可选 | 可选 | 实际都 TLS | 强制 TLS 1.3 |
| 连接迁移 | ❌ | ❌ | ❌ | ✅ |
六、和前端的关系
大部分优化浏览器和 CDN 替你做了,但有两件事要知道:
- 域名分片技术过时了:HTTP/1.1 时代把资源撒多个域名增加并行连接, HTTP/2 下反而是负优化(多连接浪费)。别学老教程;
- 升级 HTTP/2+ 就够:Nginx 一行
listen 443 ssl http2;, CDN 上点个开关。真上了 HTTP/3,体验提升在弱网和移动端明显。
小结
演进主线:1.0 短连接浪费 → 1.1 复用连接但排队 → 2 多路复用不排队 → 3 换 UDP 根治传输层阻塞。每步都是被上一个版本的疼逼出来的。 面试问到就说这条线,比背版本号生动得多。