なぜHTTP/2は速いのか?「HPACK静的テーブル」という名の魔法の辞書
こんにちは!ネットワークの世界へようこそ。
Webサイトを表示するとき、私たちのブラウザとサーバーは絶え間なく「通信」を行っています。でも、実はその裏側で、彼らはとてつもなく面倒くさい「自己紹介」を毎回繰り返していたことをご存知でしょうか?
今回は、HTTP/2の高速化を支える縁の下の力持ち、「HPACK(エイチパック)の静的テーブル」について、難しいビット列の話は一旦脇に置いて、身近な例えで紐解いていきましょう。
—
毎回の「自己紹介」は、実はこんなに無駄だらけ
昔の通信(HTTP/1.1)は、まるで「毎回フルネームと住所を紙に書いて渡す郵便配達」のようなものでした。
- 「私の名前はChromeです。バージョンはこれです。OSはこれです。使っている言語は日本語です……」
毎回毎回、同じヘッダー情報を律儀に書き連ねて送っていたのです。これでは、中身のデータ(画像やテキスト)が届く前に、この「自己紹介の紙」だけで通信帯域がパンパンになってしまいますよね。
そこで登場したのがHTTP/2の「HPACK」という技術です。これは、「お互いに共通の辞書を持っていれば、わざわざフルネームを書かなくていいよね?」という画期的な仕組みです。
—
「静的テーブル」は、あらかじめ配られた「共通の辞書」
HPACKには「静的テーブル(Static Table)」というものが存在します。これは、インターネットの世界で「誰がどう考えても、絶対によく使うよね」というヘッダーの組み合わせを、あらかじめ61個だけ選んでリスト化したものです。
例えば、こんな感じです。
- 1番: `method: GET`
- 2番: `method: POST`
- 3番: `path: /index.html`
- …
- 61番: `www-authenticate`
これらは、世界中のサーバーとブラウザが「通信を始めたその瞬間から知っている共通の番号」です。
郵便配達で例えると?
あなたが郵便局の窓口に行くたびに「東京都千代田区……」と長い住所を紙に書く代わりに、「あ、今日は3番のリストを送るね」と番号を伝えるだけでいいのです。受け取った側は「3番?ああ、あれね」と即座に理解できます。これなら、文字を打つ手間も、紙の重さも、一瞬でゼロになりますよね。
—
実際にどう動いているのか?(擬似的なイメージ)
もし、あなたがブラウザ側でサーバーに「GET /index.html」を送りたいとします。HPACKを使わない場合と、使う場合で比較してみましょう。
【HPACKを使わない場合(昔のやり方)】
> 「method: GET」という文字列を送る → 10文字分消費
【HPACKを使う場合(今のやり方)】
> 「1」という番号を送る → 1文字分(実際にはもっと少ない!)で済む
これぞまさに、通信の「ダイエット」です。この小さな積み重ねが、Webサイトの表示速度を劇的に向上させている正体なのです。
—
現場のエンジニアが知っておくべき「確認のヒント」
開発者ツールなどで通信の中身を覗くと、生のヘッダーが見えるはずです。実は、ブラウザがサーバーに送っているパケットを解析する際、HPACKで圧縮されたデータは、デバッガー側で自動的に「元の名前」に復元して表示してくれています。
もし、あなたが通信の挙動を深く理解したいなら、プロキシツール(`Charles`や`Wireshark`など)を使ってパケットをキャプチャしてみてください。
Wiresharkで見た時のイメージ(実際にはバイナリですが、直感的にこう見えます)
Header: :method: GET <-- 実際には「0x82」のような1バイトのデータとして飛んでいる
Header: :path: / <-- 実際には「0x84」のようなインデックスが使われている
このように、「人間が見ているヘッダー」と「ネットワークを流れているインデックス番号」が別物であるという感覚を持つだけで、ネットワークトラブルに強いエンジニアへの第一歩を踏み出したと言えます!
—
まとめ:一歩ずつ理解を深めよう
今回お伝えした「静的テーブル」のポイントは3つです。
1. 効率化の魔法: よく使うヘッダーは「番号」で呼び合うことで、通信量を劇的に減らしている。
2. 共通言語: 61個の静的テーブルは、世界中どこでも同じルール(RFCで定義された共通辞書)。
3. 高速化の秘訣: 通信の冒頭からこの辞書が使えるおかげで、最初の通信から速さを実感できる。
ネットワークの世界は、一見すると無機質なビットの羅列ですが、その中身を紐解くと「いかに効率よく情報を届けるか」という、人間味あふれる工夫の結晶なんです。
次回は、この「静的テーブル」に載っていない新しいヘッダーをどう扱うか、「動的テーブル(Dynamic Table)」という、さらに賢い仕組みについてお話ししましょう。
それでは、また次回の記事でお会いしましょう!ネットワークの旅を楽しんでくださいね。
コメント