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.1HTTP/2HTTP/3
規格RFC 9112(語意為三個版本共用的RFC 9110)RFC 9113RFC 9114(QUIC為RFC 9000)
傳輸層TCPTCPQUIC(在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識別連線,因此從無線區域網路切換到行動網路時,也能延續同一條連線(連線遷移)

數值為具代表性的大致參考值,會因世代或產品而異。

適用於什麼情況

HTTP/1.1
任何用戶端與伺服器都能使用的基本版本。也用於伺服器內部之間的通訊,以及設備設定頁面這類簡單的Web畫面。
HTTP/2
想以一條連線有效率地傳送需載入許多小檔案的網頁時。在UDP無法通過的網路上也能使用,因此即使是支援HTTP/3的網站,也會作為無法使用HTTP/3時的備援。
HTTP/3
在遺失與延遲較大的行動網路等環境中,想避免串流彼此等待,或想加快建立連線時。由於有些網路不讓UDP通過,一般也會同時支援HTTP/2或HTTP/1.1。

常見問題

HTTP/2不是已經消除隊頭阻塞了嗎?

在HTTP層已經消除,但在TCP層仍然存在。HTTP/2在一條TCP連線上多工傳送多個串流,但TCP不知道資料屬於哪個串流,只會依序交付位元組。因此只要遺失1個封包,在重傳到達之前,無關串流的資料也無法交給接收端的應用程式。在HTTP/3中,QUIC以串流為單位管理順序,需要等待的只有含有遺失資料的串流。

用戶端如何得知伺服器支援HTTP/3?

HTTP/3使用UDP,因此必須與TCP連線分開建立。一般的做法是先以TCP上的HTTP/1.1或HTTP/2連線,由伺服器以回應中的Alt-Svc標頭告知可以使用HTTP/3(h3)。用戶端在之後的連線中使用QUIC。另外,在TLS上要使用HTTP/1.1或HTTP/2,是在TLS交握中以ALPN決定。

HTTP/3的0-RTT有什麼需要注意的地方?

有。以0-RTT傳送的資料,可能被攻擊者記錄後再次送出(重送攻擊)。因此在0-RTT中需要特別注意,例如只傳送像GET這樣即使重複收到也沒有問題的請求。

改用HTTP/2或HTTP/3,需要改寫Web應用程式嗎?

大多數情況不需要。方法、狀態碼、標頭的語意是三個版本共用的(RFC 9110),不同的只是傳送方式。版本是依連線決定的,因此常見的架構是由反向代理或CDN以HTTP/2或HTTP/3接受瀏覽器的連線,再以HTTP/1.1與後方的應用程式伺服器通訊。

理解度檢測

HTTP/1.1請求的第一行(請求列)所排列的元素組合,下列何者正確?

  1. A方法、請求目標(路徑等)、HTTP版本
  2. BHTTP版本、狀態碼、表示原因的簡短詞語
  3. C來源IP位址、目的連接埠號碼、方法
查看答案與解析

正確答案:A. 方法、請求目標(路徑等)、HTTP版本

HTTP請求依序由請求列、標頭(每行一個「名稱: 值」)、空行、本文組成。例如「GET /docs/index.html HTTP/1.1」就是以GET方法請求 /docs/index.html 的一行。HTTP/1.1還必須送出Host標頭,即使以同一個IP位址經營多個網站,伺服器也能判斷請求是給哪個網站的。回應的第一行是狀態列,如「HTTP/1.1 200 OK」般排列版本、狀態碼與原因片語。

關於HTTP/2與HTTP/3的說明,下列何者正確?

  1. AHTTP/2能在一條TCP連線上平行處理多個請求,但封包遺失可能讓其他串流也跟著等待;HTTP/3以UDP上的QUIC減少了這個問題
  2. BHTTP/2使用與HTTP/1.1相同文字格式的訊息,並為每個請求平行建立新的TCP連線,以便同時接收多個資源
  3. CHTTP/3與HTTP/2一樣在TCP上運作,只改良了壓縮標頭的方式,封包遺失的影響與HTTP/2相同,也不使用UDP
查看答案與解析

正確答案:A. HTTP/2能在一條TCP連線上平行處理多個請求,但封包遺失可能讓其他串流也跟著等待;HTTP/3以UDP上的QUIC減少了這個問題

HTTP/1.1也能以持續連線(keep-alive)重複使用一條TCP連線,但在一條連線上只能依序一個一個接收回應,因此瀏覽器會平行建立多條連線。HTTP/2把訊息分成二進位的訊框,在一條TCP連線上多工傳送多個串流,平行地傳送。不過TCP會依序交付位元組串流,因此只要遺失1個封包,在重送到達之前,無關串流的資料也必須等待(隊頭阻塞)。HTTP/3使用在UDP上運作的QUIC,以串流為單位管理順序,因此遺失的影響只限於該串流。

從RTT為40 ms的Web伺服器,依序一個一個取得1個HTML以及它所參照的4張影像。假設建立TCP連線需要1個往返,每次請求與回應需要1個往返,並且不考慮資料的傳輸時間、伺服器的處理時間、TLS以及連線的中斷。每個物件都建立新TCP連線的情況,與重複使用一條TCP連線(持續連線)的情況,所需時間的差為下列何者?

  1. A160 ms
  2. B200 ms
  3. C400 ms
查看答案與解析

正確答案:A. 160 ms

物件共有5個。每次都建立新連線時,每個物件需要建立連線以及請求與回應共2個往返,為 5 × 2 × 40 = 400 ms。持續連線只在一開始建立1次連線,之後只有5次請求與回應,為 (1 + 5) × 40 = 240 ms。差為 400 − 240 = 160 ms,省下的是4次建立連線。HTTP/1.1以持續連線作為預設的行為。

  1. 以HTTPS(在TCP之上的TLS 1.3)重新連線到RTT(往返時間)為100 ms的Web伺服器,從送出第一個請求到開始收到回應,所需時間最接近下列何者?假設DNS名稱解析已完成,並忽略伺服器的處理時間與資料的傳輸時間。
  2. HTTPS(以TLS保護的HTTP通訊)能保護的是下列何者?

前往Web技術基礎的練習題

相關名詞的解說

HTTP(超文字傳輸協定)
在網頁瀏覽器與網頁伺服器等之間,交換HTML、影像與資料的應用層協定。用戶端送出由方法、URL、標頭、本文組成的請求,伺服器回傳由狀態碼、標頭、本文組成的回應。作為協定是無狀態的,登入等狀態要用Cookie等方式維持。HTTP/1.1使用文字格式與持續連線,HTTP/2在一條TCP連線上多工傳送多個串流,HTTP/3則使用UDP之上的QUIC。以TLS保護的HTTP稱為HTTPS。
TLS
Transport Layer Security(傳輸層安全性協定)。進行通訊加密、竄改偵測,以及以憑證驗證伺服器的協定。HTTPS是以TLS保護的HTTP。
三向交握
建立TCP連線的程序。以用戶端的SYN、伺服器的SYN+ACK、用戶端的ACK三次交換,彼此確認對方的初始序號。
HTTP方法
在HTTP請求中,表示要對資源進行何種操作的詞。有GET(取得)、HEAD(只取得標頭)、POST(處理或建立)、PUT(取代)、PATCH(部分更新)、DELETE(刪除)、OPTIONS(詢問可用的功能)等。不改變伺服器狀態的方法稱為「安全」,無論送出幾次都與送出1次時狀態相同的方法稱為「冪等」。GET既安全又冪等,PUT與DELETE冪等但不安全,POST一般兩者皆非。
HTTP狀態碼
放在HTTP回應第一行的3位數字,表示請求的結果。以百位數分類:1xx為資訊,2xx為成功(200 OK、201 Created、204 No Content),3xx為重新導向(301 Moved Permanently、302 Found、304 Not Modified),4xx為用戶端錯誤(400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found),5xx為伺服器端錯誤(500 Internal Server Error、503 Service Unavailable)。401用於沒有驗證資訊或驗證資訊不正確時,403用於已通過驗證但沒有權限時。
反向代理
放在網頁伺服器前方,代替伺服器接收使用者的請求,並轉送給後方一台或多台伺服器的伺服器。負責集中處理HTTPS的加密(TLS終止)、保存並回傳常用的回應、把負載分散到多台伺服器、隱藏後方伺服器的架構等角色。與放在使用者端、代替使用者連線到外部網站的正向代理相比,放置的位置與保護的對象不同。

相關的比較