Come funziona il metodo HTTP GET in relazione al protocollo DNS?


17

Sto cercando di comprendere i protocolli del livello applicazione nello stack TCP / IP. So che sia il protocollo HTTP che DNS rimangono al livello superiore (Livello applicazione). Pertanto, quando un browser desidera accedere a una risorsa, deve inviare una richiesta al server HTTP, come ad esempio:

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

Effettuando questa richiesta seguendo le regole del protocollo HTTP, utilizza l'URL della pagina, non l'indirizzo IP.

So che la richiesta DNS è necessaria per convertire l'URL in IP. Quindi la mia domanda è: HTTP richiama il protocollo DNS? Mi sembra impossibile, dal momento che entrambi sono protocolli di livello superiore (quindi DNS non può fornire un servizio a HTTP). Allo stesso modo anche TCP (che rimane a un livello inferiore) non può chiedere un servizio a un protocollo di livello superiore come DNS.

Quindi quando si verifica la richiesta DNS? E chi esegue tale richiesta?


1
Potresti accettare una delle risposte per chiarire quale di queste risposte alla domanda?
030

Risposte:


38

La richiesta HTTP in questione non è in realtà valida a meno che il browser non stia parlando con un intermediario (proxy).

Il tuo esempio sarebbe un po 'più simile al seguente se il browser stesse parlando direttamente con un server Web:

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

Ora, per metterlo in prospettiva, considera il modello OSI:

Il modello OSI

Abbiamo 3 sistemi in azione:

  • Un client che esegue il browser
  • Un server web che serve il sito
  • Un server DNS che conosce l'indirizzo IP del sito

I protocolli coinvolti sono, dal basso verso l'alto (minimo rilevante impostato su OP):

  • IP
  • TCP, UDP
  • HTTP, DNS

La comunicazione HTTP viene eseguita tramite il protocollo TCP (TCP è in cima al protocollo IP) mentre la comunicazione DNS, in questo caso, viene eseguita tramite il protocollo UDP (UDP è anche in cima al protocollo IP).

Ecco la sequenza di comunicazione in breve:

  1. Il client , che esegue il browser, richiede un record per il server DNS , utilizzando il protocollo UDP.Awww.pippo.it

    1.1. Sul client, è il sistema operativo che esegue la parte di risoluzione e risponde al browser --- il browser non parla mai direttamente al server DNS, piuttosto attraverso il sistema operativo invocando gethostbyname () o il più recente getaddrinfo () . In Windows, l'ordine in cui il sistema operativo risolve gli indirizzi è probabile definito da qualcosa di simile a questo , mentre su Linux la precedenza risolvere è definito da/etc/nsswitch.conf

  2. Il server DNS , utilizzando il protocollo UDP, risponde al client con un record / indirizzo IP, se esiste

  3. Il client apre una connessione TCP sulla porta 80 del server Web e scrive il testo seguente:

    Richiesta HTTP:

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

    Puoi imitare la stessa cosa facendo qualcosa del genere nella tua console o nel prompt dei comandi:

    > 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
    

    seguito da due righe vuote. Se il contenuto richiesto esiste, il server Web lo stamperà sullo schermo. Se c'è un browser dall'altra parte, il testo della risposta viene analizzato dal browser e tutti i tag, collegamenti, script e immagini vengono visualizzati in quella che chiamiamo pagina Web.

In realtà ci sono alcuni dettagli, ad esempio i browser possono memorizzare nella cache gli indirizzi IP se hai già visitato un dominio, in modo che la risoluzione DNS non sia necessaria. Inoltre, i browser moderni potrebbero tentare di eseguire la risoluzione prima di averne effettivamente bisogno ( prefetching DNS ) per accelerare la navigazione.

