跳至主要內容
Skip to content

HTTP 版本演進史:從 0.9 到 3 的進化之路

HTTP 協定從 1991 年誕生至今已經歷四個主要版本。每一次版本演進都是為了解決上一代的痛點,同時適應不斷變化的網路環境。本篇將帶你走過這段精彩的進化之路。


一、 版本總覽

版本年份核心改進
HTTP/0.91991最初版本,只有 GET
HTTP/1.01996加入 Headers、狀態碼
HTTP/1.11997持久連線、Pipeline
HTTP/22015多路複用、二進位
HTTP/32022基於 QUIC/UDP

二、 HTTP/0.9:一切的起點(1991)

HTTP/0.9 是 Tim Berners-Lee 在 CERN 設計的最初版本,極其簡單。

特點

  • 只有 GET 方法
  • 沒有 Headers
  • 沒有狀態碼
  • 只能傳輸 HTML
  • 每次請求都開新連線

請求格式

GET /index.html

就這樣,一行搞定。沒有版本號、沒有 Headers。

回應格式

html
<html>
  <body>
    Hello World
  </body>
</html>

直接回傳 HTML 內容,沒有任何元資料。

NOTE

HTTP/0.9 有時被稱為「單行協定」(The One-Line Protocol),因為請求真的只有一行。


三、 HTTP/1.0:成熟的開始(1996)

HTTP/1.0 加入了許多我們今天熟悉的特性。

核心改進

  1. 版本號:請求行加入 HTTP/1.0
  2. Headers:可以傳遞元資料
  3. 狀態碼:伺服器可以告知請求結果
  4. Content-Type:不再只限 HTML
  5. POST/HEAD 方法

請求範例

http
GET /index.html HTTP/1.0
User-Agent: Mozilla/1.0
Accept: text/html

回應範例

http
HTTP/1.0 200 OK
Date: Tue, 15 Nov 1996 08:12:31 GMT
Content-Type: text/html
Content-Length: 1234

<html>...</html>

主要問題:短連線

問題:每個請求都需要新建 TCP 連線,開銷巨大。


四、 HTTP/1.1:堅實的標準(1997)

HTTP/1.1 是使用時間最長、最穩定的版本,至今仍被廣泛使用。

核心改進

1. 持久連線(Keep-Alive)

預設不關閉連線,可復用同一個 TCP 連線:

http
Connection: keep-alive

2. 管線化(Pipelining)

可以連續發送多個請求,不用等待回應:

WARNING

管線化有「隊頭阻塞」(Head-of-Line Blocking) 問題:如果第一個請求很慢,後面的都要等。因此實際上瀏覽器很少使用。

3. Host 標頭(必填)

支援虛擬主機:

http
GET /page HTTP/1.1
Host: www.example.com

4. 分塊傳輸(Chunked Transfer)

http
Transfer-Encoding: chunked

允許伺服器在不知道內容長度的情況下開始回應。

5. 更多方法

  • PUT、DELETE、OPTIONS、TRACE

HTTP/1.1 的問題

問題說明
隊頭阻塞必須按順序處理請求
Headers 冗餘每次都傳完整 Headers
無優先級無法指定資源重要性
文字協定解析效率低

为了繞過這些限制,瀏覽器的做法是:開多個連線(通常 6 個)。


五、 HTTP/2:效能革命(2015)

HTTP/2 基於 Google 的 SPDY 協定,是一次重大的效能升級。

核心改進

1. 二進位協定

從文字變成二進位幀(Frame):

HTTP/1.1:  GET /index.html HTTP/1.1\r\n
HTTP/2:    [HEADERS Frame][DATA Frame]

優點:

  • 解析更快
  • 更緊湊
  • 更少錯誤

2. 多路複用(Multiplexing)

一個連線同時處理多個請求,徹底解決隊頭阻塞:

3. Header 壓縮(HPACK)

使用 HPACK 演算法壓縮重複的 Headers:

