はじめに
本記事はHTTP/1.1とHTTP/2の違いをプロトコルレベルから実装・運用まで深掘りし、設計時・チューニング時に意識すべきポイントを具体的に解説します。
1. コネクション管理とHOLブロッキング
HTTP/1.1
- デフォルトで1接続=1リクエスト。
- パイプライニングは多くの実装で無効化、並列性は複数TCPコネクションで実現。
- TLSハンドシェイク×Nで接続オーバーヘッドが発生。
HTTP/2
- 単一TCP接続内に複数ストリームを多重化。
- TCPレベルではHOLブロッキングがストリーム間で共有され、パケット損失時の影響範囲に注意。
- 対策: 長距離やモバイル回線ではTCPプロキシ/QUIC(HTTP/3)も検討。
2. フレーミングとバイナリ化
- HTTP/1.1はテキストベースで、ヘッダ境界は空行・改行。
- HTTP/2は9バイトヘッダ+可変長ペイロードのフレームを使用。
- 設計上の勘所: フレーム分割・マージやバッファ管理を最適化し、メモリ使用量を制御。
3. HPACK(ヘッダ圧縮)のチューニングとセキュリティ
- 動的・静的テーブル参照で差分圧縮。
-
SETTINGS_HEADER_TABLE_SIZE
で圧縮率 vs メモリ消費量のトレードオフ。 - BREACH/CRIME攻撃対策として、過度なテーブルサイズ増大を抑制。
- APIごとのヘッダパターンを分析し、
SETTINGS_MAX_HEADER_LIST_SIZE
を最適化。
HPACKは、HTTP/2におけるヘッダー圧縮方式です。HTTP/2で通信する際、ヘッダー情報を効率的に圧縮し、通信量を削減する仕組みです。これにより、Webサイトの読み込み速度を向上させることができます
4. プライオリティとフロー制御
- PRIORITYフレームでストリームごとの**重み付け(weight)**や依存関係を定義。
- クライアント・サーバー間で接続単位/ストリーム単位のウィンドウ制御を行い、
SETTINGS_INITIAL_WINDOW_SIZE
を調整。 -
注意点: ウィンドウサイズが大きすぎるとメモリ圧迫、小さすぎると
WINDOW_UPDATE
頻発によるオーバーヘッド。
5. サーバープッシュの活用と注意点
- HTML → CSS/JSを先行送信し、RTTを節約可能。
- 不要プッシュによる帯域浪費やキャッシュミスを防ぐため、キャッシュ状況の確認や用途に応じた制御を実装。
-
PUSH_PROMISE
を正しく扱い、クライアントのキャッシュ状態を考慮した設計を。
6. TLS運用とALPNネゴシエーション
- HTTP/2はほぼHTTPS前提(ALPNで
h2
を選択)。 - TLS1.2以上を必須化し、古いバージョンの無効化を徹底。
- 証明書管理やセッション再開(PSK)を組み合わせることで、接続確立コストを最小化。
7. デバッグ・計測ツール
-
HTTP/1.1:
curl
,tcpdump
で平文ヘッダ参照。 -
HTTP/2:
nghttp
,h2load
, ブラウザ開発ツールのフレーム単位タイムライン。 - ログレベル
DEBUG
以上でフレーム送受信ログを取得し、ボトルネック特定。
8. HTTP/3移行への布石
- QUICベースでTCP HOLを解消。
- HTTP/2のストリーム管理/HPACK/プライオリティ知識はHTTP/3でも活用可能。
- ステップ: まずHTTP/2で最適化経験を積み、HTTP/3へのスムーズな移行を目指す。
まとめ:意識すべきポイント
- HOLの恩恵と限界:多重化×TCPレイヤの特性把握
- HPACK設定:圧縮率・メモリ・セキュリティのバランス
- 優先度/フロー制御:適切なウィンドウサイズと重み付け
- Server Push:帯域効率化とキャッシュ戦略
- TLS/ALPN:HTTPS運用と接続コスト低減
- デバッグ:フレーム単位の可視化で性能改善
これらを踏まえ、HTTP/2導入時やチューニング時に具体的な数値・ツールを活用し、パフォーマンスと運用性を両立させましょう。