J'essaie de comprendre les protocoles de couche application dans la pile TCP/IP. Je sais que les protocoles HTTP et DNS restent à la couche supérieure (couche d'application). Ainsi, lorsqu'un navigateur souhaite accéder à une ressource, il doit envoyer une demande au serveur HTTP, comme par exemple:
GET www.pippo.it/hello.htm HTTP/1.1
En faisant cette demande en suivant les règles du protocole HTTP, il utilise l'URL de la page, pas l'adresse IP.
Je sais que la requête DNS est nécessaire pour convertir l'URL en IP. Ma question est donc la suivante: HTTP appelle-t-il le protocole DNS? Cela me semble impossible, car les deux sont des protocoles de couche supérieure (donc DNS ne peut pas fournir un service à HTTP). De la même manière, même TCP (qui reste à un niveau inférieur) ne peut pas demander un service à un protocole de niveau supérieur comme DNS.
Alors, quand la demande DNS se produit-elle? Et qui exécute une telle demande?
La requête HTTP en question est en fait non valide à moins que le navigateur ne parle à un intermédiaire (proxy).
Votre exemple ressemblerait un peu plus à ce qui suit si le navigateur parlait directement avec un serveur Web:
GET /hello.htm HTTP/1.1
Host: www.pippo.it
Maintenant, pour mettre cela en perspective, considérons le modèle OSI:
Nous avons 3 systèmes en action:
Les protocoles impliqués sont, de bas en haut (ensemble pertinent minimum à OP):
La communication HTTP se fait sur le TCP (TCP est au dessus du protocole IP) tandis que la communication DNS, dans ce cas, se fait sur le protocole UDP (UDP est aussi au dessus de le protocole IP).
Voici la séquence de communication en bref:
Le client , exécutant le navigateur, demande au serveur DNS un A
enregistrement pour www.pippo.it
, en utilisant le protocole UDP.
1.1. Sur le client, c'est le système d'exploitation qui s'occupe de la résolution et revient au navigateur --- le navigateur ne parle jamais directement au serveur DNS, plutôt via le système d'exploitation en appelant gethostbyname () ou le plus récent getaddrinfo () . Sous Windows, l'ordre dans lequel le système d'exploitation résout les adresses est probablement défini par quelque chose comme this , tandis que sous Linux, la priorité de résolution est définie par /etc/nsswitch.conf
Le serveur DNS , utilisant le protocole UDP, répond au client avec un enregistrement/une adresse IP, si elle existe
Le client ouvre une connexion TCP sur le port 80 du serveur Web et écrit le texte suivant:
Requête HTTP:
GET /hello.htm HTTP/1.1
Host: www.pippo.it
Vous pouvez imiter la même chose en faisant quelque chose comme ça dans votre console ou l'invite de commande:
> 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
suivi de deux lignes vides. Si le contenu demandé existe, le serveur Web l'imprimera à l'écran. S'il y a un navigateur de l'autre côté, le texte de la réponse est analysé par le navigateur, et toutes les balises, liens, scripts et images sont affichés dans ce que nous appelons une page Web.
En réalité, il y a plus de détails, par exemple les navigateurs peuvent mettre en cache les adresses IP si vous avez déjà visité un domaine, de sorte que la résolution DNS devient inutile. De plus, les navigateurs modernes peuvent essayer de résoudre le problème avant d'en avoir réellement besoin ( prélecture DNS ) pour accélérer votre navigation.
En outre, votre ordinateur peut avoir des enregistrements statiques dans un fichier hosts
. Si un enregistrement correspond à la demande, l'entrée statique locale est utilisée en premier et aucun serveur DNS n'est jamais contacté. Ceci est configurable, et pas nécessairement vrai, mais c'est la valeur par défaut sur les systèmes d'exploitation que je connais.
HTTP est transporté sur TCP, qui est un protocole IP. Pour faire une requête HTTP, le navigateur doit ouvrir une connexion TCP, et pour cela, il a besoin de l'adresse IP de destination (c'est-à-dire l'adresse IP du serveur). Pour résoudre le nom d'hôte du serveur, il doit donc émettre une requête DNS (généralement la requête DNS elle-même est envoyée par le système d'exploitation lorsqu'un programme appelle ses fonctions de résolution de noms; cependant, rien n'empêche un programme d'envoyer lui-même des requêtes DNS au serveur DNS. Une fois la connexion établie, il peut envoyer sa requête HTTP, qui contient le chemin d'accès à la ressource demandée, et un hôte champ avec le nom d'hôte du serveur (par exemple, Host: www.pippo.it
). Le nom d'hôte ne va pas sur la ligne de demande (ce serait en fait GET /hello.htm HTTP/1.1
), sauf lorsque la demande est envoyée à un proxy HTTP (et dans ce cas, l'URL complète est présente, y compris la partie protocole, par exemple GET http://www.pippo.it/hello.htm HTTP/1.1
),
La procédure se déroule comme suit:
http://www.pippo.it/hello.htm
Le navigateur divise cela en trois parties:
http
www.pippo.it
/hello.htm
(une URL plus compliquée pourrait aussi avoir d'autres parties, j'ignorerai cette possibilité pour l'instant)
Le navigateur sait que pour créer une connexion IP, il a besoin d'une adresse IP. Pour obtenir une adresse IP, il doit utiliser DNS (sauf si l'adresse est mise en cache).
8.8.8.8
.Le navigateur crée la connexion multicouche suivante:
8.8.8.8
A
pour le nom d'hôte www.pippo.it
Bien sûr, j'omets beaucoup de détails sur par exemple le format exact des paquets impliqués.
www.pippo.it
, disons que c'est 10.11.12.13
http
dans sa table interne et apprend qu'il devrait utiliser le port 80.Le navigateur crée la connexion multicouche suivante:
10.11.12.13
Couche HTTP: créez une requête HTTP pour l'URL /hello.htm
sur l'hôte www.pippo.it
(car l'ordinateur sur 10.11.12.13
peut héberger plusieurs domaines, il doit donc savoir lequel est souhaité)
GET /hello.htm HTTP/1.1
Host: www.pippo.it
...
Bien sûr, j'omet tous les détails de la poignée de main TCP et autres).
hello.htm
Et pour faire bonne mesure, je mentionnerai que le navigateur examine maintenant le contenu de cette réponse et identifie les ressources supplémentaires nécessaires: images, CSS, Javascript, etc. Ensuite, il répète tout ce processus pour chacune de ces ressources.