なぜ「サイズ」を先に言わなきゃいけないの?HTTP通信のジレンマ
Webサイトを見ているとき、私たちは「パッと表示されること」を当たり前だと思っていますよね。でも、裏側でWebサーバーが何を考えているか、少し想像したことはありますか?
実は、HTTPの初期の頃(HTTP/1.0まで)、サーバーはファイルを送る前に「これから送る荷物は全部で何バイトです!」というラベル(Content-Length)を必ず付けなければいけませんでした。
想像してみてください。あなたは今、焼き立てのパンを家まで届ける配達員です。でも、パンが何個焼き上がるか、窯から出してみるまで分からないとしたら?「全部で何個か決まるまで、パンを箱に詰められません!」と言われたら、焼き上がったものから順に届けるなんてできませんよね。
この「サイズが分からないと始められない」という問題を解決するために登場したのが、`Transfer-Encoding: chunked` です。
—
「chunked」は「小分け配達」の魔法
`Transfer-Encoding: chunked`(チャンク転送エンコーディング)を一言で言うと、「中身が全部揃うのを待たずに、できた分からどんどん小分けにして運ぶ仕組み」です。
これを使えば、サーバーは「合計サイズ」を気にせず、処理が完了した部分からパケットとしてネットワークに流し込めます。これが現代の動的なWebサイトや、ストリーミング配信の根幹を支えているんです。
どうやって届けているの?
郵便配達に例えるなら、こんな流れです。
1. 「これから小分け(chunk)で送るよ!」と宣言するヘッダーを先に投げる。
2. できた分だけ箱(chunk)に詰めて、「今回のサイズはこれだけ!」と書いて送る。
3. これを繰り返し、最後に「もう終わり!」という合図(サイズ0のチャンク)を送る。
これなら、サーバーは全体像が見えていなくても、今ある分を即座にユーザーへ届けることができますよね。
—
実際に流れるパケットの中身を覗いてみよう
では、実際にどのような形式でデータが流れているのか、その構造を見てみましょう。難しくありません。ただの「サイズ+データ」の繰り返しです。
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked <-- 「これからは小分けで送るよ!」の合図
5\r\n <-- 最初の塊は「5バイト」ですよ
Hello\r\n <-- 内容:Hello
6\r\n <-- 次の塊は「6バイト」ですよ
World\r\n <-- 内容: World
0\r\n <-- 0バイトが来たら、もう終わり!
\r\n <-- 最後に空行を入れて通信終了
※ `\r\n` は改行コードです。サーバーはこのルールに従って、淡々と「サイズ」と「データ」をバケツリレーのように送っていきます。
---
なぜこの仕組みが「神」なのか?
もし `chunked` がなかったら、検索結果のページを表示するのに、全検索結果がデータベースから抽出されるまで、ブラウザは真っ白な画面のまま待たなければなりません。
- ユーザー体験の向上: サーバーが「まずはヘッダーだけ表示」「次に検索結果の1件目を表示」と、出来上がったものから順次画面に書き出せるため、体感速度が劇的に上がります。
- メモリの節約: サーバー側も、数ギガバイトあるような巨大なファイルをメモリに一度全部読み込んでから送る必要がありません。小さなバッファさえあれば、少しずつ読み込んで流すだけで良いのです。
—
エンジニアとして知っておくべきこと
最近のWebアプリ開発では、Node.jsのストリーム処理や、Pythonのジェネレーターなどを使って、この仕組みを意識せずとも `chunked` 転送が自動で行われることが増えました。
しかし、トラブルシューティングの現場ではこの知識が非常に重要になります。
- プロキシサーバーとの相性: 途中にいるプロキシやロードバランサーが、古い規格のままだと「chunkedって何?」とパケットを捨ててしまうことがあります。
- Content-Lengthとの併用禁止: サーバーの設定で `Transfer-Encoding: chunked` を指定しているのに、同時に `Content-Length` も書いてしまうと、ブラウザは混乱して通信を遮断することもあります。「どちらか片方だけ!」が鉄則です。
—
まとめ:ネットワークは「流れ」を大切にする
`chunked` 転送は、単なるデータの送り方のルールではありません。「待たせない」「止まらない」という、Webの高速化に対する先人たちの執念から生まれた技術です。
パケット一つひとつが、まるで小さな小包となってネットワークを駆け巡り、最後に一つの大きな「Webサイト」としてあなたの画面で形になる。そう考えると、単なる通信プロトコルも、少しドラマチックに見えてきませんか?
まずは手元のブラウザの開発者ツールを開いて、ネットワークタブを見てみてください。「Transfer-Encoding: chunked」という文字を見つけたとき、その裏で小分けの荷物がせっせと運ばれている様子がイメージできれば、あなたはもう立派なインフラエンジニアの第一歩を踏み出しています!
コメント