巨大な荷物を「小分け」で受け取る魔法:HTTPのRangeヘッダーと206 Partial Contentの世界
皆さん、こんにちは。ネットワークの深淵を旅するエンジニアの皆さん、あるいは今まさにインフラの世界の入り口に立ったばかりの皆さん。
今日は、Webブラウザで大きなファイルをダウンロードする際や、動画サイトでシークバーを動かした時に、なぜあんなにもスムーズに続きが再生されるのか……その「裏側の秘密」を紐解いていきましょう。
キーワードは「Range(範囲)指定」と「206 Partial Content」です。一見難しそうな名前ですが、実は私たちの日常にある「郵便」の仕組みと全く同じなんですよ。一歩ずつ、一緒に見ていきましょう!
—
1. 「全部ください」だけがHTTPじゃない
普段、私たちがWebサイトを見る時、ブラウザはサーバーに対して「このページを全部ちょうだい!」とリクエストを送っています。これが標準的なHTTPのやり取りです。
しかし、もし相手が「1GBもある巨大な動画ファイル」だったらどうでしょう?
もし通信が途中で切れたら、また最初から1GB分をダウンロードし直さなければなりません。これはあまりに非効率ですよね。
そこで登場するのがRangeヘッダーです。これは、サーバーに対して「全部じゃなくていいから、この部分だけちょうだい!」とピンポイントでお願いする仕組みなのです。
例えるなら「カタログ通販の分冊配送」
分厚い百科事典を注文する時、「まずは最初の10ページだけ送って。次は11ページから20ページまで送って」とお願いするようなものです。これなら、もし途中で配送トラックが故障しても、どこまで届いたかさえ覚えていれば、続きから再開できますよね。
—
2. サーバーからの返事「206 Partial Content」
私たちが「Rangeヘッダー」を使って「この範囲をちょうだい!」とリクエストを送ると、サーバーはそれに対して特別な返事を返します。
それがステータスコード 「206 Partial Content(一部のコンテンツ)」 です。
- 200 OK: 「はい、全部用意しました!」(丸ごと配送)
- 206 Partial Content: 「了解!お願いされた範囲のデータだけ切り取ったよ」(部分配送)
この「206」が返ってきたら、サーバーは「はい、あなたのリクエスト通り、ファイル全体の〇〇バイト目から△△バイト目までを切り出しましたよ」という証明書(Content-Rangeヘッダー)を添えてデータを渡してくれます。
—
3. 実践!どんなふうにやり取りしているの?
では、実際にブラウザやプログラムがどんな言葉で会話しているのか、覗いてみましょう。
クライアントからのリクエスト(お願い)
「このファイルの、最初の500バイト目から999バイト目までをください」という指定です。
GET /movie.mp4 HTTP/1.1
Host: example.com
Range: bytes=500-999 # ここで「500バイト目から999バイト目まで!」と指定
サーバーからのレスポンス(返事)
「了解!その範囲のデータ(計500バイト)を送るよ」という返事です。
HTTP/1.1 206 Partial Content
Content-Type: video/mp4
Content-Range: bytes 500-999/2000 # 全体で2000バイトあるうちの、500-999だよ!
Content-Length: 500 # 今回送るデータのサイズだよ
どうでしょう? 意外とシンプルだと思いませんか? この「範囲指定」があるおかげで、私たちは動画のシークバーを好きな位置に動かしても、瞬時にその場面から再生できるのです。
—
4. なぜこれが「レジュームダウンロード」に繋がるの?
この仕組みの最大のメリットは、「通信が途切れても、続きから再開できる(レジューム)」という点です。
例えば、ダウンロードが900バイト目で止まってしまったとします。そしたら、次にこうリクエストすればいいのです。
Range: bytes=900- # 「900バイト目から、最後まで全部ちょうだい!」
サーバーは「900バイト以降ですね、了解!」と、残りのデータを送ってくれます。私たちのPCは、手元にある「0〜899バイト」と、新しく届いた「900バイト以降」を合体させて、1つの完璧なファイルとして完成させるわけです。
—
最後に:ネットワークは「思いやり」でできている
HTTP/1.1でこの仕組みが導入されたことで、Webは単なる「文書閲覧ツール」から、「リッチな動画配信や巨大なデータ交換を支えるプラットフォーム」へと進化しました。
インフラエンジニアとして現場に出ると、こうした「無駄を省くための工夫」にたくさん出会います。Rangeヘッダーもその一つ。「全部一度に送るのではなく、必要な分だけを、必要なタイミングで」という考え方は、現代のネットワーク設計における重要な哲学でもあります。
皆さんも、ブラウザの「開発者ツール(F12キー)」を開いて、ネットワークタブを見てみてください。動画サイトを再生しながら「206」という数字と「Range」という文字を探すと……きっと、今までただの記号に見えていたパケットたちが、まるで生きたメッセージのように感じられるはずですよ。
それでは、次回のインフラ深掘り解説でお会いしましょう!
コメント