HTTP 版本演进概览
| 特性维度 | HTTP/1.0 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|---|
| 诞生年份 | 1996 | 1999 | 2015 | 2022 (标准化) |
| 基础协议 | TCP | TCP | TCP | QUIC (基于UDP) |
| 连接模型 | 短连接 | 持久连接 + 管道化 | 多路复用 | 多路复用 |
| 核心问题 | 连接开销大 | 队头阻塞 | TCP层队头阻塞 | 解决所有队头阻塞 |
| 数据格式 | 文本 | 文本 | 二进制分帧 | 二进制分帧 |
| 头部压缩 | 无 | 无 | HPACK | QPACK |
| 服务器推送 | 无 | 无 | 支持 | 支持 |
| 安全性 | 明文 | 明文 | 鼓励使用HTTPS | 内建加密 |
| 连接建立 | 慢 | 慢 | 慢 | 极快 (0-RTT/1-RTT) |
1. HTTP/1.0
这是第一个得到广泛使用的版本,但其设计非常基础。
核心特性与问题:
- 短连接: 每个 TCP 连接只处理一个请求-响应周期。完成後立即关闭连接。
- 巨大开销: 对于加载一个包含多个资源(图片、CSS、JS)的网页,需要反复建立和断开 TCP 连接(三次握手、四次挥手),导致延迟和性能极差。
示例: 加载一个有10个图片的页面,需要建立11个TCP连接(1个用于HTML,10个用于图片)。
2. HTTP/1.1
HTTP/1.1 是 HTTP/1.0 的重大改进,也是至今仍广泛使用的协议。
核心改进:
-
持久连接:
- 默认保持 TCP 连接打开,可以在同一个连接上发送多个请求和接收多个响应。
- 通过
Connection: keep-alive头部控制。 - 极大地减少了 TCP 连接建立和关闭的开销。
-
管道化:
- 允许客户端在同一个连接上连续发送多个请求,而无需等待之前的响应返回。
- 但致命缺陷: 服务器必须按照收到请求的顺序返回响应。这导致了 HTTP 层队头阻塞。
- 示例:请求1(慢)-> 请求2(快)。即使请求2先处理完,也必须等请求1的响应发送完毕,才能发送请求2的响应。
-
其他增强:
- 新增
PUT、DELETE、OPTIONS等方法。 - 引入
Host头,使虚拟主机(一个IP多个网站)成为可能。 - 更好的缓存控制(
Cache-Control、ETag)。
- 新增
遗留问题:
- 队头阻塞 是性能的主要瓶颈。
- 为了解决这个问题,浏览器通常会为同一个域名开启 6~8 个并行 TCP 连接,但这只是一种变通的优化方案。
3. HTTP/2
HTTP/2 专注于性能提升,目标是解决 HTTP/1.1 的固有瓶颈。它对开发者是透明的,无需改变现有 Web 应用代码。
核心改进:
-
二进制分帧层:
- 不再是人类可读的文本格式,而是将报文分解为更小的二进制帧。
- 帧是通信的最小单位,降低了解析复杂性,提高了效率。
-
多路复用:
- 这是最重大的改进。在同一个 TCP 连接上,可以同时交错地发送多个请求和响应帧。
- 每个请求/响应被分配一个唯一的流ID。
- 彻底解决了 HTTP 层队头阻塞: 慢请求不会阻塞快请求的响应。
-
头部压缩:
- 使用 HPACK 算法压缩头部,大大减少了冗余头部字段(如Cookie、User-Agent)带来的开销。
-
服务器推送:
- 服务器可以主动向客户端推送资源,而不是等客户端解析HTML后发现需要再请求。
- 示例:当客户端请求
index.html时,服务器可以同时把style.css和logo.png推送给客户端。
-
流优先级:
- 客户端可以为请求流指定优先级,提示服务器哪些资源更重要(如CSS优先于图片)。
遗留问题:
- TCP 层队头阻塞: HTTP/2 虽然解决了应用层的队头阻塞,但底层仍然使用 TCP。如果单个 TCP 包丢失,整个 TCP 连接都会暂停,等待重传,这会阻塞该连接上的所有 HTTP 流。
4. HTTP/3
HTTP/3 是下一代协议,它通过更换传输层协议来彻底解决队头阻塞问题。
核心变革:
-
从 TCP 切换到 QUIC:
- QUIC 是基于 UDP 的传输协议。它在内核层面实现了 TCP 的可靠性,同时增加了更多功能。
-
解决所有队头阻塞:
- 由于每个流在 QUIC 上都是独立的,单个数据包的丢失只会影响其所在的流,而不会影响其他流。
- 示例:流1(图片)的一个包丢失,只会暂停流1,流2(JS)和流3(CSS)会继续传输。
-
更快的连接建立:
- QUIC 将加密和传输握手合并,通常只需 0-RTT 或 1-RTT 就能建立安全连接,而 TCP+TLS 需要 1-3个 RTT。
-
内建的安全性:
- 加密不再是可选项,QUIC 协议本身就对所有 payload 进行了加密。
-
改进的头部压缩:
- 使用 QPACK 对 HTTP/3 的头部进行压缩,适应了乱序交付的特性。
总结与类比
为了更好地理解,我们可以用一个货运的类比:
-
HTTP/1.0 (短连接) :
- 像单次运输的卡车。运一箱货物到目的地后,空车返回,再运下一箱。效率极低。
-
HTTP/1.1 (持久连接+管道化) :
- 像一条单行线公路。多辆卡车可以依次上路,但第一辆卡车如果开得慢,后面的所有卡车都会被堵住。(队头阻塞)
-
HTTP/2 (多路复用) :
- 像一条多车道高速公路。所有卡车可以同时行驶,互不阻塞。但如果公路上发生了一起事故(TCP包丢失),整条高速公路都可能陷入瘫痪。(TCP层队头阻塞)
-
HTTP/3 (基于QUIC) :
- 像一个空中交通网络。每架飞机(数据流)都有自己独立的航线。即使一条航线上有气流(数据包丢失),其他航线上的飞机完全不受影响。
当前现状与建议
- HTTP/1.1: 仍然广泛支持,是兼容性的底线。
- HTTP/2: 目前的主流选择,绝大多数现代网站和CDN都已支持,能带来显著的性能提升。
- HTTP/3: 处于快速发展和部署阶段,Chrome、Firefox、Safari 等主流浏览器和 Cloudflare、Google 等大型服务商已支持。它是未来的方向。