HTTP/1.1、HTTP/2、HTTP/3的差異:傳輸層、多工、隊頭阻塞、標頭壓縮與加密比較
三個版本共用方法、狀態碼、標頭等HTTP的語意(RFC 9110),差別在於以什麼形式、透過什麼通訊路徑來傳送。HTTP/1.1(RFC 9112)以TCP傳送文字訊息,在一條連線上依序一個一個回傳回應。HTTP/2(RFC 9113)把訊息分成二進位的訊框,在一條TCP連線上多工傳送多個串流。HTTP/3(RFC 9114)使用在UDP上運作的QUIC(RFC 9000),在傳輸層進行串流的多工與TLS 1.3加密。因此能避免TCP的隊頭阻塞,也就是1個封包遺失就讓所有串流都必須等待的情形。
| 項目 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| 規格 | RFC 9112(語意為三個版本共用的RFC 9110) | RFC 9113 | RFC 9114(QUIC為RFC 9000) |
| 傳輸層 | TCP | TCP | QUIC(在UDP上運作) |
| 訊息格式 | 文字。請求列與標頭逐行書寫 | 二進位的訊框 | 二進位的訊框(在QUIC的串流上) |
| 多工 | 無。一條連線依序一次處理一組請求與回應。要平行取得時,需建立多條連線 | 在一條TCP連線上平行傳送多個串流 | 平行傳送QUIC的多個串流。串流由傳輸層管理 |
| 隊頭阻塞 | 發生在HTTP層。在同一條連線上,前一個回應結束之前無法回傳下一個(即使使用管線化,回應也要依請求的順序回傳) | 在HTTP層已解決。但TCP會依序交付位元組,因此只要遺失1個封包,所有串流都要等待重傳 | QUIC以串流為單位管理順序,因此遺失的影響只限於含有遺失資料的串流 |
| 標頭壓縮 | 無(本文可以壓縮,但標頭以文字原樣傳送) | HPACK(RFC 7541) | QPACK(RFC 9204)。為了在串流順序對調抵達時也能使用而改良HPACK |
| 加密 | 選用。https使用TLS,http則以明文傳送 | 規格同時定義TLS上(h2)與明文(h2c)兩種。使用TLS時須為TLS 1.2以上。主要瀏覽器只支援TLS上的HTTP/2 | 必要。QUIC內建TLS 1.3,沒有明文通訊 |
| 建立連線所需的往返 | TCP需1個往返,使用TLS 1.3再加1個往返,共2個往返之後才送出請求 | 與HTTP/1.1相同(TCP與TLS共2個往返) | QUIC把傳輸與加密的交握合併為1個往返。對以前連線過的伺服器,也能使用從第一次傳送就送出資料的0-RTT |
| 網路改變時 | TCP連線由來源與目的地的位址與連接埠決定,因此IP位址改變時要重新連線 | 與HTTP/1.1相同 | QUIC以連線ID識別連線,因此從無線區域網路切換到行動網路時,也能延續同一條連線(連線遷移) |
數值為具代表性的大致參考值,會因世代或產品而異。