HTTPバージョンの違いと歴史
HTTPの各版は、共通のメソッドやステータスの意味を保ちながら通信方法を変えてきました。0.9から1.1の持続接続、2の多重化、3のQUICまで、何が変わったかを押さえます。新しい版なら必ず速い、というわけではありません。
ざっくり年表
主要バージョンの節目を押さえておくと設計やトラブルシュートが楽になります。
主なマイルストーン
- HTTP/0.9(1991頃): GETのみ、ヘッダーなしでHTMLを返すシンプル仕様。
- HTTP/1.0(1996年にRFC 1945):ステータス行やContent-Typeなどのヘッダーを整理。通常は要求・応答ごとに接続を閉じますが、持続接続の拡張実装もありました。
- HTTP/1.1(1997年にRFC 2068):持続接続が既定となり、Host必須、チャンク転送などを規定。現在のメッセージ構文はRFC 9112、共通の意味はRFC 9110、キャッシュはRFC 9111です。
- SPDY(2009):Google発の実験プロトコル。多重化・ヘッダー圧縮・優先度のアイデアがHTTP/2に継承。
- HTTP/2(2015年にRFC 7540、2022年にRFC 9113へ更新):TCP上でバイナリフレームを多重化し、HPACKでヘッダーを圧縮。
- HTTP/3(2022年にRFC 9114):UDP上のQUICを利用。ストリームごとの配送とTLS 1.3による保護を使い、ヘッダー圧縮はQPACK。
バージョンごとの違い(概要)
どの課題を解決するための改訂かを意識すると理解しやすいです。
HTTP/1.0 → 1.1
- 持続接続を既定にして接続の張り直しを削減。HTTP/1.1で毎回Keep-Aliveヘッダーを付ける必要がある、という意味ではありません。
- Hostヘッダー必須でバーチャルホストが現実的に。
- チャンク転送でストリーミング的な送信が可能に。
- Cache-ControlやETagでキャッシュ制御が明確に。
HTTP/1.1 → 2
- 1接続の複数ストリームに要求・応答を多重化し、HTTP/1.1の応答順による待ちを軽減。ただしTCPのパケット損失による接続全体の待ち(head-of-line blocking)は残ります。
- ヘッダー圧縮(HPACK)でオーバーヘッド削減。
- RFC 7540の依存関係による優先度方式はRFC 9113で非推奨になっています。優先度の情報は配信順や速さの保証ではありません。
- バイナリフレーミングで拡張しやすい構造に。
HTTP/2 → 3
- QUICは接続IDなどによりネットワーク経路の変更へ対応できます。ただし移行の可否は設定や経路検証にも依存し、どんな回線切り替えでも接続が保たれるわけではありません。
- 1ストリームの欠落待ちが、他ストリームの受信済みデータの配送を止めない仕組みです。同じストリーム内の順序待ち、輻輳制御、QPACKの依存関係による待ちは残り得ます。
- QPACKはQUICに合わせたヘッダー圧縮です。HTTP/3のQUIC接続はTLS 1.3で保護されます。再接続の0-RTTは利用条件があり、再送攻撃への注意も必要です。
いま使うなら
利用される版はクライアント、サーバー、CDN、ネットワークで変わります。一般的な普及率を自分のサイトに当てはめず、ブラウザーの開発者ツールやログで実際の通信を確認しましょう。
実務メモ
- HTTPSのHTTP/2はTLSのALPNでh2を交渉します。HTTP/3はQUIC接続でh3を交渉します。HTTP/3接続先はAlt-Svcなどで知ることができ、TCP接続がそのままQUICへ切り替わるわけではありません。
- HTTP/3は一部ネットワーク機器でUDPブロックされる場合があり、フォールバックにHTTP/2/1.1を持つ構成が現実的。
- ブラウザーのNetwork欄でProtocol列を表示するとh2、h3、http/1.1などを確認できます。CDN利用時はブラウザー〜CDNとCDN〜オリジンサーバーで版が異なる場合があります。
- 1.1しか使えないクライアントも残るため、サーバー設定で複数バージョンを併用するケースが多い。
- 監視はバージョン別の指標(ハンドシェイク時間、再送、QoE)を分けて見ると問題箇所を特定しやすい。
まとめ
共通の意味と転送方式を分けると理解しやすくなります。HTTPが運ぶデータ、メソッドの意味、転送速度の見方も参照してください。
仕様・関連資料
HTTP/0.9 / RFC 1945 / SPDY / RFC 9112 / RFC 9113 / RFC 9114 / RFC 9000 / RFC 9001 / RFC 8470