Estoy tratando de entender los protocolos de la capa de aplicación en la pila TCP / IP. Sé que tanto el protocolo HTTP como el DNS permanecen en la capa superior (capa de aplicación). Entonces, cuando un navegador quiere acceder a un recurso, tiene que enviar una solicitud al servidor HTTP, como por ejemplo:
GET www.pippo.it/hello.htm HTTP/1.1
Al realizar esta solicitud siguiendo las reglas del protocolo HTTP, utiliza la URL de la página, no la dirección IP.
Sé que la solicitud de DNS es necesaria para convertir URL a IP. Entonces mi pregunta es: ¿HTTP invoca el protocolo DNS? Me parece imposible, ya que ambos son protocolos de capa superior (por lo que DNS no puede proporcionar un servicio a HTTP). Del mismo modo, incluso TCP (que permanece en un nivel inferior) no puede solicitar un servicio en un protocolo de nivel superior como DNS.
Entonces, ¿cuándo ocurre la solicitud de DNS? ¿Y quién realiza tal pedido?
fuente
Respuestas:
La solicitud HTTP en cuestión no es válida a menos que el navegador esté hablando con un intermediario (proxy).
Su ejemplo se parecería un poco más al siguiente si el navegador estaba hablando directamente con un servidor web:
Ahora, para poner esto en perspectiva, considere el modelo OSI:
Tenemos 3 sistemas en acción:
Los protocolos involucrados son, de abajo hacia arriba (mínimo relevante establecido en OP):
La comunicación HTTP se realiza a través del protocolo TCP (TCP está por encima del protocolo IP) mientras que la comunicación DNS, en este caso, se realiza a través del protocolo UDP (UDP también está por encima del protocolo IP).
Aquí está la secuencia de comunicación en resumen:
El cliente , que ejecuta el navegador, le pide al servidor DNS un
A
registrowww.pippo.it
, utilizando el protocolo UDP.1.1. En el cliente, es el sistema operativo el que hace la parte de resolución y responde al navegador --- el navegador nunca se comunica directamente con el servidor DNS, sino a través del sistema operativo invocando gethostbyname () o el nuevo getaddrinfo () . En Windows, el orden en que el sistema operativo resuelve direcciones probablemente se define por algo como esto , mientras que en Linux la prioridad de resolución se define por
/etc/nsswitch.conf
El servidor DNS , utilizando el protocolo UDP, responde al cliente con un registro / dirección IP, si existe
El cliente abre una conexión TCP en el puerto 80 del servidor web y escribe el siguiente texto:
Solicitud HTTP:
Puede imitar lo mismo haciendo algo como esto en su consola o símbolo del sistema:
seguido de dos líneas vacías. Si el contenido solicitado existe, el servidor web lo imprimirá en la pantalla. Si hay un navegador en el otro lado, el texto de respuesta es analizado por el navegador, y todas las etiquetas, enlaces, scripts e imágenes se representan en lo que llamamos una página web.
En realidad, hay algunos detalles más, por ejemplo, los navegadores pueden almacenar en caché las direcciones IP si ya visitó algún dominio, por lo que la resolución de DNS se vuelve innecesaria. Además, los navegadores modernos pueden intentar resolver antes de que realmente lo necesite ( captación previa de DNS ) para acelerar su navegación.
Además, su computadora puede tener registros estáticos en un
hosts
archivo. Si un registro coincide con la solicitud, la entrada estática local se usa primero y nunca se contacta a ningún servidor DNS. Esto es configurable y no necesariamente cierto, pero es el valor predeterminado en los sistemas operativos con los que estoy familiarizado.fuente
GET http://www.pippo.it/hello.htm HTTP/1.1
lo tanto , sería una solicitud válida, si fuera inusual. También sería una solicitud válida y habitual a un proxy HTTP.gethostbyname()
Está algo anticuado. Sería mejor usargetaddrinfo()
...HTTP se transporta a través de TCP, que es un protocolo IP. Para realizar una solicitud HTTP, el navegador debe abrir una conexión TCP y, para ello, necesita la dirección IP de destino (es decir, la dirección IP del servidor). Para resolver el nombre de host del servidor, debe emitir una solicitud de DNS (generalmente, el sistema operativo envía la solicitud de DNS en sí cuando un programa llama a sus funciones de resolución de nombre; sin embargo, nada impide que un programa envíe solicitudes de DNS por sí mismo al DNS servidor). Una vez que se establece la conexión, puede enviar su solicitud HTTP, que contiene la ruta al recurso solicitado, y un campo Host con el nombre de host del servidor (por ejemplo,
Host: www.pippo.it
). El nombre de host no va en la línea de solicitud (en realidad seríaGET /hello.htm HTTP/1.1
), excepto cuando la solicitud se envía a un proxy HTTP (y en este caso, la URL completa está presente, incluida la parte del protocolo, por ejemploGET http://www.pippo.it/hello.htm HTTP/1.1
),fuente
El procedimiento es así:
http://www.pippo.it/hello.htm
El navegador lo divide en tres partes:
http
www.pippo.it
/hello.htm
(Una URL más complicada podría tener otras partes también, ignoraré esa posibilidad por ahora)
El navegador sabe que para crear una conexión IP, necesita una dirección IP. Para obtener una dirección IP, necesita usar DNS (a menos que tenga la dirección en caché).
8.8.8.8
.El navegador construye la siguiente conexión de varias capas:
8.8.8.8
A
registro para el nombre de hostwww.pippo.it
Por supuesto, estoy omitiendo muchos detalles sobre, por ejemplo, el formato exacto de los paquetes involucrados.
www.pippo.it
, digamos que es10.11.12.13
http
en su tabla interna y aprende que debe usar el puerto 80.El navegador construye la siguiente conexión de varias capas:
10.11.12.13
Capa HTTP: cree una solicitud HTTP para la URL
/hello.htm
en el hostwww.pippo.it
(porque la computadora en10.11.12.13
podría estar alojando varios dominios, por lo que necesita saber cuál se desea)Por supuesto, estoy omitiendo todos los detalles del protocolo de enlace TCP y tal.
hello.htm
Y como buena medida, mencionaré que el navegador ahora examina el contenido de esa respuesta e identifica los recursos adicionales necesarios: imágenes, CSS, Javascript, etc. Luego repite todo este proceso para cada recurso.
fuente
getaddrinfo
ogethostbyname
para pedirle al sistema operativo que resuelva la dirección. Además, el sistema operativo generalmente usa múltiples mecanismos para intentar buscar nombres, no solo DNS. (Por lo general, al menos el archivo de hosts además de DNS).