¿Quién realmente "recurre" en una búsqueda recursiva de DNS?

16

Estoy tratando de entender la diferencia entre las búsquedas de DNS iterativas y recursivas. Básicamente, pienso que iterativo es como llamar a una tienda por departamentos en busca de un producto, y cuando no lo tienen, le dan el número de otra de sus sucursales para llamar y luego usted mismo llama a la otra sucursal. Versus recursivo, que es como decir que los grandes almacenes, y cuando ellos no tienen lo que está buscando, que llame a la otra rama en su nombre buscar el producto. La cuestión es que obtengo puntos de vista conflictivos sobre esto cuando se trata de DNS. Cuando pienso en recursivo, pienso en algo que se parece a esto: texto alternativo

Pero mientras leo artículos en la web, e incluso hago una búsqueda de imágenes de Google para DNS recursivo , veo muchos más ejemplos que se parecen a esto: texto alternativo

Para mí, este segundo ejemplo parece más iterativo que recursivo, porque cada uno de los "otros servidores DNS" le está diciendo al "servidor DNS preferido" la dirección de la próxima máquina para buscar, en lugar de buscarlo en nombre de los preferidos Servidor DNS. El único elemento recursivo que veo es que el servidor DNS preferido realiza búsquedas en nombre del cliente DNS, pero a partir de ahora, sin embargo, parece iterativo.

Así que supongo que mi pregunta es, ¿la búsqueda de DNS "recursiva" realmente solo significa recursiva en el sentido de que el servidor DNS preferido hace algo en nombre del cliente, pero es realmente iterativo de ahora en adelante? La mayoría de los resultados que veo en la búsqueda de imágenes de Google me llevan a creer esto, lo que luego plantea la pregunta, ¿es la primera imagen en esta publicación simplemente incorrecta?

Bryce Thomas
fuente
Echa un vistazo al podcast Ask Mr DNS, entretenido, informativo, y han estado administrando DNS desde 1989, fueron autores o coautores de todos los libros de DNS de O'Reily, etc. ask-mrdns.com Obtenga más información de la que siempre quiso saber.
Ronald Pottol

Respuestas:

16

Tu último párrafo es correcto.

El indicador "Recursion Desired" (RD) enviado por el cliente en el encabezado de solicitud DNS (consulte RFC 1035) le pregunta al servidor "por favor, deme la respuesta completa a esta pregunta".

Ese servidor de forma iterativa le pide a la cadena de servidores de nombres la respuesta correcta. Esas consultas no deberían tener el bit RD establecido.

En última instancia, la respuesta del servidor recursivo tendrá el indicador "Recursion Available" (RA) establecido, lo que indica que la respuesta fue realmente completa. Por el contrario, un servidor autorizado no establecerá el indicador RA.

En mi humilde opinión, es una mala elección de terminología.

Por lo que vale, ese primer diagrama que has encontrado es fundamentalmente incorrecto. Los servidores raíz no realizan consultas a ningún otro servidor, solo emiten referencias a otros servidores.

Alnitak
fuente
4

Según tengo entendido, la "búsqueda recursiva" es únicamente desde el punto de vista del interrogador original. Entonces, si le pregunta a un servidor DNS y obtiene una respuesta completamente resuelta, entonces es una "consulta recursiva". Si ese servidor, a su vez, realiza búsquedas recursivas o iterativas, bueno, no es algo que deba interesar al interrogador original.

Vatine
fuente
1

El primero de los dos diagramas en su pregunta es incorrecto. Los servidores raíz no envían consultas a otros servidores. Si los servidores raíz de hecho reenviaran consultas como se muestra en ese diagrama, el sistema DNS sería mucho más vulnerable a los ataques DoS de lo que realmente es.

El segundo diagrama es en su mayoría correcto pero demasiado simplificado para mostrarle la naturaleza recursiva de las búsquedas. Sin embargo, el diagrama aún es lo suficientemente detallado como para señalar dónde ocurre la recursividad.

