Qui «revient» dans une recherche DNS récursive?


16

J'essaie de comprendre la différence entre les recherches DNS itératives et récursives. Fondamentalement, je pense que l'itération est comme appeler un grand magasin à la recherche d'un produit, et quand ils ne l'ont pas, ils vous donnent le numéro d'une autre de leurs succursales à appeler, puis vous appelez l'autre succursale vous-même. Versus récursif, c'est comme appeler le grand magasin, et quand ils n'ont pas ce que vous cherchez, ils appellent l'autre succursale en votre nom à la recherche du produit. Le fait est que je reçois des opinions contradictoires à ce sujet en ce qui concerne le DNS. Quand je pense à récursif, je pense à quelque chose qui ressemble à ceci: texte alternatif

Mais en lisant des articles sur le Web, et même en faisant une recherche d'image Google pour DNS récursif , je vois beaucoup plus d'exemples qui ressemblent à ceci: texte alternatif

Pour moi, ce deuxième exemple semble plus itératif que récursif, car chacun des "autres serveurs DNS" indique au "serveur DNS préféré" l'adresse de la prochaine machine à rechercher, plutôt que de la rechercher au nom du serveur préféré. Serveur dns. Le seul élément récursif que je vois est que le serveur DNS préféré effectue des recherches au nom du client DNS, mais à partir de maintenant, cela semble certainement itératif.

Je suppose donc que ma question est la suivante: la recherche DNS "récursive" signifie-t-elle vraiment uniquement récursive dans le sens où le serveur DNS préféré fait quelque chose au nom du client, mais est-il vraiment itératif à partir de maintenant? La majorité des résultats que je vois dans la recherche d'images Google me portent à croire que, ce qui soulève alors la question, la première image de ce message est-elle tout simplement fausse?


Consultez le podcast Ask Mr DNS, divertissant, informatif, et ils gèrent le DNS depuis 1989, ont écrit ou co-écrit tous les livres O'Reily DNS, etc. ask-mrdns.com Apprenez-en plus que vous ne l'avez jamais voulu savoir.
Ronald Pottol

Réponses:


16

Votre dernier paragraphe est correct.

L'indicateur "Récursivité souhaitée" (RD) envoyé par le client dans l'en-tête de demande DNS (voir RFC 1035) demande au serveur "veuillez me donner la réponse complète à cette question".

Ce serveur demande de manière itérative à la chaîne de serveurs de noms la bonne réponse. Ces requêtes ne devraient pas avoir elles-mêmes le bit RD défini.

En fin de compte, la réponse du serveur récursif aura l'indicateur «Récursion disponible» (RA) défini, indiquant que la réponse a effectivement été pleinement répondue. Inversement, un serveur faisant autorité ne définira pas le drapeau RA.

À mon humble avis, c'est un mauvais choix de terminologie.

Pour ce que ça vaut, ce premier diagramme que vous avez trouvé est fondamentalement incorrect. Les serveurs racine n'exécutent pas de requêtes vers un autre serveur, ils émettent uniquement des références vers d'autres serveurs.


4

Pour autant que je le comprenne, la "recherche récursive" est uniquement du point de vue du demandeur d'origine. Donc, s'il demande à un serveur DNS et obtient une réponse complètement résolue, alors c'est une "requête récursive". Si ce serveur à son tour effectue des recherches récursives ou itératives, ce n'est pas quelque chose dont le demandeur d'origine doit se soucier.


1

Le premier des deux diagrammes de votre question est incorrect. Les serveurs racine n'envoient pas de requêtes à d'autres serveurs. Si les serveurs racine transmettaient en fait des requêtes comme indiqué dans ce diagramme, le système DNS serait beaucoup plus vulnérable aux attaques DoS qu'il ne l'est réellement.

Le deuxième diagramme est généralement correct mais trop simplifié pour vous montrer la nature récursive des recherches. Le diagramme est cependant suffisamment détaillé pour que nous puissions indiquer où se produit la récursivité.

Le serveur DNS à côté du numéro 12indiqué Preferred DNS serverest celui où la récursivité se produit. Le terme serveur DNS préféré n'est pas une terminologie standard. Ce serveur serait généralement appelé un récurseur DNS de mise en cache ou une abréviation de cela.

