HTTP Rangeリクエストとは、HTTPによりファイルの一部分だけを取得するための方法です。
背景
巨大ファイルが普及しており、ファイルの途中部分だけの取得が必要になっています。具体的に、PDFや動画(MPEG-Dash)ファイルに対して、プレイヤーはHTTP Rangeリクエストを送信します。
プロトコル
プレイヤー側は、HTTPによるリクエスト時に以下のHTTPヘッダを追加します:
- Range: bytes=101-200
そして、サーバ側は、以下の振る舞いをします:
- 部分(Partial)コンテンツを返す場合
- レスポンスコード:206
- 以下のようなヘッダおよび部分コンテンツを返します
- Accept-Ranges: bytes
- Content-Length: 100
- Content-Range: bytes 101-200/3024
- 補足
- リクエスト時と異なるRangeを返すこともあり得ます。
- コンテンツ全体を返す場合
- レスポンスコード:200
- コンテンツ全体を返します
- 補足
- これもRFCで想定された動作です。しかし、パニックを起こすプレイヤーも存在します。
キャッシュ
オリジンサーバにおけるRangeリクエスト処理はかなり枯れてきています。一方、キャッシュサーバにおける実装の完成度はまだ低いと言わざるを得ない状況です。キャッシュの実装レベルを分類すると以下となります:
- 部分ファイルのキャッシュを行う
- リクエストされた部分だけをキャッシュします。
- 全体ファイルのキャッシュを行う
- ファイルの後半部分であっても、先頭からファイルを読み込もうとします。この結果、キャッシュにおける待ちが発生します。
- キャッシュしない
- Rangeリクエストに対するキャッシュを行いません