El servidor DNS al lado del número 12indicado Preferred DNS serveres donde ocurre la recursividad. El término servidor DNS preferido no es la terminología estándar. Ese servidor generalmente se llamaría un recursor DNS de almacenamiento en caché o alguna abreviatura de eso.

Al mirar el tráfico de la red, de hecho parece iterativo. La recursividad es completamente interna para el recursor DNS. Si observa la implementación de un recursor DNS, encontrará una estructura recursiva en la forma en que se manejan las solicitudes.

La recursión puede ser fácil de detectar si la implementación usa un hilo por solicitud y las búsquedas se implementan mediante llamadas a funciones recursivas. Pero los diseños más eficientes no usan un hilo por solicitud y la recursión se encuentra dentro de las estructuras de datos utilizadas por el recurrente DNS.

La razón por la que se necesita la recursión se debe a cómo se implementan las referencias entre los servidores DNS autorizados. Esto se ilustra mejor con un ejemplo. En el diagrama, verá el servidor DNS autorizado para microsoft.comseñalar el servidor DNS autorizado example.microsoft.com. Esto se realiza mediante un NSregistro que apunta a un nombre de host. Entonces, por ejemplo, el servidor autorizado para microsoft.compodría decirle al recurrente DNS que ms.example.netes autorizado para example.microsoft.com.

En ese punto, el recurrente DNS tendría que resolver ms.example.netantes de poder proceder con la resolución de example.microsoft.com.

Para resolver un nombre de host, primero tiene que resolver un nombre de host diferente. Eso es recursividad. Para que esto no conduzca a una recursión infinita, DNS tiene registros de pegamento que se envían junto con los NSregistros en ciertos casos.

kasperd
fuente
Hay muchos errores en esto. El uso del término "recursión" no tiene nada que ver con si se usan "llamadas de función recursivas" - la respuesta de Vatine está más cerca - la recursión es solo un nombre (mal elegido) para cuando un cliente le pide al servidor una respuesta resuelta completa . El mecanismo utilizado por los llamados "servidores recursivos" en realidad se llama iteración . Además, pegue los registros y no para evitar la "recursión infinita": están allí para evitar el problema del "huevo y la gallina" de cómo encontrar la dirección de los servidores de nombres si esos servidores están dentro del espacio del dominio delegado .
Alnitak
La resolución de @Alnitak DNS es inherentemente recursiva. Cualquier algoritmo recursivo puede convertirse en algo iterativo al convertir la pila de ejecución en una estructura de datos diferente. Esa posibilidad ya se menciona en mi respuesta. Y el problema de dependencia cíclica que mencionas no es algo diferente de una recursión infinita. Los dos son realmente lo mismo. Si aplicara un algoritmo recursivo ingenuo sin darse cuenta de que la tarea subyacente sufre de una dependencia cíclica, el resultado será una recursión infinita.
Kasperd
@Alnitak No puede deshacerse de la pila de recursión y realizar la resolución de DNS de forma iterativa manteniendo un seguimiento de solo un número constante de nombres de DNS a la vez. Puede representar la pila de recursión con una estructura de datos de aspecto diferente, pero sigue siendo inherentemente recursiva. Es posible configurar un nombre de dominio de una manera que mantenga la profundidad de recursión en solo uno. Pero no todos los nombres de dominio están configurados de esa manera.
Kasperd
Cito RFC 1034 - "" Los dos enfoques generales para tratar este problema son "recursivos", en los que el primer servidor persigue la consulta del cliente en otro servidor, y "iterativo", en el que el servidor refiere al cliente a otro servidor y deja que el cliente continúe con la consulta . "" No tiene nada que ver con "pilas" o "estructuras de datos".
Alnitak
@Alnitak Ese párrafo se refiere a un tipo diferente de recursión que mi respuesta. La recursividad mencionada en mi respuesta es (como se indica claramente en mi respuesta) interna a un servidor DNS específico. Si realmente intentara implementar la recursividad DNS de una manera completamente iterativa, nunca funcionaría. Tan pronto como reciba una respuesta con un registro NS sin pegamento asociado, debe buscar la dirección IP del nombre de host señalado por ese registro NS antes de poder continuar con la resolución original.
Kasperd