HTTP/1.1・HTTP/2・HTTP/3の違い:トランスポート・多重化・ヘッドオブラインブロッキング・ヘッダ圧縮・暗号化を比較

3つの版は、メソッド、ステータスコード、ヘッダといったHTTPの意味(RFC 9110)を共通にもち、それをどんな形で、どの通信路に載せて運ぶかが違います。HTTP/1.1(RFC 9112)はテキストのメッセージをTCPで送り、1つの接続では応答を1つずつ順に返します。HTTP/2(RFC 9113)はメッセージをバイナリのフレームに分け、1つのTCP接続の上に複数のストリームを多重化します。HTTP/3(RFC 9114)は、UDPの上で動くQUIC(RFC 9000)を使い、ストリームの多重化とTLS 1.3による暗号化をトランスポートの側で行います。そのため、1つのパケットの損失がすべてのストリームを待たせる、TCPでのヘッドオブラインブロッキングを避けられます。

項目HTTP/1.1HTTP/2HTTP/3
仕様RFC 9112(意味は3つの版に共通のRFC 9110)RFC 9113RFC 9114(QUICはRFC 9000)
トランスポートTCPTCPQUIC(UDPの上で動く)
メッセージの形式テキスト。リクエスト行とヘッダを1行ずつ書くバイナリのフレームバイナリのフレーム(QUICのストリームの上)
多重化なし。1つの接続では、リクエストと応答を1つずつ順に扱う。並行して取得するには、複数の接続を張る1つの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で見分けるので、無線LANから携帯電話の回線に切り替わっても、同じ接続を続けられる(接続の移行)

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

HTTP/1.1
どのクライアントとサーバでも使える基本の版です。サーバの内部どうしの通信や、機器の設定画面のような簡単なWebの画面でも使われます。
HTTP/2
多くの小さなファイルを読み込むWebページを、1つの接続で効率よく配信したいとき。UDPが通らないネットワークでも使えるので、HTTP/3に対応したサイトでも、HTTP/3が使えないときの受け皿になります。
HTTP/3
損失や遅延の大きい携帯電話の回線などで、ストリームどうしが待たされるのを避けたいときや、接続の確立を速くしたいとき。UDPを通さないネットワークもあるので、HTTP/2やHTTP/1.1にも対応しておくのが一般的です。

よくある質問

HTTP/2で、ヘッドオブラインブロッキングはなくなったのではないのですか?

HTTPの層ではなくなりましたが、TCPの層には残っています。HTTP/2は1つの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アプリケーションを書き換える必要がありますか?

多くの場合は不要です。メソッド、ステータスコード、ヘッダの意味は3つの版に共通(RFC 9110)で、違うのは運び方です。版は接続ごとに決まるので、ブラウザとの間はリバースプロキシやCDNがHTTP/2やHTTP/3で受け、その後ろのアプリケーションサーバとはHTTP/1.1で通信する構成もよく使われます。

理解度チェック

HTTP/1.1のリクエストの最初の行(リクエスト行)に並ぶ要素の組み合わせとして、正しいものはどれか。

  1. Aメソッド、リクエストの対象(パスなど)、HTTPのバージョン
  2. BHTTPのバージョン、ステータスコード、理由を表す短い語句
  3. C送信元のIPアドレス、宛先のポート番号、メソッド
答えと解説を見る

正解:A. メソッド、リクエストの対象(パスなど)、HTTPのバージョン

HTTPのリクエストは、リクエスト行、ヘッダ(1行に1つの「名前: 値」)、空行、本文の順に並びます。例えば「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は1つのTCP接続で複数のリクエストを並行して扱えるが、パケットの損失でほかのストリームも待たされることがあり、HTTP/3はUDP上のQUICでこれを減らした
  2. BHTTP/2は、HTTP/1.1と同じテキストの形式のメッセージを使い、リクエストごとに新しいTCP接続を並行して作ることで、複数の資源を同時に受け取れるようにした版である
  3. CHTTP/3は、HTTP/2と同じくTCPの上で動き、ヘッダを圧縮する方式だけを改めた版で、パケットの損失の影響はHTTP/2と変わらず、UDPは使わない
答えと解説を見る

正解:A. HTTP/2は1つのTCP接続で複数のリクエストを並行して扱えるが、パケットの損失でほかのストリームも待たされることがあり、HTTP/3はUDP上のQUICでこれを減らした

HTTP/1.1でも持続的接続(keep-alive)で1つのTCP接続を使い回せますが、1つの接続では応答を1つずつ順に受け取るため、ブラウザは複数の接続を並行して張っていました。HTTP/2はメッセージをバイナリのフレームに分け、1つのTCP接続の上に複数のストリームを多重化して並行に送ります。ただし、TCPはバイト列を順番どおりに渡すので、パケットが1つ失われると、再送が届くまで関係のないストリームのデータも待たされます(ヘッドオブラインブロッキング)。HTTP/3はUDPの上で動くQUICを使い、ストリームごとに順序を管理するので、損失の影響がそのストリームだけにとどまります。

RTTが40 msのWebサーバから、HTMLを1つと、そこから参照される画像を4つ、1つずつ順番に取得する。TCPの接続の確立に1往復、各リクエストと応答に1往復かかるとし、データの転送時間、サーバの処理時間、TLS、接続の切断は考えない。オブジェクトごとに新しいTCP接続を張る場合と、1つの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. RTT(往復の時間)が100 msのWebサーバに、HTTPS(TCPの上のTLS 1.3)で新しく接続し、最初のリクエストを送って応答を受け取り始めるまでにかかる時間に最も近いものはどれか。DNSの名前解決は済んでおり、サーバの処理時間とデータの転送時間は無視する。
  2. HTTPS(HTTPをTLSで保護した通信)で守られることとして正しいものはどれか。

Web技術の基礎の練習問題へ

関連する用語の解説

HTTP
WebブラウザとWebサーバなどの間で、HTMLや画像、データをやり取りするためのアプリケーション層のプロトコル。クライアントがメソッド、URL、ヘッダ、本文からなるリクエストを送り、サーバがステータスコード、ヘッダ、本文からなる応答を返す。プロトコルとしてはステートレスで、ログインのような状態はCookieなどを使って保つ。HTTP/1.1はテキストの形式で持続的接続を使い、HTTP/2は1つのTCP接続の上で複数のストリームを多重化し、HTTP/3はUDPの上のQUICを使う。TLSで保護したものをHTTPSと呼ぶ。
TLS
Transport Layer Securityの略。通信の暗号化、改ざんの検出、証明書によるサーバの認証を行うプロトコル。HTTPSはHTTPをTLSで保護したもの。
3ウェイハンドシェイク
TCPでコネクションを確立する手順。クライアントのSYN、サーバのSYN+ACK、クライアントのACKの3回のやり取りで、互いの初期シーケンス番号を確かめ合う。
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は認証されていても権限がないときに使う。
リバースプロキシ
Webサーバの手前に置かれ、利用者からのリクエストをサーバの代わりに受けて、後ろにある1台または複数のサーバへ中継するサーバ。HTTPSの暗号の処理をまとめて行う(TLSの終端)、よく使われる応答を保存して返す、複数のサーバに負荷を分ける、後ろのサーバの構成を隠す、といった役割を受け持つ。利用者の側に置かれ、利用者の代わりに外部のサイトへ接続するフォワードプロキシとは、置かれる場所と守る対象が違う。

関連する比較