#はじめに

「HTTP/2に対応しました!」——こんなアナウンスを見たことがあるかもしれません。でも、具体的に何が変わるのでしょうか?

HTTP/1.1は1997年に策定され、長年Webを支えてきました。しかし、Webページが複雑化し、読み込むリソースが増えるにつれ、HTTP/1.1の限界が見えてきました。HTTP/2とHTTP/3は、この問題を解決するために生まれた新しいプロトコルです。

この記事を読むと、以下のことができるようになります:

  • HTTP/1.1の問題点を理解できる
  • HTTP/2の多重化やヘッダー圧縮がなぜ速いのかがわかる
  • HTTP/3とQUICの違いを理解できる
  • DevToolsでプロトコルバージョンを確認できる

#HTTP/1.1の問題点

#1. Head-of-Line Blocking(HoL Blocking)

HTTP/1.1では、1つのTCP接続で一度に処理できるリクエストは1つだけです。

[リクエスト1] → [レスポンス1] → [リクエスト2] → [レスポンス2] → ...

3つ目のリクエストは、1つ目と2つ目の完了を待たなければなりません。これを Head-of-Line Blocking(HoL Blocking) と呼びます。

#2. 複数接続のオーバーヘッド

HoL Blockingを回避するため、ブラウザは1つのサーバーに対して複数のTCP接続を開きます(通常6本)。しかし、各接続にはハンドシェイクのコストがかかります。

接続1: [CSS]
接続2: [JS]
接続3: [画像1]
接続4: [画像2]
接続5: [画像3]
接続6: [画像4]

#3. ヘッダーの冗長性

HTTP/1.1では、リクエストごとに同じヘッダー(Cookie、User-Agentなど)を毎回送信します。

# リクエスト1
Cookie: session=abc123; user_pref=dark
User-Agent: Mozilla/5.0 ...

# リクエスト2(同じヘッダーを再送信)
Cookie: session=abc123; user_pref=dark
User-Agent: Mozilla/5.0 ...

これらのヘッダーは圧縮されないため、帯域を無駄に消費します。

#HTTP/2の特徴

HTTP/2は2015年に標準化され、HTTP/1.1の問題を解決するために設計されました。

#1. 多重化(Multiplexing)

HTTP/2では、1つのTCP接続で複数のリクエスト/レスポンスを同時に処理できます。

     ┌──────────────────────────────────┐
     │       1つのTCP接続                │
     │                                   │
     │  [リクエスト1] ─────────────→     │
     │  [リクエスト2] ───────→           │
     │  [リクエスト3] ─────────────────→ │
     │       ←───────── [レスポンス2]    │
     │       ←─────────────── [レスポンス1] │
     │       ←─────────────────── [レスポンス3] │
     └──────────────────────────────────┘

リクエストとレスポンスは「ストリーム」という単位で管理され、順番を待たずに並行して送受信できます。

#2. ヘッダー圧縮(HPACK)

HTTP/2はHPACKというアルゴリズムでヘッダーを圧縮します。

  • 静的テーブル: よく使うヘッダー(:method: GETなど)に番号を割り当て
  • 動的テーブル: 過去に送信したヘッダーを記憶し、差分のみ送信

これにより、ヘッダーサイズが大幅に削減されます。

#3. バイナリプロトコル

HTTP/1.1はテキストベースでしたが、HTTP/2はバイナリベースです。

# HTTP/1.1(テキスト)
GET /index.html HTTP/1.1
Host: example.com

# HTTP/2(バイナリフレーム)
[フレームヘッダー][ペイロード]

バイナリ形式は解析が高速で、エラーが起きにくいという利点があります。

#4. サーバープッシュ

サーバーが、クライアントからのリクエストを待たずにリソースを送信できる機能です。

クライアント: GET /index.html
サーバー:
  → index.html
  → style.css(プッシュ)
  → script.js(プッシュ)

HTMLを解析してからCSSをリクエストする前に、サーバーが先回りして送信できます。

ただし、キャッシュとの整合性の問題などから、実際にはあまり使われていません。Chromeは2022年にサーバープッシュのサポートを削除しました。

#5. ストリームの優先度

