HTTP Rangeリクエスト


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リクエストに対するキャッシュを行いません