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:
GET / HTTP/1.1
Host: superuser.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.0 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: [removed for security]
DNT: 1
If-Modified-Since: Tue, 09 Jul 2013 07:14:17 GMT
La primera línea especifica qué documento debe devolver el servidor. Las otras líneas se llaman encabezados; se ven así:
Header name: Header value
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:
HTTP/1.1 200 OK
Cache-Control: public, max-age=60
Content-Type: text/html; charset=utf-8
Expires: Tue, 09 Jul 2013 07:27:20 GMT
Last-Modified: Tue, 09 Jul 2013 07:26:20 GMT
Vary: *
X-Frame-Options: SAMEORIGIN
Date: Tue, 09 Jul 2013 07:26:19 GMT
Content-Length: 139672
<!DOCTYPE html>
<html>
[...snip...]
</html>
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 es 200 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 devolver 404 Not Found
, y si no se le permite acceder al contenido en cuestión, se supone que debe regresar 403 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.