En regardant le trafic réseau, il semble en effet itératif. La récursivité est entièrement interne au récurseur DNS. Si vous regardez l'implémentation d'un récurseur DNS, vous trouverez une structure récursive dans la façon dont les requêtes sont traitées.

La récursivité peut être facile à repérer si l'implémentation utilise un thread par requête et que les recherches sont implémentées à l'aide d'appels de fonctions récursives. Mais les conceptions plus efficaces n'utilisent pas de thread par requête et la récursivité se trouve à la place dans les structures de données utilisées par le récurseur DNS.

La raison pour laquelle la récursivité est nécessaire est due à la façon dont les références entre les serveurs DNS faisant autorité sont implémentées. Ceci est mieux illustré par un exemple. Dans le diagramme, vous voyez le serveur DNS faisant autorité pour microsoft.compointer vers le serveur DNS faisant autorité pour example.microsoft.com. Cela se fait à l'aide d'un NSenregistrement qui pointe vers un nom d'hôte. Ainsi, par exemple, le serveur faisant autorité pour microsoft.compourrait dire au récurseur DNS qui ms.example.netfait autorité pour example.microsoft.com.

À ce stade, le récurseur DNS devrait résoudre ms.example.netavant de pouvoir procéder à la résolution de example.microsoft.com.

Pour résoudre un nom d'hôte, il doit d'abord résoudre un nom d'hôte différent. C'est la récursivité. Pour que cela ne conduise pas à une récursion infinie, DNS a des enregistrements de colle qui sont envoyés avec des NSenregistrements dans certains cas.


Il y a beaucoup d'erreurs là-dedans. L'utilisation du terme "récursivité" n'a rien à voir avec l'utilisation des "appels de fonction récursifs" - la réponse de Vatine est plus proche - la récursivité n'est qu'un nom (mal choisi) pour lorsqu'un client demande à un serveur une réponse complète et résolue . Le mécanisme utilisé par les soi-disant "serveurs récursifs" est en fait appelé itération . En outre, collez les enregistrements et non pour empêcher la "récursion infinie" - ils sont là pour éviter le problème "poulet et œuf" de la façon dont vous trouvez l'adresse des serveurs de noms si ces serveurs se trouvent dans l'espace du domaine délégué .
Alnitak

La résolution DNS @Alnitak est intrinsèquement récursive. Tout algorithme récursif peut être transformé en quelque chose d'itératif en transformant la pile d'exécution en une structure de données différente. Cette possibilité est déjà mentionnée dans ma réponse. Et le problème de dépendance cyclique que vous mentionnez n'est pas quelque chose de différent d'une récursion infinie. Les deux sont vraiment la même chose. Si vous deviez appliquer un algorithme récursif naïf sans remarquer que la tâche sous-jacente souffre d'une dépendance cyclique, le résultat sera une récursion infinie.
kasperd

@Alnitak Vous ne pouvez pas vous débarrasser de la pile de récursivité et effectuer la résolution DNS de manière itérative en ne suivant qu'un nombre constant de noms DNS à la fois. Vous pouvez représenter la pile de récursivité avec une structure de données d'apparence différente, mais elle reste intrinsèquement récursive. Il est possible de configurer un nom de domaine de manière à maintenir la profondeur de récursivité à un seul. Mais tous les noms de domaine ne sont pas configurés de cette façon.
kasperd

Je cite la RFC 1034 - "" Les deux approches générales pour traiter ce problème sont "récursives", dans lesquelles le premier serveur poursuit la requête pour le client sur un autre serveur, et "itératives", dans lesquelles le serveur renvoie le client à un autre serveur et permet au client de poursuivre la requête . "" Cela n'a rien à voir avec "piles" ou "structures de données".
Alnitak

@Alnitak Ce paragraphe fait référence à un type de récursion différent de ma réponse. La récursivité mentionnée dans ma réponse est (comme clairement indiqué dans ma réponse) interne à un serveur DNS spécifique. Si vous tentiez d'implémenter la récursivité DNS de manière entièrement itérative, cela ne fonctionnerait jamais. Dès que vous obtenez une réponse avec un enregistrement NS sans colle associée, vous devez rechercher l'adresse IP du nom d'hôte pointé par cet enregistrement NS avant de pouvoir continuer avec la résolution d'origine.
kasperd
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.