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.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| 仕様 | RFC 9112(意味は3つの版に共通のRFC 9110) | RFC 9113 | RFC 9114(QUICはRFC 9000) |
| トランスポート | TCP | TCP | QUIC(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から携帯電話の回線に切り替わっても、同じ接続を続けられる(接続の移行) |
数値は代表的な目安で、世代や製品によって異なります。