本記事は、マイクロソフト本社の IE チームのブログ から記事を抜粋し、翻訳したものです。 
【元記事】Download Resumption in Internet Explorer (2011/6/4 2:55 AM)

 

ファイルのダウンロードは、短時間で問題なく完了することがほとんどですが、サイズが大きい場合は時間がかかります。ユーザーが途中で "一時停止" を選択したり、WiFi 接続が切断するなどのネットワークの問題が発生したりした場合には、ダウンロードが中断する可能性があります。

image

IE 9 のダウンロード マネージャーの重要な拡張機能の 1 つとして、ダウンロード処理の再開が可能[1] になりました。

ダウンロードの再開は、ファイル全体を再度ダウンロードするのではなく、中断した箇所以降から転送を再開するものです。

Internet Explorer がダウンロードを再開可能と判断するには、以下の条件が満たされる必要があります。

  1. URL が HTTP または HTTPS で始まる
  2. サーバーが Accept-Ranges: none 応答ヘッダーを送信していない
  3. サーバーが応答で厳密 (Strong) な ETag ヘッダーを送信する
  4. サーバーが後続のダウンロード要求で Range ヘッダーを尊重する

ダウンロードの再開は、現在クライアントにあるリソースのバージョン (ETag によって識別) と、クライアントがサーバーに送信してほしいファイルの範囲を指定して HTTP 要求を送信することで可能になります。以下に、ダウンロード マネージャーで [再開] ボタンをクリックしたときに送信される要求の例を示します。

GET /BigFile.exe HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 
Host: 127.0.0.1 
Range: bytes=700000- 
If-Range: "StrongETAG"
Connection: Keep-Alive

サーバーは、ダウンロードを再開することが許されており、さらに If-Range ヘッダーでクライアントが特定したバージョンが現在も使用可能である場合、送信するファイルの範囲を示す Content-Range ヘッダーを付けて HTTP/206 応答を送信します。

クライアントが要求する範囲を送信できない、または送信することが適切でない場合、サーバーは HTTP/200 応答を送信します。この場合は、ダウンロードが最初からやり直されます。

完了しなかったダウンロードは、場合によって再開できないことがあります。これにはいくつかの理由が考えられます。

サーバーによっては、単純にダウンロードの再開を禁止している場合があります。たとえば、Accept-Ranges: none を使用して明示的に禁止したり、HTTP/206 応答を返さないことによって暗黙的に禁止したりする場合があります。Accept-Ranges: none を明示的に送信することには、ダウンロード マネージャーの [一時停止] ボタンが無効になるという利点があります。ボタンが無効化されることにより、ユーザーがダウンロードを一時停止しようとして、結局最初からやり直さなければならなくなる、という事態を回避できます。

image

多くの場合の問題は、クライアントが適切なファイルを再開するために必要な ETag を、サーバーが指定していないことが原因です[2][3]。実際、サーバーが厳密 (Strong) でない ETag を送信しているケースを目にしたことがあります。また、厳密な Etag は引用符で囲む必要があります。応答に厳密な ETag がない場合、[一時停止] ボタンは無効になります。

サーバーがダウンロードの再開をサポートしていても、要求を実行するために必要な状態情報 (セッション Cookie や HTTP 認証など) がなくなっているために再開できないという場合もあります。たとえば、ユーザーがブラウザーをいったん閉じてからまた開いた場合には、このような情報が使用できなくなっている可能性があります。

Eric

[1] IE 8 およびそれより前の IE は、理想的な環境さえあればダウンロードを再開できましたが、実際にはそのような環境が実現することはほとんどありませんでした。

[2] たとえば、現在 Download.com では、ファイルのダウンロード時に ETag の送信を行っていません。

[3] 応答で Vary ヘッダーを送信するサイトは、その際に必ず ETag も送信する必要があります。これにより、ブラウザーが条件に応じて応答を再検証できるようにします。