ゆるテックノート

HTTPバージョンの違いと歴史

HTTPは版を重ねて通信の効率と安全性を高めてきました。0.9の「ただ取るだけ」から、1.1のKeep-Alive、2の多重化、3のQUICまで、ざっくり流れを押さえます。

ざっくり年表

主要バージョンの節目を押さえておくと設計やトラブルシュートが楽になります。

主なマイルストーン

  • HTTP/0.9(1991頃): GETのみ、ヘッダーなしでHTMLを返すシンプル仕様。
  • HTTP/1.0(1996):ヘッダー追加、ステータスコードやContent-Typeが整備。接続はリクエストごとに切断。
  • HTTP/1.1(1997):Keep-Aliveが標準、パイプライニング、Hostヘッダー必須、チャンク転送、Cache-Controlなど多数。
  • SPDY(2009):Google発の実験プロトコル。多重化・ヘッダー圧縮・優先度のアイデアがHTTP/2に継承。
  • HTTP/2(2015):バイナリフレーミング+多重化+ヘッダー圧縮(HPACK)、優先度制御。
  • HTTP/3(2022):トランスポートをTCPからQUIC(UDPベース)に変更。0-RTTやパケットロス耐性が向上。ヘッダー圧縮はQPACK。

バージョンごとの違い(概要)

どの課題を解決するための改訂かを意識すると理解しやすいです。

HTTP/1.0 → 1.1

  • 持続接続(Keep-Alive)で接続の張り直しを削減。
  • Hostヘッダー必須でバーチャルホストが現実的に。
  • チャンク転送でストリーミング的な送信が可能に。
  • Cache-ControlやETagでキャッシュ制御が明確に。

HTTP/1.1 → 2

  • 1コネクション内での多重化。HOLブロッキング(ヘッダ行き詰まり)を軽減。
  • ヘッダー圧縮(HPACK)でオーバーヘッド削減。
  • 優先度制御で重要リソースを先に届けやすく。
  • バイナリフレーミングで拡張しやすい構造に。

HTTP/2 → 3

  • トランスポートをTCP→QUIC(UDP上)に変更。コネクションIDでパス変更に強く、ハンドシェイクも速い。
  • パケットロス時のヘッド・オブ・ラインブロッキングを回避しやすい。
  • ヘッダー圧縮はQPACKへ。TLSはQUICに内包(常時暗号化前提)。

いま使うなら

1.1は依然広く使われ、2がデフォルト、3は対応環境が増えつつも現実のトラフィックシェアはまだ小さい、というのが現状です。

実務メモ

  • モダンなブラウザやCDNはHTTP/2/3に対応。ALPNで優先するプロトコルを交渉する。
  • HTTP/3は一部ネットワーク機器でUDPブロックされる場合があり、フォールバックにHTTP/2/1.1を持つ構成が現実的。
  • 実トラフィックではHTTP/3の割合はまだ低め(CDNや国・ISPによって大きく差がある)。段階的に有効化し、ログで比率を確認するのがおすすめ。
  • 1.1しか使えないクライアントも残るため、サーバー設定で複数バージョンを併用するケースが多い。
  • 監視はバージョン別の指標(ハンドシェイク時間、再送、QoE)を分けて見ると問題箇所を特定しやすい。

まとめ

HTTPはバージョンを重ねるごとに「つながりっぱなし」「並列」「暗号化前提」へ進化してきました。運用では複数バージョンの共存を前提にしつつ、2/3を優先するのが現実的です。