HTTP版本演进1.0到3.0
HTTP 版本演进:1.0 → 1.1 → 2.0 → 3.0
版本演进总览
| 版本 | 年份 | 核心特性 | 缺陷 |
|---|---|---|---|
| HTTP/1.0 | 1996 | 短连接,每次请求断 TCP | 性能差,10 张图握手 10 次 |
| HTTP/1.1 | 1997 | 默认长连接、流水线、Host 虚拟主机、缓存 max-age | 队头阻塞(一个慢全部卡)、文本传输 |
| HTTP/2.0 | 2015 | 二进制帧、多路复用、HPACK 头部压缩、服务器推送 | TCP 层丢包阻塞整条连接 |
| HTTP/3.0 | 2022 | 底层换 UDP(QUIC)、0-RTT 快速握手、网络切换不断连 | 普及中,用户态实现 CPU 开销略高 |
通俗理解
- HTTP/1.0:每次打电话都要重新拨号
- HTTP/1.1:保持通话不断线,但对方只能一个一个回答问题
- HTTP/2.0:对方可以同时回答多个问题(多路复用),但电话线断了(TCP 丢包)所有问题都卡住
- HTTP/3.0:换了一条不会堵的线路(UDP),即使某条消息丢了,其他消息不受影响
版本演进图
graph LR H1["HTTP/1.0<br/>短连接<br/>每次请求断TCP"] --> H11["HTTP/1.1<br/>长连接 + 流水线<br/>队头阻塞"] H11 --> H2["HTTP/2.0<br/>二进制帧 + 多路复用<br/>TCP层队头阻塞"] H2 --> H3["HTTP/3.0<br/>QUIC over UDP<br/>0-RTT + 连接迁移"] H1 -.->|"解决: 连接复用"| H11 H11 -.->|"解决: 应用层队头阻塞"| H2 H2 -.->|"解决: TCP层队头阻塞"| H3
各版本详解
HTTP/1.0 — 短连接时代
每个请求都需要独立的 TCP 连接——三次握手 → 发请求 → 收响应 → 四次挥手。一个网页有 10 张图片?握手 10 次。
-
缺陷:连接建立/关闭开销大,性能差
-
改进方向:连接复用
HTTP/1.1 — 长连接 + 流水线
默认开启
Connection: keep-alive,多个请求复用同一个 TCP 连接。
| 特性 | 说明 |
|---|---|
| 长连接 | 多个请求共用一个 TCP 连接,避免重复握手 |
| 流水线 | 客户端可以连续发多个请求,不用等上一个响应 |
| Host 头 | 支持虚拟主机,一个 IP 可以托管多个域名 |
| 缓存控制 | Cache-Control: max-age 精确控制缓存 |
致命缺陷——队头阻塞(HOLB):虽然可以连续发请求,但服务器必须按序响应。如果第一个请求处理慢,后面的请求即使已准备好也得等。
详见 长连接与短连接与流水线。
HTTP/2.0 — 二进制帧 + 多路复用
| 特性 | 说明 |
|---|---|
| 二进制帧 | 不再是文本传输,拆成二进制 Frame,更高效 |
| 多路复用 | 一个 TCP 连接上多个请求并行传输,互不阻塞 |
| HPACK | 头部压缩,消除重复 Header 的冗余 |
| 服务器推送 | 服务器可以主动推送资源(CSS/JS)给客户端 |
关键局限:HTTP/2 解决了应用层的队头阻塞,但底层仍然是 TCP。TCP 保证按序交付——一个包丢了,所有 stream 都得等重传。这就是 TCP 层队头阻塞。
详见 2 多路复用。
HTTP/3.0 — QUIC over UDP
彻底换底层:从 TCP 换成 QUIC(基于 UDP),集成 TLS 1.3。
| 特性 | 说明 |
|---|---|
| QUIC 传输 | 基于 UDP,用户态实现,不需要改内核 |
| 0-RTT 握手 | 首次连接 1-RTT,重连 0-RTT(首个包就带数据) |
| 连接迁移 | 用 Connection ID 标识连接,WiFi→4G 切换不断连 |
| per-stream 独立 | 每个 stream 独立 ACK/重传,一个流丢包不阻塞其他流 |
详见 TCP与UDP区别 QUIC 部分。
❗ 易错点
HTTP/2 没有完全解决队头阻塞——只解决了应用层的;底层 TCP 丢包时,整条连接的所有请求都会被阻塞。HTTP/3 换 UDP(QUIC)才彻底解决。
速记卡(面试闪卡)
Q1:一句话讲清「HTTP版本演进1.0到3.0」到底是什么?
A:HTTP 从 1.0 到 3.0 的演进,本质不断解决连接复用与队头阻塞,最终把底层从 TCP 换成 QUIC over UDP。
Q2:HTTP 版本演进:1.0 → 1.1 → 2.0 → 3.0 —— 怎么理解?
A:像四次修路:1.0 短连接每次请求都握手太浪费;1.1 搞长连接+流水线但仍有应用层队头阻塞;2.0 多路复用解应用层;3.0 换 QUIC over UDP 解传输层。HTTP Evolution(HTTP 演进)。
Q3:HTTP/1.0 与 1.1 的核心差异 —— 怎么理解?
A:像从“每次重拨号”到“保持通话”:1.0 每请求独立 TCP,十张图握手十次;1.1 默认 keep-alive 复用连接,加 Host 头、流水线、Cache-Control。但服务器必须按序响应,慢请求卡住后面。Head-of-Line Blocking(队头阻塞)。
Q4:HTTP/2.0 多路复用解决了什么、没解决什么 —— 怎么理解?
A:像单车道扩多股道:2.0 把消息拆二进制帧、用 Stream ID 多路并行,加 HPACK 头部压缩与服务器推送。但它只解应用层阻塞,底层还是 TCP,一个包丢整条连接全卡(TCP 层 HOLB)。Multiplexing(多路复用)。
Q5:HTTP/3.0 为什么换底层 QUIC —— 怎么理解?
A:像换条不堵的线:3.0 把 TCP 换成 QUIC(基于 UDP)+TLS1.3,per-stream 独立丢包不堵其他流,0-RTT 快速重连,Connection ID 支持切网不断线。代价是用户态 CPU 略高。QUIC(快速 UDP 互联网连接)。
Q6:核心速记主线有哪些?
-
1.0 短连接太浪费,1.1 长连仍卡队头
-
2.0 二进制帧+多路复用,只解应用层阻塞
-
3.0 QUIC over UDP,解 TCP 层 HOLB + 0-RTT
-
易错:2.0 没彻底解决队头阻塞,3.0 不要 TCP
口诀
A:1.0 拨号太频繁,1.1 长连还卡队
2.0 多路解应用,底层 TCP 仍拖腿
3.0 换上 QUIC 船,丢包不掉队切网不断线
演进一路填坑来,队头阻塞是关键词