Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Transfer-Encoding Protocolo HTTP

A veces, los datos que se envían desde el servidor pueden ser bastante grandes. Además, es posible que no conozcamos su tamaño final. Por ejemplo, si es necesario descargar un archivo comprimido o durante una transmisión de video.

Para resolver este problema, se puede cargar completamente los datos en la memoria del servidor, calcular el Content-Length y realizar la transferencia. Una vez que el navegador haya recibido todo el contenido, lo mostrará instantáneamente.

Transferencia de datos en fragmentos

Existe otra solución que permite transferir datos de manera confiable cuando no conocemos su tamaño final. En el siguiente enlace se muestra un ejemplo de una imagen que se renderiza gradualmente a medida que se transfiere los datos. Para esto, se utiliza el mecanismo de transferencia en fragmentos (chunks) y el encabezado especial Transfer-Encoding con el valor chunked.

En una respuesta estándar, recibimos todo el cuerpo (body) y luego lo procesamos. No podemos procesarlo por partes porque eso implicaría introducir nuestras propias reglas únicas dentro del protocolo. Sin embargo, al transferir en fragmentos, podemos procesar la respuesta antes de recibir todo el cuerpo (body).

Hagamos una solicitud al sitio web httpwatch.com:

telnet httpwatch.com 80

GET https://www.httpwatch.com/httpgallery/chunked/chunkedimage.aspx HTTP/1.1
Host: httpwatch.com
Connection: close

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Pragma: no-cache
Trailer: X-HttpWatch-Sample
# en lugar de Content-Length, aquí se utiliza el encabezado Transfer-Encoding
Transfer-Encoding: chunked
Content-Type: image/jpeg; charset=utf-8
Expires: -1
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Arr-Disable-Session-Affinity: True
Date: Fri, 10 Jul 2020 09:18:05 GMT

400 # tamaño del fragmento
Algunos datos del primer fragmento
400
Datos del segundo fragmento
400
y así sucesivamente
0 # último fragmento de longitud cero

Ten en cuenta que los encabezados, como siempre, se separan del cuerpo de la solicitud con una línea en blanco. Al comienzo de cada fragmento se indica su tamaño. Luego, se encuentran los datos y al final del fragmento se agrega una línea en blanco, seguida del siguiente fragmento y así sucesivamente. De esta manera, se pueden transferir tantos fragmentos como sea necesario, el tiempo está limitado solo por los tiempos de espera dentro del servidor.

Para finalizar la transferencia, es necesario enviar el último fragmento, que debe tener una longitud cero. Después de eso, se agregan dos líneas en blanco y se considera que la solicitud se ha transmitido por completo.

Formato de los mensajes

Para separar los registros de los tamaños de los bloques (partes) de su contenido, se utiliza el separador CRLF (como cadena: "\r\n"; como bytes en formato HEX: 0x0D, 0x0A). La longitud del bloque es el tamaño del contenido del bloque, sin tener en cuenta los separadores CRLF.

Representación esquemática: <longitud del bloque en HEX><CRLF><contenido del bloque><CRLF>

El último bloque se construye de la misma manera, pero tiene el siguiente aspecto debido a la falta de contenido: 0<CRLF><CRLF>

El estándar también permite usar solo CR o solo LF como separador.


Materiales adicionales

  1. Wikipedia / Sistema hexadecimal (HEX)

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY