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