どのリソースを優先的に送信するかを指定できます。CSSやJSを画像より優先するなど、レンダリングに重要なリソースを先に送れます。

#HTTP/3の特徴

HTTP/3は2022年に標準化された最新のHTTPプロトコルです。

#TCPからQUICへ

HTTP/3の最大の特徴は、TCPの代わりにQUICを使用することです。

HTTP/1.1: HTTP/1.1 + TLS + TCP
HTTP/2:   HTTP/2   + TLS + TCP
HTTP/3:   HTTP/3   + QUIC(TLS 1.3内蔵)+ UDP

#QUICとは

QUIC(Quick UDP Internet Connections) は、Googleが開発したトランスポートプロトコルです。UDPの上に構築され、以下の特徴があります:

#1. 接続確立の高速化

TCPは3ウェイハンドシェイク、TLSはさらに追加のやり取りが必要でした。QUICはこれらを統合し、1往復(場合によっては0往復)で接続を確立できます。

TCP + TLS 1.2: 3 RTT
TCP + TLS 1.3: 2 RTT
QUIC:          1 RTT(0-RTTも可能)

#2. HoL Blockingの解消

HTTP/2はTCP上で動作するため、パケットロスが発生すると全ストリームが影響を受けます(TCP層でのHoL Blocking)。

QUICはストリームごとに独立しているため、1つのストリームでパケットロスが起きても、他のストリームは影響を受けません。

HTTP/2 over TCP:
  パケットロス → 全ストリームが待機

HTTP/3 over QUIC:
  パケットロス → 該当ストリームのみ再送待ち、他は継続

#3. コネクションマイグレーション

QUICは接続をコネクションIDで識別するため、IPアドレスが変わっても接続を維持できます。

Wi-Fi → モバイル回線に切り替え → 接続継続

これは、モバイルデバイスでネットワークが切り替わる場面で有効です。

#プロトコルの比較

特徴HTTP/1.1HTTP/2HTTP/3
多重化
ヘッダー圧縮HPACKQPACK
トランスポートTCPTCPQUIC (UDP)
TLSオプション実質必須必須(内蔵)
HoL Blockingありあり(TCP層)なし
接続確立遅い遅い速い

#DevToolsで確認してみよう

#プロトコルバージョンの確認

  1. DevToolsのNetworkタブを開く
  2. 列ヘッダーを右クリック → 「Protocol」にチェック
  3. 各リクエストのProtocol列を確認

表示される値:

  • http/1.1: HTTP/1.1
  • h2: HTTP/2
  • h3: HTTP/3

#HTTP/2の多重化を観察

  1. HTTP/2対応サイトにアクセス
  2. Networkタブで複数のリクエストを観察
  3. 「Waterfall」列で、リクエストが並行して処理されていることを確認

HTTP/1.1では階段状(順次処理)、HTTP/2では並列に処理されます。

#対応状況

#ブラウザサポート

  • HTTP/2: すべての主要ブラウザが対応
  • HTTP/3: Chrome、Firefox、Safari、Edgeが対応

#サーバーサポート

  • HTTP/2: Nginx、Apache、Cloudflare、AWS CloudFrontなど
  • HTTP/3: Cloudflare、Google Cloud、Fastlyなど

多くのCDNがHTTP/3に対応しているため、CDNを使用していれば自動的にHTTP/3の恩恵を受けられることがあります。

#まとめ

  • HTTP/1.1の問題: HoL Blocking、複数接続のオーバーヘッド、ヘッダーの冗長性
  • HTTP/2の改善: 多重化、ヘッダー圧縮、バイナリプロトコル
  • HTTP/3の改善: QUICによる高速な接続確立、TCP層のHoL Blocking解消
  • DevToolsでProtocol列からプロトコルバージョンを確認できる

#次のステップ

HTTP基礎モジュールはこれで完了です。HTTPの構造、ステータスコード、ヘッダー、HTTPS、そしてプロトコルの進化について学びました。

次のモジュールでは、Cookie・認証・セッションについて学びます。ステートレスなHTTPで、どのようにユーザーの状態を管理するのか——Cookieの仕組みから、セッション管理、JWT、OAuth 2.0まで、認証の基礎を身につけましょう。

#参考リンク