Gama de protocolo http

No protocolo http, pode ser encontrado: cancelamento de solicitação ou interrupção da transmissão de dados. Neste momento, o cliente recebeu parte dos dados, e é melhor solicitar a parte restante (ponto de interrupção para retomar a transmissão) quando solicitar posteriormente; ou, para arquivos maiores, capazes de suportar download de fragmentos multithread do cliente...

O acima exposto tem sido suportado por muitos produtos em nossas aplicações habituais, e o princípio está relacionado ao intervalo no protocolo http.

Range é um novo campo de cabeçalho de solicitação em HTTP/1.1. O documento rfc: RFC 7233: Hypertext Transfer Protocol (HTTP/1.1): Range Requests O protocolo HTTP é extenso e profundo, e há muitos designs engenhosos. Range pode ser um dos seguintes: eles. .

1. Protocolo de alcance:

1) Verifique se o servidor suporta Range:

O cliente inicia uma solicitação e, após o servidor recebê-la, se houver Accept-Ranges: bytes no cabeçalho da resposta, indica que Range é suportado.

Por exemplo, iniciamos uma solicitação por meio de curl -I para visualizar as informações do cabeçalho de resposta: (curl -I significa Mostrar apenas informações do documento)

$ curl -I http://127.0.0.1/rt1/2.mp4
HTTP/1.1 200 OK
Server: openresty/1.19.9.1
Date: Thu, 12 Jan 2023 08:04:32 GMT
Content-Type: video/mp4
Content-Length: 505199705
Last-Modified: Fri, 08 Jul 2022 07:09:25 GMT
Connection: keep-alive
ETag: "62c7d825-1e1cbc59"
Accept-Ranges: bytes

Acima de Accept-Ranges: bytes indica que a unidade para definir o intervalo é bytes; Content-Length indica o tamanho do arquivo. Se o servidor responder com o conteúdo do cabeçalho Accept-Ranges: none, significa que não é suportado!

2) Formato do protocolo de intervalo:

O cliente adiciona informações de intervalo no cabeçalho, indicando que uma solicitação de intervalo foi iniciada, e o formato é o seguinte:

Intervalo:unidade=primeiro byte pos-[último byte pos]

Por exemplo: unidade (como bytes) = posição inicial do byte - posição final do byte.

O servidor responde adicionando informações de intervalo no cabeçalho:

Intervalo de conteúdo: primeiro byte da unidade pos-[último byte pos]/[comprimento da entidade]
Por exemplo: Intervalo de conteúdo: byte início posição do byte-posição do byte final/tamanho do arquivo.

Nota: a posição do primeiro byte começa em 0!
Vejamos um exemplo: Suponha que haja um arquivo com tamanho de 5000 bytes, e agora queremos habilitar downloads multi-threaded (por exemplo, 4), e cada thread é responsável por baixar uma parte, então podemos dividi-lo em:

Range: bytes=0-1199 头1200个字节
Range: bytes=1200-2399 第二个1200字节
Range: bytes=2400-3599 第三个1200字节
Range: bytes=3600-5000 最后的1400字节

服务器给出响应:
// 第1个响应
Content-Length:1200
Content-Range:bytes 0-1199/5000
// 第2个响应
Content-Length:1200
Content-Range:bytes 1200-2399/5000
// 第3个响应
Content-Length:1200
Content-Range:bytes 2400-3599/5000
// 第4个响应
Content-Length:1400
Content-Range:bytes 3600-5000/5000

Content-Length indica o tamanho do intervalo correspondente e Content-Range retorna o intervalo correspondente à solicitação.

3) Código de resposta da solicitação de intervalo:

O servidor julga se é uma solicitação Range através do Range: bytes=0-xxx no cabeçalho da solicitação. Se este valor existir e for válido, ele enviará de volta apenas a parte solicitada do conteúdo do arquivo e o código de status do a resposta se tornará 206, indicando Partial Content. , e defina o Content-Range. Se for inválido, um código de status 416 será retornado, indicando que Intervalo de solicitação não é satisfatório. Se não houver Range no cabeçalho da solicitação, o servidor responderá normalmente e o Content-Range não será definido.

  • 206: Se a solicitação for bem-sucedida, o servidor retornará um código de status 206 Partial Content.
  • 416: Caso o intervalo solicitado esteja fora dos limites (o valor do intervalo excede o tamanho do recurso), o servidor retornará um código de status 416 Intervalo solicitado não satisfatório (o intervalo solicitado não pode ser satisfeito).
  • 200: Se o servidor não suportar a solicitação Range, o servidor retornará um código de status 200 OK.

4) Comparação com codificação de transferência fragmentada

O cabeçalho Transfer-Encoding permite a codificação em partes, o que é útil quando o volume de dados é grande e o tamanho da resposta não pode ser conhecido até que a solicitação seja totalmente processada. O servidor envia os dados diretamente para o cliente sem armazenar em buffer ou determinar o tamanho exato da resposta - esta última aumentando a latência. As solicitações de intervalo são compatíveis com transferências em partes e podem ser usadas sozinhas ou em conjunto.

