¿Cómo funciona el método HTTP GET en relación con el protocolo DNS?

17

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?

Giancarlo Perlo
fuente
1
¿Podría aceptar una de las respuestas para aclarar cuál de estas respuestas es la pregunta?
030

Respuestas:

38

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:

GET /hello.htm HTTP/1.1
Host: www.pippo.it

Ahora, para poner esto en perspectiva, considere el modelo OSI:

El modelo OSI

Tenemos 3 sistemas en acción:

  • Un cliente que ejecuta el navegador.
  • Un servidor web que sirve el sitio
  • Un servidor DNS que conozca la dirección IP del sitio

Los protocolos involucrados son, de abajo hacia arriba (mínimo relevante establecido en OP):

  • IP
  • TCP, UDP
  • HTTP, DNS

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:

  1. El cliente , que ejecuta el navegador, le pide al servidor DNS un Aregistro www.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

  2. El servidor DNS , utilizando el protocolo UDP, responde al cliente con un registro / dirección IP, si existe

  3. El cliente abre una conexión TCP en el puerto 80 del servidor web y escribe el siguiente texto:

    Solicitud HTTP:

    GET /hello.htm HTTP/1.1
    Host: www.pippo.it
    

    Puede imitar lo mismo haciendo algo como esto en su consola o símbolo del sistema:

    > telnet www.pippo.it 80
    Trying 195.128.235.49...
    Connected to www.pippo.it.
    Escape character is '^]'.
    GET /hello.htm HTTP/1.1
    Host: www.pippo.it
    

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

Hrvoje Špoljar
fuente
44
@trikly: para eso está el encabezado 'Host'. Sin ella, solo puede tener un sitio web por dirección IP. Esta es una diferencia clave entre HTTP / 1.0 y HTTP / 1.1. Afortunadamente, los navegadores HTTP / 1.0 son raros ahora, pero si desea atenderlos, entonces necesita una dirección IP diferente para cada sitio (todavía pueden estar alojados en el mismo servidor).
AE
1
@ AA Gracias. Creo que no estaba claro en mi pregunta, y es por eso que Hrvoje no entendió lo que estaba diciendo. (Debería haber dicho dominio en lugar de URL). Me alegra que aún lo hayas entendido.
Trlyly
1
Usted dice " Esto no es una solicitud HTTP correcta ", y eso es principalmente cierto, pero está más cerca de lo que implica: " Para permitir la transición a absoluteURIs en todas las solicitudes en futuras versiones de HTTP, todos los servidores HTTP / 1.1 DEBEN aceptar el formulario absoluteURI en solicitudes ". (RFC 2616 §5.1.2) Por GET http://www.pippo.it/hello.htm HTTP/1.1lo tanto , sería una solicitud válida, si fuera inusual. También sería una solicitud válida y habitual a un proxy HTTP.
wfaulk
1
gethostbyname()Está algo anticuado. Sería mejor usar getaddrinfo()...
glglgl
1
@Utku desafortunadamente no porque SSH presume que el otro extremo habla el protocolo SSH mientras que telnet es un protocolo de texto sin formato y se puede usar para hablar con cualquier otro protocolo simple como decir POP3, IMAP siempre que no usen SSL / TLS en cuyo caso necesitaría envolver la sesión de telnet con ayuda como sslwrap o algo similar.
Hrvoje Špoljar
12

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 ejemplo GET http://www.pippo.it/hello.htm HTTP/1.1),

Cerveza inglesa
fuente
Gracias, ahora está más claro, pero no completamente. Usted escribe que el navegador debe emitir una solicitud de DNS. Ok, pero después de haber recibido la IP del servidor DNS, ¿cómo la usa? Quiero decir, esa IP no aparece en la solicitud HTTP. Así que supongo que todavía hay un paso más antes de emitir la solicitud HTTP y creo que es la apertura de la conexión. Este punto no está muy claro para mí ... ¡Gracias una vez más!
Giancarlo Perlo
55
De hecho, se necesita la IP para abrir la conexión TCP, dentro de la cual se transporta la solicitud HTTP. En realidad, la dirección IP del cliente y del servidor se envía junto con TODOS los paquetes de la conexión. Probablemente, la mejor manera de aprender cómo funciona es instalar una herramienta de captura de paquetes (Wireshark es una excelente plataforma multiplataforma y de código abierto), capturar una solicitud HTTP simple, filtrarla del resto de la actividad de la red y ver cómo Todos los paquetes fueron enviados por cable. En realidad, también debería poder ver la solicitud de DNS antes de la conexión TCP.
Ale
1
Las solicitudes proxy deben usar el encabezado Host, no poner la URL completa en la línea GET.
OrangeDog
1
@OrangeDog: No, al contrario. RFC 7230 (sección 5.3.2) dice explícitamente que un cliente que realiza una solicitud a un proxy DEBE usar un URI absoluto en la línea de solicitud. (Debe todavía ser una cabecera Host duplicar la información de la línea de petición, la sección 5.4).
hmakholm dejó a Mónica el
7

El procedimiento es así:

  1. El usuario (usted) le da al navegador una URL, como http://www.pippo.it/hello.htm
  2. El navegador lo divide en tres partes:

    • Protocolo http
    • Nombre de host www.pippo.it
    • Ruta URL /hello.htm

    (Una URL más complicada podría tener otras partes también, ignoraré esa posibilidad por ahora)

  3. 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é).

    1. El navegador solicita al sistema operativo la dirección IP de un servidor DNS; supongamos que se pone 8.8.8.8.
    2. El navegador construye la siguiente conexión de varias capas:

      • Capa IP: conectarse a 8.8.8.8
      • Capa UDP: establece el paquete para el puerto de destino 53
      • Capa DNS: cree una solicitud DNS para un Aregistro para el nombre de hostwww.pippo.it

      Por supuesto, estoy omitiendo muchos detalles sobre, por ejemplo, el formato exacto de los paquetes involucrados.

    3. El navegador recibe una respuesta de DNS (en capas sobre UDP en capas sobre IP, etc.) que proporciona la dirección IP para www.pippo.it, digamos que es10.11.12.13
  4. El navegador sabe que para crear una conexión TCP, necesita un número de puerto. Para obtener un número de puerto, busca el protocolo httpen su tabla interna y aprende que debe usar el puerto 80.
  5. El navegador construye la siguiente conexión de varias capas:

    • Capa IP: conectarse a 10.11.12.13
    • Capa TCP: establezca los paquetes en el puerto de destino 80
    • Capa HTTP: cree una solicitud HTTP para la URL /hello.htmen el host www.pippo.it(porque la computadora en 10.11.12.13podría estar alojando varios dominios, por lo que necesita saber cuál se desea)

      GET /hello.htm HTTP/1.1
      Host: www.pippo.it
      ...
      

    Por supuesto, estoy omitiendo todos los detalles del protocolo de enlace TCP y tal.

  6. El navegador recibe una respuesta HTTP (en capas sobre TCP en capas sobre IP, etc.) que contiene el contenido de 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.

David Z
fuente
44
Paso 3 realmente no es algo que hace la aplicación en sí. La aplicación solo usa algo como getaddrinfoo gethostbynamepara 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).
Håkan Lindqvist
¡Gracias! ¡Es una respuesta realmente impresionante y detallada y también muy útil!
Giancarlo Perlo