Como funcionam os downloads com pausa em pausa?

19

Eu uso o Internet Download Manager (IDM) para baixar dados e notei que, na janela de progresso do download, mostra se um download pode ou não ser pausado (retomado). Normalmente, os sites de compartilhamento de arquivos não permitem que a transferência seja retomada se a conexão for interrompida.

Então a pergunta é a seguinte: como isso funciona? É alguma configuração que é feita no servidor? Como isso difere dos downloads de torrent, onde o download sempre pode ser retomado.

Rafay
fonte

Respostas:

27

Da perspectiva da codificação, um download é apenas uma matriz de bytes incluída no fluxo de resposta HTTP.

O protocolo HTTP 1.1 (na página 30) inclui um campo no cabeçalho chamado 'Intervalo', que permite à solicitação especificar o deslocamento de bytes e o comprimento da resposta solicitada.

Então, em essência, você pode dizer: "me dê o objeto HTTP neste URL, mas eu só quero os 1024º - 4096º bytes dele". O navegador do cliente anexa o fluxo de bytes à parte do arquivo já baixada. O cliente pode dizer onde precisa retomar simplesmente verificando o tamanho do arquivo já baixado e incrementando-o para determinar o deslocamento necessário.

Quanto ao seu gerenciador de downloads, ele envia uma solicitação HTTP "HEAD". Se o código de resposta for 206 (conteúdo parcial), o fluxo http suportará a retomada.

Frank Thomas
fonte
FTP também é um protocolo comumente usado para transferir arquivos. Costumava ser o principal meio, embora agora o HTTP seja provavelmente mais comum.
ChrisInEdmonton
O FTP usa essencialmente a mesma construção, embora eu precise pesquisar os detalhes antes de tentar implementar o código que o usa.
Frank Thomas
1

Isso pode ser tratado usando um cookie persistente , para não ser confundido com um cookie de sessão ou você pode usar [Viewstate] se o site for criado no ASP.NET, no entanto, isso não é uma boa prática. Frank Thomas tem a melhor resposta.

Josh Campbell
fonte
11
Não tenho certeza do motivo pelo qual essa resposta foi rebaixada, então eu a votei.
Ramhound
@FrankThomas, acabei de confirmar alguns fatos com nosso desenvolvedor sênior e ele disse que você 'poderia' usar um cookie persistente ou viewstate para armazenar as informações de índice da matriz de bytes usadas no rastreamento e retomada do download através de um downloader baseado em navegador, mas não foi uma boa prática. Normalmente, para arquivos recuperáveis ​​grandes, como um produto MS, você baixa um aplicativo do Gerenciador de downloads e ele funciona exatamente como você disse. Eu votei na sua resposta.
Josh Campbell #
Esta resposta parece sem sentido. Não é um problema para determinar quanto do arquivo foi baixado; o cliente já sabe disso. Você pode comunicar isso de volta ao servidor usando um cookie, mas existem abordagens muito melhores. Cabeçalhos, parâmetros GET ou POST, etc. A questão é perguntar como a transferência de arquivos é retomada, não como passar informações para um servidor.
ChrisInEdmonton
O OP perguntou como funciona e eu o apontei na direção de Cookies para que ele pudesse fazer pesquisas adicionais. Há uma dúzia de maneiras diferentes de um desenvolvedor fazer um downloader recuperável. Eu teria feito isso usando cookies no cliente para rastrear o status do download por meio de um índice start-stop e usado o C # no back-end para calcular quanto foi baixado (do índice X para o índice Y) e depois retomado a partir de Y. Um download para desktop O gerente faz exatamente a mesma coisa, apenas armazena suas informações em um arquivo de texto ou banco de dados. Isso não é stackoverflow, não estou escrevendo código fonte.
Josh Campbell
@ JoshCampbell, o problema é que sua solução funcionaria apenas para pessoas que usassem seu software cliente e servidor específicos. Existem maneiras padrão de resolver esse problema, como Frank aponta em sua resposta, e não é necessário codificá-lo. Além disso, sua resposta não aponta o processo pelo qual alguns sites permitem que o OP retome os downloads e, portanto, não responde à pergunta. Por isso eu comentei.
ChrisInEdmonton