2. Solicite um intervalo específico de dados do servidor

1) Faixa única:

Quando o cliente solicita, o intervalo da solicitação pode ser indicado por Range no cabeçalho. Neste momento, se o servidor suportar Range, ele retornará um código de status 206 e retornará os dados do intervalo especificado, e adicionará Content-Range no cabeçalho; caso contrário, não suporta , retorna 200.

Por exemplo: (curl -i significa imprimir o cabeçalho da resposta)

$ curl -i -H "Range: bytes=0-102300"   http://127.0.0.1/f1.txt
HTTP/1.1 206 Partial Content
Server: openresty/1.19.9.1
Date: Thu, 12 Jan 2023 09:34:49 GMT
Content-Type: text/plain
Content-Length: 10
Last-Modified: Thu, 12 Jan 2023 09:34:44 GMT
Connection: keep-alive
ETag: "63bfd434-a"
Content-Range: bytes 0-9/10

123456789

2) Multiescopo:

$ curl -i -H "Range: bytes=0-1,4-5"   http://127.0.0.1/f1.txt
HTTP/1.1 206 Partial Content
Server: openresty/1.19.9.1
Date: Thu, 12 Jan 2023 09:36:21 GMT
Content-Type: multipart/byteranges; boundary=00000000000000000001
Content-Length: 198
Last-Modified: Thu, 12 Jan 2023 09:34:44 GMT
Connection: keep-alive
ETag: "63bfd434-a"


--00000000000000000001
Content-Type: text/plain
Content-Range: bytes 0-1/10

12
--00000000000000000001
Content-Type: text/plain
Content-Range: bytes 4-5/10

56
--00000000000000000001--

O cabeçalho Range também oferece suporte à solicitação de várias partes do documento de uma só vez. Os intervalos de solicitação são separados por vírgula.

O servidor retorna o código de status 206 Partial Content e o cabeçalho Content-Type: multipart/byteranges; border=0000000000000000001 e o Content-Type: multipart/byteranges indica que a resposta tem vários byteranges. Cada parte do byterange tem seu próprio cabeçalho Content-type e Content-Range e usa o parâmetro de limite para dividir o corpo.

3) Escopo da condição:

Quando (após uma interrupção) as solicitações de mais fragmentos de recursos forem retomadas, deve-se garantir que o recurso não foi modificado desde o recebimento do último fragmento.

O  cabeçalho da solicitação If-Range  pode ser usado para gerar uma solicitação de intervalo condicional: se a condição for atendida, a solicitação condicional entrará em vigor e o servidor retornará uma resposta com um código de status 206 Parcial  e  o corpo da mensagem correspondente. Se a condição não for atendida, uma resposta com um código de status  200  OK será retornada e todo o recurso será retornado. Este cabeçalho pode   ser usado com o  validador  Last-Modified ou ETag , mas não ambos ao mesmo tempo.

referência:

Escopo da solicitação HTTP - HTTP | MDN

Vamos falar sobre Range, Content-Range | HappyCoding de HTTP :)

3. Exemplo: nginx fornece serviço de download de vídeo

O intervalo de http pode fornecer solicitações de intervalo, e a aplicação mais importante é a reprodução de vídeo.

1) configuração nginx:

Use a cena docker do openresty para iniciar, a configuração é a seguinte

server {
    listen       80;
    server_name  localhost;

    location = /f1.txt {
        root /data/;
    }
    location = /rt1/2.mp4 {
        root /data/;
    }

Crie os seguintes arquivos: /data/rt1/2.mp4 /data/f1.txt

Nota: o próprio nginx suporta Range, e vejo que o nginx também fornece o módulo ngx_http_slice_module (parâmetro --with-http_slice_module), que suporta Range de volta à fonte.

2) Acesso ao navegador:

Após configurar o nginx, visite via navegador: http://127.0.0.1/rt1/2.mp4 Abra o painel de controle do Chrome e mude para a página da guia rede

Pode-se observar que existem várias solicitações, o código de status da primeira solicitação é 200 e os códigos de status das solicitações restantes são todos 206 (conteúdo parcial-conteúdo parcial). E o Chrome é muito atencioso ao usar a ferramenta de decodificação de vídeo integrada para reproduzir arquivos MP4, e também há um botão de pausa. (Se você não pausar após a reprodução, o nginx cuspirá dados continuamente no Chrome e esse processo não será interrompido. O botão de pausa interromperá a comunicação e desconectará a conexão, e o nginx gravará o log de acesso neste momento).

Referência: [nginx] download de arquivo grande - awildfish - Blog Park

Acho que você gosta

Origin blog.csdn.net/liuxiao723846/article/details/128665109
Recomendado
Clasificación