HTTP/3 與 QUIC 協定深度解析:為什麼 Web 傳輸正在拋棄 TCP

技术架构(更新於 2026年5月16日)

HTTP/3 來了:Web 傳輸的第三次革命

版本 傳輸層 核心改進 年份
HTTP/1.1 TCP 持久連線、管線化 1997
HTTP/2 TCP 多路復用、標頭壓縮、伺服器推送 2015
HTTP/3 QUIC (UDP) 無隊頭阻塞、0-RTT、連線遷移 2022

HTTP/2 解決了 HTTP/1.1 的隊頭阻塞,卻把問題推到了 TCP 層。HTTP/3 直接換掉傳輸層,從根本上解決。


TCP 的根本問題:傳輸層隊頭阻塞

HTTP/2 的困境

HTTP/2 在一個 TCP 連線上多路復用多個串流,看似完美:

TCP 連線
  ├── Stream 1: HTML (封包 1, 2, 3)
  ├── Stream 2: CSS  (封包 4, 5)
  └── Stream 3: JS   (封包 6, 7, 8)

問題:如果封包 4 丟失,TCP 必須等封包 4 重傳成功後才能交付封包 5、6、7、8——即使它們屬於不同的串流且已經到達接收方。

Stream 1: ✅ ✅ ✅  (正常)
Stream 2: ✅ ❌ ⏳  (封包4丟失,封包5被阻塞)
Stream 3: ✅ ⏳ ⏳  (封包6、7被TCP阻塞,即使已到達)

實測影響:在 1% 丟包率下,HTTP/2 效能可能比 HTTP/1.1 還差(因為 HTTP/1.1 可以開多個 TCP 連線)。


QUIC 協定:從零設計的傳輸層

QUIC(Quick UDP Internet Connections)執行在 UDP 之上,重新實作了可靠性、擁塞控制、安全性。

核心特性一覽

特性 TCP + TLS 1.3 QUIC
握手延遲 1-RTT (首次) / 0-RTT (恢復) 1-RTT (首次) / 0-RTT (恢復)
隊頭阻塞 傳輸層存在 完全消除
連線遷移 不支援(四元組繫結) 原生支援(Connection ID)
流量控制 連線級 連線級 + 串流級
擁塞控制 核心實作 使用者態實作(可插拔)

特性一:0-RTT 握手

TCP + TLS 1.3 的握手過程

客戶端                                    伺服器
  |──── SYN ────────────────────────────→|  (1-RTT)
  |←─── SYN-ACK ────────────────────────|
  |──── ACK ────────────────────────────→|
  |──── ClientHello ────────────────────→|  (TLS 1-RTT)
  |←─── ServerHello + Certificate ──────|
  |──── Finished ───────────────────────→|
  |←─── Finished ───────────────────────|
  
總計:2-3 RTT 才能傳送資料

QUIC 的握手過程

客戶端                                    伺服器
  |──── CH (包含 TLS ClientHello) ──────→|  (1-RTT)
  |←─── SH (包含 TLS ServerHello) ──────|
  |──── 資料即可傳送 ──────────────────→|
  
總計:1-RTT 首次連線

0-RTT 恢復連線

客戶端                                    伺服器
  |──── CH + 0-RTT 資料 ───────────────→|  (0-RTT!)
  |←─── SH + 回應資料 ──────────────────|
  
總計:0-RTT 恢復連線,立即傳送資料

實測效果:0-RTT 讓頁面載入時間減少 100-300ms(取決於 RTT)。


特性二:消除隊頭阻塞

QUIC 的每個串流獨立排序、獨立交付:

QUIC 連線
  ├── Stream 1: 封包1 ✅ 封包2 ✅ 封包3 ✅  (正常交付)
  ├── Stream 2: 封包4 ✅ 封包5 ❌ 封包8 ✅  (封包5丟失,封包8正常交付)
  └── Stream 3: 封包6 ✅ 封包7 ✅ 封包9 ✅  (不受 Stream 2 影響)

Stream 2 的封包 5 丟失只阻塞 Stream 2,Stream 1 和 3 繼續正常交付。

效能對比

丟包率 HTTP/2 (TCP) HTTP/3 (QUIC) 提升幅度
0% 基準 基準 ~0%
0.1% -5% -1% 4%
1% -25% -5% 20%
2% -40% -8% 32%
5% -60% -15% 45%

