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 source
Réponses:
La requête HTTP en question n'est en fait valide que si le navigateur parle à un intermédiaire (proxy).
Votre exemple ressemblerait un peu plus à ce qui suit si le navigateur parlait directement avec un serveur Web:
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 via le protocole TCP (TCP est au dessus du protocole IP) tandis que la communication DNS, dans ce cas, se fait via le protocole UDP (UDP est aussi au dessus du protocole IP).
Voici la séquence de communication en bref:
Le client , l' exécution du navigateur, demande au serveur DNS pour un
A
enregistrement pourwww.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 parle 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 ceci , 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 / 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:
Vous pouvez imiter la même chose en faisant quelque chose comme ceci dans votre console ou invite de commande:
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. En outre, 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 contenir des enregistrements statiques dans un
hosts
fichier. 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.la source
GET http://www.pippo.it/hello.htm HTTP/1.1
serait donc une demande valide, si inhabituelle. Ce serait également une demande valide et habituelle à un proxy HTTP.gethostbyname()
est quelque peu dépassé. On ferait mieux de l'utilisergetaddrinfo()
...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 DNS serveur). 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 champ Host 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 faitGET /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 exempleGET http://www.pippo.it/hello.htm HTTP/1.1
),la source
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
enregistrement pour le nom d'hôtewww.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'est10.11.12.13
http
dans sa table interne et apprend qu'il doit utiliser le port 80.Le navigateur crée la connexion multicouche suivante:
10.11.12.13
Couche HTTP: créez une demande HTTP pour l'URL
/hello.htm
sur l'hôtewww.pippo.it
(car l'ordinateur10.11.12.13
peut héberger plusieurs domaines, il doit donc savoir lequel est souhaité)Bien sûr, j'omet tous les détails de la négociation 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 toutes les ressources supplémentaires nécessaires: images, CSS, Javascript, etc. Ensuite, il répète tout ce processus pour chacune de ces ressources.
la source
getaddrinfo
ougethostbyname
pour demander au système d'exploitation de résoudre l'adresse correspondante. De plus, le système d'exploitation utilise généralement plusieurs mécanismes pour essayer de rechercher des noms, pas seulement DNS. (En général, au moins le fichier hosts en plus du DNS.)