15-5.【HTTP】HTTP1.1 与 HTTP2/3 的差异?

3 阅读3分钟

从 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,改用基于 UDPQUIC 协议。

  • 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.1HTTP/2HTTP/3
底层传输协议TCPTCPUDP (QUIC)
传输格式文本 (Text)二进制 (Binary)二进制 (Binary)
多路复用无(有队头阻塞)有(解决应用层阻塞)有(解决传输层阻塞)
头部压缩HPACKQPACK
建立连接耗时较长 (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)