Inoltre, il tuo computer potrebbe avere record statici in un hostsfile. Se un record corrisponde alla richiesta, la voce statica locale viene utilizzata per prima e nessun server DNS viene mai contattato. Questo è configurabile e non necessariamente vero, ma è l'impostazione predefinita sui sistemi operativi con cui ho familiarità.


4
@trikly: ecco a cosa serve l'intestazione 'Host'. Senza di essa puoi avere un solo sito Web per indirizzo IP. Questa è una differenza chiave tra HTTP / 1.0 e HTTP / 1.1. Per fortuna i browser HTTP / 1.0 ora sono rari, ma se vuoi soddisfarli, hai bisogno di un indirizzo IP diverso per ogni sito (possono ancora essere ospitati sullo stesso server).
AE,

1
@AE Grazie. Penso di non essere chiaro nella mia domanda, ed è per questo che Hrvoje non ha capito cosa stavo dicendo. (Avrei dovuto dire dominio anziché URL). Sono contento che tu abbia ancora capito.
trlkly

1
Dici " Questa non è una richiesta HTTP corretta ", e questo è per lo più vero, ma è più vicino di quanto tu implichi: " Per consentire la transizione verso gli URL assoluti in tutte le richieste nelle future versioni di HTTP, tutti i server HTTP / 1.1 DEVONO accettare il modulo absoluteURI in richieste ". (RFC 2616 §5.1.2) Quindi GET http://www.pippo.it/hello.htm HTTP/1.1sarebbe una richiesta valida, se inusuale. Sarebbe anche una richiesta valida e normale a un proxy HTTP.
wfaulk,

1
gethostbyname()è in qualche modo obsoleto. Uno sarebbe meglio usare getaddrinfo()...
glglgl il

1
@Utku purtroppo no perché SSH presume che l'altra estremità parli il protocollo SSH mentre telnet è un protocollo di testo semplice e può essere usato per parlare con qualsiasi altro protocollo semplice come diciamo POP3, IMAP purché non utilizzino SSL / TLS nel qual caso tu avrebbe bisogno di avvolgere la sessione telnet con helper come sslwrap o qualcosa di simile.
Hrvoje Špoljar,

12

