Há alguns meses, foi publicada a nova versão do padrão HTTP / 1.1. Tem um RFC especial para solicitações de intervalo, isso é muito mais legível do que o antigo spec, incluindo exemplos para muitos itens: tools.ietf.org/html/rfc7233
Thirler
Respostas:
135
A troca a seguir é entre o Chrome e um servidor da web estático, recuperando um vídeo MP4.
Pedido inicial - para o vídeo. Observe o Accept-Rangescabeçalho de resposta para indicar que o servidor tem suporte para cabeçalho de intervalo:
Cabeçalho de intervalo detectado na resposta anterior - solicitação subsequente com intervalo aberto para confirmar o suporte. A resposta retorna um status e Content-Rangecabeçalho 206 para indicar os bytes presentes no corpo da resposta:
O usuário clica na barra de progresso do vídeo além do intervalo baixado - uma solicitação de intervalo é emitida para começar a jogar a partir da posição selecionada:
O cabeçalho Transfer-Encoding em branco é um artefato da maneira como a comunicação HTTP foi capturada ou existe um servidor HTTP real gerando valores em branco para este cabeçalho?
swl10 de
7
No primeiro caso, parece que o servidor está retornando 64657027 bytes de conteúdo. Então, o que está acontecendo - o cliente está apenas jogando fora esse conteúdo e, em seguida, emitindo uma solicitação de intervalo para as partes realmente desejadas? Ou o servidor não está retornando nenhum conteúdo porque algo na mensagem do cliente diz para não fazer isso? Se assim for, o que é?
Morrie
3
@Morrie - parece que o servidor, sabendo que ele próprio suporta solicitações de intervalo, diz ao cliente "Eu aceito solicitações de intervalo" através do Accept-Ranges: bytescabeçalho, mas também envia o comprimento do conteúdo para o recurso para que o cliente possa fazer solicitações de intervalo com um superior limite. Pelo que sei, nada na mensagem do cliente diz para fazer isso - o servidor pode escolher responder com "aqui está o recurso inteiro" ou "Aceito solicitações de intervalo" - que, novamente, é a existência do Accept-Rangescabeçalho. Esse é o meu entendimento sobre isso de qualquer maneira.
Simon Whitehead
4
Mas o Content-Length de 64657027 na primeira resposta não significa que há, na verdade, tantos bytes de carga útil após o cabeçalho, que o cliente deve consumir porque a conexão é Keep-Alive? Estou me perguntando o que nessa mensagem de resposta diz que não há nenhuma carga útil.
Morrie
1
@Morrie Keep-alive é uma solicitação do cliente e o cliente não tem nenhuma obrigação de continuar usando a conexão. Acabei de concluir em meu próprio trabalho que, pelo menos para o Chrome, a primeira solicitação GET com intervalo "0-" é prontamente abortada assim que o cabeçalho é recebido, em vez de usar uma solicitação HEAD. Acredito que seja uma forma de evitar problemas com algum servidor que não implemente o verbo HEAD corretamente.
Respostas:
A troca a seguir é entre o Chrome e um servidor da web estático, recuperando um vídeo MP4.
Pedido inicial - para o vídeo. Observe o
Accept-Ranges
cabeçalho de resposta para indicar que o servidor tem suporte para cabeçalho de intervalo:Cabeçalho de intervalo detectado na resposta anterior - solicitação subsequente com intervalo aberto para confirmar o suporte. A resposta retorna um status e
Content-Range
cabeçalho 206 para indicar os bytes presentes no corpo da resposta:Solicitação de intervalo subsequente para capturar o final do arquivo (provavelmente para capturar os metadados finais):
O usuário clica na barra de progresso do vídeo além do intervalo baixado - uma solicitação de intervalo é emitida para começar a jogar a partir da posição selecionada:
fonte
Accept-Ranges: bytes
cabeçalho, mas também envia o comprimento do conteúdo para o recurso para que o cliente possa fazer solicitações de intervalo com um superior limite. Pelo que sei, nada na mensagem do cliente diz para fazer isso - o servidor pode escolher responder com "aqui está o recurso inteiro" ou "Aceito solicitações de intervalo" - que, novamente, é a existência doAccept-Ranges
cabeçalho. Esse é o meu entendimento sobre isso de qualquer maneira.