Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

Rangeヘッダ(レンジヘッダ)とは | 意味や読み方など丁寧でわかりやすい用語解説

Rangeヘッダ(レンジヘッダ)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

読み方

日本語表記

レンジヘッダ (レンジヘッダ)

英語表記

Range header (レンジヘッダー)

用語解説

Rangeヘッダは、HTTPプロトコルにおいて、クライアントがサーバーに対してリソース(ファイルなど)全体ではなく、その一部だけを要求するために使用するリクエストヘッダである。このヘッダを利用することで、クライアントは指定したバイト範囲のデータのみを効率的に取得できる。

Rangeヘッダの主な目的は、ネットワーク帯域幅の節約とユーザーエクスペリエンスの向上にある。例えば、大きなファイルをダウンロードする際に通信が中断した場合、最初からダウンロードし直すのではなく、中断した箇所から再開できる。また、動画や音声コンテンツをストリーミング再生する際に、ユーザーが任意の時点にシーク(早送りや巻き戻し)できるようになるのも、Rangeヘッダが部分的なデータを高速に取得するからである。これにより、全体をダウンロードするまで待つ必要がなくなり、即座にコンテンツの再生や特定の部分へのアクセスが可能となる。サーバー側も、常にファイル全体を送信する負荷から解放され、必要な部分だけを提供することでリソースを効率的に利用できる。このように、Rangeヘッダはコンテンツの配信効率を高め、ユーザーの利便性を向上させる上で不可欠な要素である。

詳細としては、RangeヘッダはRange: bytes=start-endという形式で記述され、クライアントが要求するバイト範囲を指定する。例えば、Range: bytes=0-499は、リソースの先頭から499バイト目までのデータ(合計500バイト)を要求していることを意味する。これは、例えばファイルの一部をプレビューしたり、非常に大きなファイルの先頭部分だけを取得してファイルタイプを確認するような場合に有用である。また、bytes=500-のように記述すると、500バイト目からリソースの最後までを要求する。これは、ダウンロードを再開する際に、すでに取得済みの部分を除いて残りを取得するようなシナリオで利用される。さらに、bytes=-200と記述した場合は、リソースの末尾から200バイト分を要求する。これは、ログファイルの最新部分だけを確認するようなケースで有効である。加えて、複数のバイト範囲を一度に要求することも可能で、例えばRange: bytes=0-100,200-300のようにコンマで区切って指定できる。この場合、サーバーは指定された複数の部分データをまとめて返すか、それぞれを個別の部分として返す。

サーバーがRangeヘッダによる部分的なコンテンツの取得に対応している場合、クライアントからのRangeリクエストに対しては、HTTPステータスコード206 Partial Contentとともに応答を返す。この応答にはContent-Rangeヘッダが含まれ、実際に送信されたデータのバイト範囲と、元のリソース全体のサイズが示される。例えば、Content-Range: bytes 0-499/10000という記述は、全体のサイズが10000バイトのリソースのうち、0バイト目から499バイト目までのデータが送信されたことを意味する。応答のボディには、要求された部分データのみが含まれる。

一方、サーバーがRangeヘッダに対応していない場合や、リクエストされたバイト範囲がリソースのサイズを超えているなど無効な範囲指定である場合は、異なる応答が返される。サーバーが部分的なコンテンツの取得に対応していない場合、通常は200 OKステータスコードとともにリソース全体を返す。この時、サーバーはAccept-Ranges: noneヘッダをレスポンスに含めることで、部分的なリクエストを受け付けないことを明示する場合がある。もしサーバーが部分的なコンテンツの取得に対応している場合は、Accept-Ranges: bytesヘッダを初回のリソース応答に含めることで、クライアントにその対応状況を伝えることができる。また、クライアントが要求したバイト範囲が不正である(例えば、リソースのサイズを超える範囲を要求した)場合、サーバーは416 Range Not Satisfiableステータスコードを返すことがある。

Rangeヘッダを利用する際には、リソースの整合性を確保することも重要である。クライアントがRangeリクエストを送信する際に、対象のリソースがサーバー側で更新されていないことを確認したい場合がある。例えば、長時間のダウンロード中に元のファイルがサーバー側で変更されてしまうと、すでにダウンロード済みの部分と新しくダウンロードする部分とで内容が食い違い、最終的にファイルが破損する可能性がある。このような問題を避けるために、クライアントはIf-RangeヘッダをRangeリクエストに含めることがある。If-Rangeヘッダには、以前に取得したリソースのETag値(リソースの内容を一意に識別するタグ)やLast-Modified日付(リソースが最後に更新された日時)が指定される。サーバーはIf-Rangeヘッダの値と現在のリソースの状態を比較し、一致していればRangeヘッダで指定された部分コンテンツを206 Partial Contentとして返す。もし一致しない(つまり、リソースがサーバー側で変更されている)場合は、サーバーはRangeリクエストを無視し、リソース全体を200 OKとして返すことで、クライアントに最新の完全なリソースを再ダウンロードさせるよう促す。これにより、部分的なデータが古くなってしまうことによる不整合を防ぎ、データの正確性を保つことができる。

Rangeヘッダは、ウェブアプリケーションやストリーミングサービスにおいて、ユーザーに快適な体験を提供し、同時にネットワークリソースを効率的に利用するための重要なメカニズムである。システムエンジニアを目指す者にとって、このヘッダがどのように機能し、どのようなシナリオで利用されるかを理解することは、効率的で堅牢なシステムを設計・実装する上で不可欠な知識となる。

関連コンテンツ