HTTP viene trasportato su TCP, che è un protocollo IP. Per effettuare una richiesta HTTP, il browser deve aprire una connessione TCP e, a tale scopo, necessita dell'indirizzo IP di destinazione (ovvero l'indirizzo IP del server). Per risolvere il nome host del server, deve quindi emettere una richiesta DNS (in genere la richiesta DNS stessa viene inviata dal sistema operativo quando un programma chiama le sue funzioni di risoluzione dei nomi; tuttavia, nulla impedisce a un programma di inviare richieste DNS da solo al DNS server). Una volta stabilita la connessione, può inviare la sua richiesta HTTP, che contiene il percorso della risorsa richiesta, e un campo Host con il nome host del server (ad es., Host: www.pippo.it). Il nome host non va sulla riga della richiesta (in realtà lo sarebbeGET /hello.htm HTTP/1.1), tranne quando la richiesta viene inviata a un proxy HTTP (e in questo caso è presente l'URL completo, inclusa la parte del protocollo, ad es. GET http://www.pippo.it/hello.htm HTTP/1.1),


Grazie, ora è più chiaro, ma non completamente. Scrivi che il browser deve emettere una richiesta DNS. Ok, ma dopo aver ricevuto l'IP dal server DNS, come lo usa? Voglio dire, tale IP non appare nella richiesta HTTP. Quindi suppongo che ci sia ancora un altro passo prima di emettere la richiesta HTTP e penso che sia l'apertura della connessione. Questo punto non mi è molto chiaro ... Grazie ancora!
Giancarlo Perlo,

5
In effetti, l'IP è necessario per aprire la connessione TCP, all'interno della quale viene trasportata la richiesta HTTP. In realtà, l'indirizzo IP del client e del server viene inviato insieme a TUTTI i pacchetti della connessione. Il modo migliore per imparare come funziona è probabilmente installare uno strumento di acquisizione di pacchetti (Wireshark è un eccellente multipiattaforma e open source), acquisire una semplice richiesta HTTP, filtrarla dal resto dell'attività di rete e vedere come tutti i pacchetti sono stati inviati sul filo. Dovresti effettivamente essere in grado di vedere anche la richiesta DNS prima della connessione TCP.
Ale

1
Le richieste proxy devono utilizzare l'intestazione Host, non inserire l'URL completo nella riga GET.
OrangeDog,

1
@OrangeDog: No, al contrario. RFC 7230 (sezione 5.3.2) afferma esplicitamente che un client che effettua una richiesta a un proxy DEVE utilizzare un URI assoluto nella riga di richiesta. (Deve esserci ancora un'intestazione Host che duplica le informazioni dalla riga di richiesta; sezione 5.4).
Hmakholm lasciò Monica il

7

La procedura è la seguente:

  1. L'utente (tu) fornisce al browser un URL, come http://www.pippo.it/hello.htm
  2. Il browser lo divide in tre parti:

    • Protocollo http
    • Nome host www.pippo.it
    • Percorso URL /hello.htm

    (un URL più complicato potrebbe avere anche altre parti, ignorerò questa possibilità per ora)

  3. Il browser sa che per creare una connessione IP ha bisogno di un indirizzo IP. Per ottenere un indirizzo IP, è necessario utilizzare DNS (a meno che non abbia l'indirizzo memorizzato nella cache).

    1. Il browser richiede al sistema operativo l'indirizzo IP di un server DNS; supponiamo che ottenga 8.8.8.8.
    2. Il browser crea la seguente connessione a più livelli:

      • Livello IP: connettersi a 8.8.8.8
      • Livello UDP: imposta il pacchetto per la porta di destinazione 53
      • Livello DNS: crea una richiesta DNS per un Arecord per il nome hostwww.pippo.it

      Ovviamente sto omettendo molti dettagli, ad esempio sul formato esatto dei pacchetti coinvolti.

    3. Il browser riceve una risposta DNS (sovrapposta a UDP sovrapposta a IP ecc.) Che fornisce l'indirizzo IP per www.pippo.it, diciamo che è10.11.12.13
  4. Il browser sa che per creare una connessione TCP ha bisogno di un numero di porta. Per ottenere un numero di porta, cerca il protocollo httpnella sua tabella interna e impara che dovrebbe usare la porta 80.
  5. Il browser crea la seguente connessione a più livelli:

    • Livello IP: connettersi a 10.11.12.13
    • Livello TCP: imposta i pacchetti sulla porta di destinazione 80
    • Livello HTTP: crea una richiesta HTTP per l'URL /hello.htmsull'host www.pippo.it(perché il computer su 10.11.12.13potrebbe ospitare diversi domini, quindi deve sapere quale è desiderato)

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

    Ovviamente sto omettendo tutti i dettagli dell'handshake TCP e simili.

  6. Il browser riceve una risposta HTTP (sovrapposta a TCP sovrapposta a IP, ecc.) Contenente il contenuto di hello.htm

E per buona ragione, menzionerò che il browser ora esamina il contenuto di quella risposta e identifica eventuali risorse aggiuntive necessarie: immagini, CSS, Javascript, ecc. Quindi ripete l'intero processo per ciascuna di tali risorse.


4
Il passaggio 3 in realtà non è qualcosa che l'applicazione stessa fa. L'applicazione utilizza semplicemente qualcosa di simile getaddrinfoo gethostbynameper chiedere al sistema operativo di risolverlo. Inoltre, il sistema operativo utilizza in genere più meccanismi per cercare di cercare nomi, non solo DNS. (In genere almeno il file hosts oltre a DNS.)
Håkan Lindqvist

Grazie! È una risposta davvero impressionante e dettagliata e anche molto utile!
Giancarlo Perlo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.