HTTP 版本演进:HTTP/0.9 到 HTTP/3,到底解决了什么问题?
面试速答(30 秒版 TL;DR)
- HTTP 版本演进本质上是在持续优化三件事:延迟、并发效率、传输可靠性。
HTTP/1.0的问题是默认短连接、能力简单;HTTP/1.1通过持久连接、Host 头等机制解决了很多实用问题。HTTP/2的核心是二进制分帧、多路复用、头部压缩、服务器推送;它解决了应用层队头阻塞前的一大批低效问题。HTTP/3最大变化不是“语法又改了”,而是底层从 TCP 换成了 QUIC/UDP,重点解决 传输层队头阻塞 和 连接迁移。- 面试别只背特性名,要能讲出“上一代的痛点是什么,下一代为什么这么设计”。
一条主线:每个版本都在修上一代的瓶颈
如果把演进逻辑讲成一句话:
HTTP/1.x主要在“文本协议 + TCP 连接效率”上打补丁;HTTP/2在应用层重构消息传输方式;HTTP/3则继续下探到底层传输协议。
1. HTTP/0.9:几乎只有“拿一个页面”
特点非常少:
- 只支持
GET - 没有请求头、响应头
- 没有状态码
- 响应内容基本就是 HTML 文本
它更像一个“能从服务器取页面”的最早形态,不适合现代 Web。
2. HTTP/1.0:开始像一个正式协议
HTTP/1.0 把现代 HTTP 的很多基础概念补上了:
- 请求方法不止
GET - 引入请求头和响应头
- 引入状态码
- 可以传多种内容类型,而不只是 HTML
但它有一个关键问题:
- 默认短连接。一次请求基本对应一次 TCP 连接,请求完就断。
这意味着一个页面要加载 HTML、CSS、JS、图片时,会频繁建连和断连,成本很高。
3. HTTP/1.1:工程上真正大规模可用的版本
HTTP/1.1 在面试里必须会,因为今天大量接口与站点仍在使用它。
核心改进
- 默认开启持久连接(Keep-Alive)
- 支持
Host头,允许同一 IP 承载多个域名 - 支持更丰富的缓存控制
- 支持分块传输(Chunked Transfer Encoding)
- 支持管线化(Pipelining,规范支持但实际少用)
为什么它依然不够好
即便有持久连接,HTTP/1.1 仍然面临两个问题:
- 同一连接内请求响应基本还是串行语义
- 浏览器通常要开多个 TCP 连接并发下载资源
这会带来:
- 连接数量多
- TCP/TLS 握手成本高
- 队头阻塞明显
这里要特别区分两个“队头阻塞”:
- HTTP/1.1 应用层队头阻塞:前一个请求没回来,后一个请求受影响
- TCP 传输层队头阻塞:丢包后后续字节流都得等
4. HTTP/2:把“报文传输方式”彻底重构
HTTP/2 不是把文本格式小修小补,而是引入了一套新的传输组织方式。
4.1 二进制分帧
HTTP/1.1 的报文是文本格式,HTTP/2 改成二进制帧,更适合机器解析。
4.2 多路复用
一条 TCP 连接里可以并发传多个流(stream),请求与响应被拆成很多帧交错传输。
4.3 头部压缩
HTTP 请求头经常重复,例如 Cookie、User-Agent、Accept 等。
HTTP/2 使用 HPACK 压缩,减少重复头部开销。
4.4 服务器推送
服务器可以主动推一些资源给客户端。
但实际工程中命中率、缓存协同、调试复杂度都不理想,所以后来并不是主流亮点。
HTTP/2 解决了什么,没解决什么
它解决了:
- 多连接竞争
- 应用层串行阻塞
- 头部重复传输
它没彻底解决:
- TCP 层队头阻塞
也就是说,一旦底层 TCP 某个包丢了,后续字节即使属于别的流,也得等重传。
5. HTTP/3:把底座换成 QUIC
HTTP/3 最大变化:
- 不再跑在 TCP 上
- 改跑在
QUIC over UDP上
为什么要这么做
因为 HTTP/2 的多路复用虽然做到了应用层并发,但底层还是一个 TCP 字节流。
只要 TCP 出现丢包重传,所有流都会受影响。
QUIC 的思路是:
- 在 UDP 之上自己实现可靠传输、拥塞控制、多路复用
- 把“不同流互相卡住”的问题尽量隔离
HTTP/3 的收益
- 降低传输层队头阻塞影响
- 建连更快,TLS 1.3 能更紧密地集成到 QUIC 握手
- 支持连接迁移,例如移动端从 Wi-Fi 切到 4G 时更友好
面试口径:
- HTTP/3 不是“HTTP 语义重写”,请求方法、状态码、头字段这些语义没变。
- 变化主要在传输层实现方式和性能表现上。
各版本对比
| 版本 | 关键特点 | 主要收益 | 主要问题 |
|---|---|---|---|
| HTTP/1.0 | 文本协议、默认短连接 | 奠定基础 | 连接成本高 |
| HTTP/1.1 | 默认长连接、Host、缓存增强 | 更适合真实网站 | 应用层队头阻塞、并发效率一般 |
| HTTP/2 | 二进制分帧、多路复用、HPACK | 提高单连接并发能力 | 仍受 TCP 队头阻塞影响 |
| HTTP/3 | QUIC、UDP、多路复用下沉到底层 | 更低延迟、抗阻塞、可迁移 | 协议栈更复杂 |
高频题标准答法
1. HTTP/2 一定比 HTTP/1.1 快吗?
不一定。
如果站点很简单、连接复用收益不明显、网络环境一般,收益可能有限;但对资源多、请求多、延迟敏感的网站,HTTP/2 通常更有优势。
2. HTTP/2 已经多路复用了,为什么还需要 HTTP/3?
因为 HTTP/2 的多路复用发生在应用层,但底层还是 TCP。
TCP 一旦丢包,后续字节流都得等重传,这就是传输层队头阻塞。HTTP/3 用 QUIC 继续解决这个问题。
3. HTTP/3 为什么基于 UDP 还能可靠?
因为“不可靠”是 UDP 的默认能力,不代表基于 UDP 的上层协议不能自己补可靠性。
QUIC 自己实现了确认、重传、流控、拥塞控制等机制。
4. 浏览器和服务器用了 HTTP/3,前端代码需要改吗?
大多数场景不需要。
因为业务层看到的还是 HTTP 语义:URL、方法、状态码、头、Cookie 等基本保持一致。
易错点 / 坑
- 把 HTTP/2 的“多路复用”说成彻底消灭所有队头阻塞。
- 把 QUIC 说成“UDP 的一个别名”;它其实是构建在 UDP 上的完整传输协议。
- 认为 HTTP/3 改了请求/响应语义。大多数语义没变,变的是底层传输实现。
- 把 HTTP/1.1 的管线化和 HTTP/2 的多路复用混为一谈。
速记要点(可背诵)
- HTTP 演进核心:降低延迟、提高并发、减少阻塞。
- HTTP/1.1 解决短连接问题;HTTP/2 解决应用层并发问题;HTTP/3 继续解决传输层阻塞问题。
- HTTP/2 = 二进制分帧 + 多路复用 + 头部压缩。
- HTTP/3 = QUIC over UDP,重点是更快建连和更好的抗阻塞能力。