結論:丟包率越高,QUIC 的優勢越明顯。


特性三:連線遷移

TCP 的困境

TCP 連線由四元組標識:(來源IP, 來源埠, 目的IP, 目的埠)

WiFi 連線: (192.168.1.5, 12345, 93.184.216.34, 443)
切換到 4G: (10.0.0.8, 12345, 93.184.216.34, 443)  ← 新四元組
→ TCP 連線斷開 → 重新握手 → 使用者體驗中斷

QUIC 的解決方案

QUIC 用 Connection ID 標識連線,與四元組解耦:

WiFi 連線: CID = 0x8312a... → 正常通訊
切換到 4G: CID = 0x8312a... → 同一連線,無縫遷移
→ 無需重新握手 → 使用者無感知

典型場景

  • 地鐵上 WiFi ↔ 4G 切換
  • 手機從室內 WiFi 走到室外
  • 雙卡雙待切換資料通道

特性四:使用者態擁塞控制

TCP 的擁塞控制在核心中實作,升級需要作業系統更新。QUIC 在使用者態實作,可以:

  • 快速迭代:新演算法無需等核心更新
  • 可插拔:不同連線使用不同演算法
  • 更精細:逐串流擁塞控制
// 虛擬碼:QUIC 擁塞控制可插拔
const connection = quic.connect({
  congestionControl: 'bbr',  // 或 'cubic', 'copa'
});

HTTP/3 的其他改進

QPACK 標頭壓縮

HTTP/2 的 HPACK 依賴 TCP 的有序交付,QUIC 下封包可能亂序到達。QPACK 解決了這個問題:

特性 HPACK (HTTP/2) QPACK (HTTP/3)
編碼方式 靜態表 + 動態表 + Huffman 靜態表 + 動態表 + Huffman
動態表更新 嚴格有序 可亂序(帶確認機制)
阻塞風險 動態表更新阻塞所有串流 僅阻塞使用該表項的串流

伺服器推送的替代

HTTP/3 廢棄了 HTTP/2 的 Server Push(實際效果不佳),推薦使用:

  • 103 Early Hints:預載入提示
  • Alt-Svc:協定升級提示
HTTP/1.1 103 Early Hints
Link: </style.css>; rel=preload; as=style
Link: </app.js>; rel=preload; as=script

HTTP/1.1 200 OK
Content-Type: text/html

部署 HTTP/3

Nginx 設定

server {
    listen 443 quic reuseport;
    listen 443 ssl;
    http2 on;

    ssl_certificate     /etc/ssl/cert.pem;
    ssl_certificate_key /etc/ssl/key.pem;

    # Alt-Svc 頭告知客戶端支援 HTTP/3
    add_header Alt-Svc 'h3=":443"; ma=86400';

    location / {
        proxy_pass http://backend;
    }
}

Cloudflare / CDN 方案

大多數 CDN 已預設支援 HTTP/3:

CDN HTTP/3 支援 設定方式
Cloudflare 預設開啟 儀表板 → Network → HTTP/3
CloudFront 預設開啟 無需設定
Akamai 預設開啟 產品設定
阿里雲 CDN 支援 控制台開啟

驗證 HTTP/3 是否生效

# curl 檢查
curl -I --http3 https://example.com

# Chrome 檢查
# DevTools → Network → 右鍵列頭 → 勾選 Protocol
# 顯示 h3 或 h3-29 表示成功

瀏覽器支援(2026 年)

瀏覽器 HTTP/3 支援 預設啟用
Chrome 87+
Firefox 107+
Safari 15+
Edge 87+

何時升級到 HTTP/3?

場景 推薦 原因
行動端使用者為主 強烈推薦 網路切換頻繁,連線遷移收益大
弱網環境 強烈推薦 丟包率高,消除隊頭阻塞
內網低延遲 可選 丟包率低,收益有限
長連線應用 推薦 0-RTT 減少重連開銷
純靜態站 可選 CDN 預設支援,無需額外設定

建議:如果你的站點已經使用 CDN,大機率已經在支援 HTTP/3 了——確認 Alt-Svc 頭即可。

#HTTP/3#QUIC#网络协议#性能优化