从 HTTP/1.1 到 HTTP/3 的演进,本质上是互联网在不断解决延迟(Latency)和传输效率的问题。
1. HTTP/1.1:经典的管道模式
HTTP/1.1 是目前应用最广泛的协议,但它存在一个致命的弱点:队头阻塞(Head-of-Line Blocking) 。
- 文本协议:数据以 ASCII 文本格式传输,解析效率较低。
- 串行传输:虽然支持持久连接(Keep-Alive),但在同一个 TCP 连接上,必须等前一个请求响应完,才能发送下一个。
- 解决手段:为了加速加载,浏览器通常会为同一个域名开启 6-8 个 TCP 连接。
2. HTTP/2:二进制与多路复用
HTTP/2 在 2015 年发布,主要目标是提高页面加载速度。它在底层依然使用 TCP。
- 二进制分帧(Binary Framing) :不再传输文本,而是将数据切分成更小的二进制帧。
- 多路复用(Multiplexing) :最核心改进。允许在同一个 TCP 连接上并发发送多个请求和响应,不再需要按顺序等待。
- 头部压缩(HPACK) :使用索引表压缩重复的 HTTP Header(如 User-Agent),节省带宽。
- 服务器推送(Server Push) :服务器可以在客户端请求 HTML 时,主动把 CSS 和 JS 发过去。
缺陷:虽然解决了 HTTP 层的队头阻塞,但如果 TCP 层丢了一个包,整个连接的所有请求都会卡住等待重传。
3. HTTP/3:基于 UDP 的革命
HTTP/3 是为了彻底解决 TCP 的局限性而诞生的,它抛弃了 TCP,改用基于 UDP 的 QUIC 协议。
- QUIC 协议:在 UDP 之上实现了可靠传输、流量控制和加密。
- 无队头阻塞:即使某个 UDP 包丢了,只会影响那一个流(Stream),其他数据流依然可以正常传输。
- 极速握手:将 TLS 握手和连接握手合并。TCP + TLS 需要 2-3 个 RTT(往返时间),而 QUIC 通常只需要 0-1 个 RTT。
- 连接迁移:当你从 Wi-Fi 切换到 5G 时,TCP 连接会断开(因为 IP 变了),但 HTTP/3 使用 Connection ID 识别用户,可以无缝切换而不中断请求。
核心差异对比表
| 特性 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| 底层传输协议 | TCP | TCP | UDP (QUIC) |
| 传输格式 | 文本 (Text) | 二进制 (Binary) | 二进制 (Binary) |
| 多路复用 | 无(有队头阻塞) | 有(解决应用层阻塞) | 有(解决传输层阻塞) |
| 头部压缩 | 无 | HPACK | QPACK |
| 建立连接耗时 | 较长 (TCP+TLS) | 较长 (TCP+TLS) | 极快 (0-1 RTT) |
| 网络切换稳定性 | 差(需重连) | 差(需重连) | 极好(支持连接迁移) |
在 iOS 开发中的体现
在 iOS 中,你不需要手动去实现这些复杂的逻辑,URLSession 已经为你打理好了一切:
- 自动升级:只要服务器支持,
URLSession会自动协商使用 HTTP/2 或 HTTP/3。 - 启用 HTTP/3:在最新的 iOS 版本中,你可以通过配置
URLSessionConfiguration来显式开启或测试 QUIC 支持。
Swift
let config = URLSessionConfiguration.default
// 在某些 iOS 版本中需要开启实验性支持或依赖服务器的 Alt-Svc 响应
config.multipathServiceType = .handover // 优化 Wi-Fi/蜂窝切换
let session = URLSession(configuration: config)