# HTTP/1.1 每次都傳完整 Headers
User-Agent: Mozilla/5.0 (很長的字串)...
Accept: text/html,application/xhtml+xml...

# HTTP/2 使用索引
User-Agent: [index: 62]
Accept: [index: 19]

壓縮率可達 85% 以上。

4. 伺服器推送(Server Push)

伺服器可以主動推送資源:

NOTE

Server Push 實際使用較少,因為難以控制且可能浪費頻寬。Chrome 已在 2022 年移除支援。

5. 流優先級

可以指定資源的優先順序:

Stream 1 (HTML): 權重 256
Stream 3 (CSS):  權重 128
Stream 5 (圖片): 權重 32

HTTP/2 的問題

雖然解決了應用層的隊頭阻塞,但 TCP 層的隊頭阻塞仍然存在:

一個封包丟失,整個 TCP 連線都要等待重傳。


六、 HTTP/3:QUIC 革命(2022)

HTTP/3 徹底拋棄 TCP,改用基於 UDP 的 QUIC 協定。

為什麼要放棄 TCP?

TCP 的問題HTTP/3 的解決方案
隊頭阻塞QUIC 獨立流
握手延遲0-RTT 連線
中間設備僵化UDP 穿透
連線遷移困難Connection ID

核心特性

1. 基於 UDP + QUIC

2. 零隊頭阻塞

每個 Stream 獨立,一個流丟包不影響其他流:

Stream 2 丟包,Stream 1 和 3 不受影響,繼續傳輸。

3. 0-RTT 連線建立

首次連線:1 RTT(同時完成加密握手) 重連:0 RTT(直接發送資料)

4. 連線遷移

使用 Connection ID 而非 IP:Port 識別連線:

# TCP: IP 變了就斷線
192.168.1.1:12345 → 斷線 → 重連

# QUIC: Connection ID 不變就不斷線
手機 WiFi → 4G → 無縫切換

HTTP/3 採用現狀

主流網站支援情況(2024):
✅ Google
✅ Facebook
✅ Cloudflare
✅ YouTube

七、 版本比較

效能對比

特性HTTP/1.1HTTP/2HTTP/3
連線數量多個1 個1 個
隊頭阻塞存在應用層解決完全解決
Header 壓縮HPACKQPACK
加密可選實際必須內建
握手延遲2-3 RTT2-3 RTT0-1 RTT

協定棧對比

HTTP/1.1        HTTP/2          HTTP/3
┌─────────┐    ┌─────────┐    ┌─────────┐
│  HTTP   │    │  HTTP/2 │    │  HTTP/3 │
├─────────┤    ├─────────┤    ├─────────┤
│  TLS    │    │  TLS    │    │  QUIC   │
├─────────┤    ├─────────┤    │ (含 TLS)│
│   TCP   │    │   TCP   │    ├─────────┤
├─────────┤    ├─────────┤    │   UDP   │
│   IP    │    │   IP    │    ├─────────┤
└─────────┘    └─────────┘    │   IP    │
                              └─────────┘

總結

版本一句話總結
HTTP/0.9能用就好
HTTP/1.0有模有樣
HTTP/1.1穩定可靠
HTTP/2效能飛躍
HTTP/3未來已來

> **選擇建議**:

  • 新專案:直接上 HTTP/2,搭配 CDN 支援 HTTP/3
  • 現有專案:確保至少使用 HTTP/1.1 with TLS
  • API 服務:HTTP/2 是最佳選擇

進階挑戰

  1. 使用 Chrome DevTools 的 Network 面板,觀察你常用網站使用的 HTTP 版本(Protocol 欄位)。
  2. 使用 curl --http2curl --http3 測試不同版本的差異。
  3. 思考:為什麼 HTTP/3 選擇基於 UDP 而不是改進 TCP?改進 TCP 會遇到什麼困難?

延伸閱讀與資源