【入門編】HTTP/1.1におけるTransfer-Encoding: chunkedの仕組み – HTTPプロトコル・通信規格実践ガイド

荷物は全部揃ってから届くの?それとも小分けで届く?「Chunked転送」の仕組みを紐解く

エンジニアの皆さん、こんにちは!ネットワークの世界へようこそ。

Webサイトを見ているとき、私たちは「パッと」ページが表示されることを期待しますよね。でも、裏側ではサーバーが必死にデータを準備しています。特に「動的なコンテンツ」、例えば、今この瞬間の株価データや、AIが生成中の文章など、「最後まで作り終わらないと総量がわからないデータ」をどうやってブラウザに送ればいいのでしょうか?

今日は、そんな悩みを解決するプロトコルの知恵、HTTP/1.1の「Chunked(チャンク)転送」について、郵便配達に例えてお話しします。

—

従来のやり方:先に「箱のサイズ」を教えるルール

まず、HTTPの基本ルールを知っておきましょう。通常、データを送るときには「Content-Length」というヘッダーをつけます。これは、いわば「荷物の重さ」を事前に申告するルールです。

1. サーバー:「これから1000バイトの荷物を送るよ!」(Content-Length: 1000)
2. ブラウザ:「了解、1000バイト分のスペースを確保して待つね」
3. サーバー:「はい、1000バイト届けました!」

これなら効率的ですよね。でも、もし「作りながら送りたい」場合、サーバーは最初に「全部で何バイトになるか」を知るために、生成が終わるまで待たなければなりません。これでは、ユーザーは真っ白な画面をずっと眺めることになります。

—

そこで登場!「Chunked転送」という小分け配送

そこで登場するのが `Transfer-Encoding: chunked` です。「全部で何バイトかはわからないけど、とりあえず出来上がった分から小分けにして送るね!」という方法です。

これは、郵便配達に例えると「巨大な手紙を、封筒を分けてどんどんポストに投函していく」ようなイメージです。

チャンク転送の仕組み

1. 「小分けで送るよ!」と宣言する:ヘッダーで `Transfer-Encoding: chunked` を送ります。
2. サイズを先に伝える:各小包(チャンク)の先頭に「この小包はあと何バイトあるよ」というサイズを16進数で書きます。
3. 最後に「終わり」を告げる:すべて送り終えたら、サイズが「0」のチャンクを送って、「もう荷物は終わりだよ」と伝えます。

—

実際のパケットの流れを見てみよう

難しく考えすぎないでくださいね。サーバーから送られてくる実際のデータ(レスポンス)は、こんな形をしています。

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked // 「これから小分けで送るよ!」という合図

5\r\n // このチャンクは5バイトあるよ
Hello\r\n // 本文

6\r\n // 次のチャンクは6バイトあるよ
World\r\n // 本文

0\r\n // 0バイト、つまり「これで終わり!」の終了チャンク
\r\n // 最後に空行を入れて終了

ここがポイント!

  • 「5」や「6」の部分:これが「サイズ」です。16進数で書くのがお約束です。
  • 「\r\n」:これは改行コードのこと。コンピュータにとっての「句読点」みたいなものですね。
  • 「0」のチャンク:これが非常に重要です。これを受け取ったブラウザは「ああ、これでデータは全部揃ったんだな」と判断して、画面を表示する準備を完了させます。

—

なぜこの仕組みが現場で大事なのか?

インフラエンジニアやバックエンドエンジニアとして働く際、この仕組みを知っておくと「デバッグ」の解像度が劇的に上がります。

例えば、Webサーバー(Nginxなど)の設定で、勝手にバッファリング(一度溜め込んでから送る設定)が効いていて、ストリーミング配信が上手くいかない……なんてトラブルは現場の「あるある」です。

  • ブラウザの表示が遅い?:途中でチャンクが止まっていないか、あるいは「0」の終了チャンクが正しく送られているかを確認する。
  • ログで見るとデータが変?:チャンクのサイズ情報(16進数)がデータ本体と混ざって見えていないか注意する。

—

一歩ずつ理解していきましょう

最初は「なぜわざわざサイズを16進数で書くの?」とか「0のチャンクって何のため?」と疑問に思うかもしれません。でも、これは「終わりが見えない仕事」を「終わらせるための工夫」なんです。

ネットワークの世界は、こうした「約束事」の積み重ねでできています。この「チャンク転送」という知恵があるおかげで、私たちはAIの回答をリアルタイムで眺めたり、動画のストリーミングを楽しんだりできているんですね。

もし、ブラウザの「開発者ツール(Networkタブ)」を眺める機会があれば、ぜひレスポンスヘッダーに `Transfer-Encoding: chunked` があるか探してみてください。普段見ているWebサイトの裏側で、パケットがどんなふうにバケツリレーされているのか、きっと新しい景色が見えてくるはずですよ!

それでは、また次の技術解説でお会いしましょう。ハッピー・ネットワーキング!

コメント

タイトルとURLをコピーしました