Rango de protocolo http

En el protocolo http, se puede encontrar: cancelación de solicitud o interrupción de la transmisión de datos. En este momento, el cliente ha recibido parte de los datos y es mejor solicitar la parte restante (punto de interrupción para reanudar la transmisión) cuando los solicite más tarde; o, para archivos más grandes, capaz de admitir la descarga de fragmentos multiproceso del cliente...

Lo anterior ha sido compatible con muchos productos en nuestras aplicaciones habituales, y el principio está relacionado con el Rango en el protocolo http.

Rango es un nuevo campo de encabezado de solicitud en HTTP/1.1. El documento rfc: RFC 7233: Protocolo de transferencia de hipertexto (HTTP/1.1): Solicitudes de rango El protocolo HTTP es extenso y profundo, y hay muchos diseños ingeniosos. Rango puede ser uno de ellos. .

1. Protocolo de alcance:

1) Compruebe si el servidor admite Rango:

El cliente inicia una solicitud y, una vez que el servidor la recibe, si hay Accept-Ranges: bytes en el encabezado de la respuesta, indica que se admite el rango.

Por ejemplo, iniciamos una solicitud a través de curl -I para ver la información del encabezado de respuesta: (curl -I significa Mostrar solo información del 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

Arriba de Accept-Ranges: bytes indica que la unidad para definir el rango son bytes; Content-Length indica el tamaño del archivo. Si el servidor responde con el contenido del encabezado Accept-Ranges: none, ¡significa que no es compatible!

2) Formato del protocolo de rango:

El cliente agrega información de rango en el encabezado, lo que indica que se inicia una solicitud de rango y el formato es el siguiente:

Rango: unidad = primer byte pos-[último byte pos]

Por ejemplo: unidad (como bytes) = posición inicial del byte - posición final del byte.

El servidor responde agregando información de rango en el encabezado:

Rango de contenido: unidad primer byte pos-[último byte pos]/[longitud de la entidad]
Por ejemplo: Rango de contenido: byte posición inicial del byte-posición final del byte/tamaño de archivo.

Nota: ¡la posición del primer byte comienza desde 0!
Veamos un ejemplo: supongamos que hay un archivo con un tamaño de 5000 bytes y ahora queremos habilitar la descarga de subprocesos múltiples (por ejemplo, 4), y cada subproceso es responsable de descargar una parte, luego podemos dividirla. en:

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 el tamaño del rango correspondiente y Content-Range devuelve el rango correspondiente a la solicitud.

3) Código de respuesta de solicitud de rango:

El servidor juzga si se trata de una solicitud de rango a través del rango: bytes = 0-xxx en el encabezado de la solicitud. Si este valor existe y es válido, solo devolverá la parte solicitada del contenido del archivo y el código de estado del la respuesta será 206, lo que indica contenido parcial y establecerá el rango de contenido. Si no es válido, se devuelve un código de estado 416, que indica que el rango de solicitud no es satisfactorio. Si no hay ningún rango en el encabezado de la solicitud, el servidor responderá normalmente y no se establecerá el rango de contenido.

  • 206: si la solicitud tiene éxito, el servidor devolverá un código de estado de contenido parcial 206.
  • 416: en el caso de que el rango solicitado esté fuera de los límites (el valor del rango excede el tamaño del recurso), el servidor devolverá un código de estado 416 Rango solicitado no satisfecho (el rango solicitado no se puede satisfacer).
  • 200: si el servidor no admite la solicitud de rango, el servidor devolverá un código de estado 200 OK.

4) Comparación con la codificación de transferencia fragmentada

El encabezado Transfer-Encoding permite la codificación fragmentada, lo cual es útil cuando el volumen de datos es grande y el tamaño de la respuesta no se puede conocer hasta que la solicitud se procese por completo. El servidor envía los datos directamente al cliente sin almacenar en el búfer ni determinar el tamaño exacto de la respuesta; esto último aumenta la latencia. Las solicitudes de rango son compatibles con transferencias fragmentadas y se pueden usar solas o juntas.

2. Solicitar un rango específico de datos del servidor.

1) Rango único:

Cuando el cliente solicita, el rango de la solicitud se puede indicar mediante Rango en el encabezado. En este momento, si el servidor admite Rango, devolverá un código de estado 206 y devolverá los datos del rango especificado, y agregará Rango de contenido. en el encabezado; de lo contrario, no es compatible, devuelve 200.

Por ejemplo: (curl -i significa imprimir el encabezado de respuesta)

$ 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) Múltiples alcances:

$ 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--

El encabezado Rango también admite la solicitud de varias partes del documento a la vez. Los rangos de solicitudes están separados por una coma.

El servidor devuelve el código de estado de contenido parcial 206 y el encabezado Content-Type: multipart/byteranges; border=00000000000000000001, y Content-Type: multipart/byteranges indica que la respuesta tiene múltiples byteranges. Cada parte de byterange tiene su propio encabezado de tipo de contenido y rango de contenido, y utiliza el parámetro de límite para dividir el cuerpo.

3) Alcance de la condición:

Cuando (después de una interrupción) se reanudan las solicitudes de más fragmentos de recursos, se debe garantizar que el recurso no haya sido modificado desde que se recibió el último fragmento.

El  encabezado de solicitud If-Range  se puede utilizar para generar una solicitud de rango condicional: si se cumple la condición, la solicitud condicional entrará en vigor y el servidor devolverá una respuesta con un código de estado de 206 Parcial y el  cuerpo  del mensaje correspondiente. Si no se cumple la condición,   se devuelve una respuesta con un código de estado de 200 OK y se devuelve el recurso completo. Este encabezado se puede   usar con el validador de última modificación  o  ETag , pero no con ambos al mismo tiempo.

referencia:

Alcance de la solicitud HTTP: HTTP | MDN

Hablemos de rango, rango de contenido | HappyCoding de HTTP :)

3. Ejemplo: nginx proporciona servicio de descarga de videos

El rango de http puede proporcionar solicitudes de rango y la aplicación más importante es la reproducción de video.

1) configuración de nginx:

Utilice la escena acoplable de openresty para comenzar, la configuración es la siguiente

server {
    listen       80;
    server_name  localhost;

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

Cree los siguientes archivos: /data/rt1/2.mp4 /data/f1.txt

Nota: nginx en sí admite Range, y veo que nginx también proporciona el módulo ngx_http_slice_module (con el parámetro http_slice_module), que admite Range back-to-source.

2) Acceso al navegador:

Después de configurar nginx, visite a través del navegador: http://127.0.0.1/rt1/2.mp4 Abra el panel de control de Chrome y cambie a la pestaña de red

Se puede ver que hay varias solicitudes, el código de estado de la primera solicitud es 200 y los códigos de estado de las solicitudes restantes son 206 (contenido parcial-contenido parcial). Y Chrome está muy atento al utilizar la herramienta de decodificación de video incorporada para reproducir archivos MP4, y también hay un botón de pausa. (Si no hace una pausa después de jugar, nginx escupirá datos continuamente a Chrome y este proceso no se interrumpirá. El botón de pausa interrumpirá la comunicación y desconectará la conexión, y nginx escribirá el registro de acceso en este momento).

Referencia: descarga de archivos grandes [nginx] - awildfish - Blog Park

Supongo que te gusta

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