Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo sabe el navegador cuánta página se ha cargado? 2 respuestas
Ocasionalmente, al descargar un archivo en un navegador web, el progreso de la descarga no "sabe" el tamaño total del archivo, o qué tan avanzado está en la descarga, solo muestra la velocidad a la que se está descargando, con un total como "Desconocido".
¿Por qué el navegador no sabe el tamaño final de algunos archivos? ¿Dónde obtiene esta información en primer lugar?
Respuestas:
Para solicitar documentos de servidores web, los navegadores utilizan el protocolo HTTP. Es posible que conozca ese nombre de su barra de direcciones (puede estar oculto ahora, pero cuando haga clic en la barra de direcciones, copie la URL y péguela en algún editor de texto, verá
http://
al principio). HTTP es un protocolo simple basado en texto. Funciona así:Primero, su navegador se conecta al servidor del sitio web y envía una URL del documento que desea descargar (las páginas web también son documentos) y algunos detalles sobre el navegador en sí ( User-Agent, etc.). Por ejemplo, para cargar la página principal en el sitio SuperUser
http://superuser.com/
, mi navegador envía una solicitud similar a esta:La primera línea especifica qué documento debe devolver el servidor. Las otras líneas se llaman encabezados; se ven así:
Estas líneas envían información adicional que ayuda al servidor a decidir qué hacer.
Si todo está bien, el servidor responderá enviando el documento solicitado. La respuesta comienza con un mensaje de estado, seguido de algunos encabezados (con detalles sobre el documento) y finalmente, si todo está bien, el contenido del documento. Así es como se ve la respuesta del servidor SuperUser para mi solicitud:
Después de la última línea, el servidor de SuperUser cierra la conexión.
La primera línea (
HTTP/1.1 200 OK
) contiene el código de respuesta , en este caso es200 OK
. Significa que el servidor ha decidido que puede devolver un documento, según lo solicitado, y promete que el contenido que sigue será dicho documento. Si este no es el caso, el código será otra cosa y proporcionará alguna indicación de la razón por la que el servidor no solo devuelve un documento como respuesta: por ejemplo, si no puede encontrar el documento solicitado, se supone que debe devolver404 Not Found
, y si no se le permite acceder al contenido en cuestión, se supone que debe regresar403 Forbidden
.Después de esta primera línea de estado, siguen los encabezados de respuesta; proporcionan más información sobre el contenido que se devuelve, como su contenido
Content-type
.Lo siguiente es una línea vacía. Señala el hecho de que no seguirán más encabezados de respuesta. Todo lo que pase de esa línea es el contenido del documento que solicitó. Entonces, en el ejemplo anterior,
<!DOCTYPE html>
es la primera línea de la página de inicio de SuperUser (un documento HTML). Si estuviera solicitando un documento para descargar, probablemente serían algunos caracteres galimatías, porque la mayoría de los formatos de documentos son ilegibles sin procesamiento previo.De vuelta a los encabezados. La más interesante para nosotros es la última,
Content-Length
. Informa al navegador cuántos bytes de datos debe esperar después de la línea vacía, por lo que básicamente es el tamaño del documento expresado en bytes. Este encabezado no es obligatorio y puede ser omitido por el servidor. A veces, el tamaño del documento no se puede predecir (por ejemplo, cuando el documento se genera sobre la marcha), a veces los programadores perezosos no lo incluyen (bastante común en los sitios de descarga de controladores), a veces los sitios web son creados por novatos que no saben de tal encabezado.De todos modos, sea cual sea el motivo, puede faltar el encabezado. En ese caso, el navegador no sabe cuántos datos enviará el servidor y, por lo tanto, muestra el tamaño del documento como desconocido , esperando que el servidor cierre la conexión. Y esa es la razón de los tamaños de documentos desconocidos.
fuente
El
Content-Length
encabezado HTTP es opcional en algunos casos y, como tal, no se puede transmitir con el archivo; el final del archivo se señalará cuando se cierre el socket.fuente
Content-Length
se usa el campo de encabezado o si se transfiere el documentoTransfer-Encoding: chunked
. Este último permite generar dinámicamente contenido y enviarlo por partes a medida que se genera y puede señalar el final del documento.Cuando el contenido (por ejemplo, un
.pdf
documento o una hoja de Excel) se crea sobre la marcha, el tamaño no se puede conocer antes. En estos casos, el servidor no puede enviarle el tamaño de la descarga antes y el navegador no puede mostrar el tamaño total.fuente
.pdf
archivos sobre la marcha. Mientras los datos no se escriban de manera completa, no conoce el tamaño, pero ya puede enviar el ata al navegador. Ya hice esto en Java y envié un archivo de Excel al navegador que se generó sobre la marcha. Desde el lado de los navegadores, parecía una descarga, pero desde el lado de los servidores es una transmisión. Por lo tanto, es posible transmitir.pdf
archivos incluso si no puede imaginar esto. Desde el navegador parece una descarga sin duración conocida..pdf
archivo o una hoja de Excel!