Quem realmente "recursa" em uma pesquisa DNS recursiva?

16

Estou tentando entender a diferença entre pesquisas de DNS iterativas e recursivas. Fundamentalmente, penso na iterativa como ligar para uma loja de departamentos à procura de um produto e, quando eles não o possuem, fornecem o número de outra filial para ligar e, em seguida, você mesmo chama a outra filial. Versus recursiva, que é como chamar a loja de departamentos, e quando eles não têm o que você está depois, eles chamam o outro ramo em seu nome olhando para o produto. O problema é que estou tendo opiniões conflitantes sobre isso quando se trata de DNS. Quando penso em recursivo, penso em algo parecido com isto: texto alternativo

Mas, ao ler artigos na Web e até mesmo fazer uma pesquisa de imagens no Google por DNS recursivo , vejo muito mais exemplos assim: texto alternativo

Para mim, este segundo exemplo parece mais iterativo do que recursivo, porque cada um dos "outros servidores DNS" está dizendo ao "servidor DNS preferencial" o endereço da próxima máquina a ser pesquisada, em vez de procurá-lo em nome da preferência. Servidor dns. O único elemento recursivo que vejo é que o servidor DNS preferido faz pesquisas em nome do cliente DNS, mas daqui em diante, com certeza parece iterativo.

Portanto, acho que minha pergunta é: a pesquisa de DNS "recursiva" realmente significa apenas recursiva no sentido de o servidor DNS preferido fazer algo em nome do cliente, mas realmente iterativo daqui para frente? A maioria dos resultados que estou vendo na pesquisa de imagens do Google está me levando a acreditar nisso, que então levanta a questão: a primeira imagem deste post está totalmente errada?

Bryce Thomas
fonte
Confira o podcast Ask Mr DNS, divertido, informativo e eles gerenciam o DNS desde 1989, são autores ou co-autores de todos os livros DNS da O'Reily, etc. ask-mrdns.com Saiba mais do que você sempre quis saber.
Ronald Pottol 18/09/10

Respostas:

16

Seu último parágrafo está correto.

O sinalizador "Recursion Desired" (RD) enviado pelo cliente no cabeçalho da solicitação DNS (consulte RFC 1035) solicita ao servidor "por favor, me dê a resposta completa para esta pergunta".

Esse servidor solicita iterativamente a cadeia de servidores de nomes para a resposta correta. Essas consultas não devem ter o conjunto de bits RD definido.

Por fim, a resposta do servidor recursivo terá o sinalizador "Recursion Available" (RA) definido, indicando que a resposta foi realmente totalmente respondida. Por outro lado, um servidor autoritário não definirá o sinalizador RA.

IMHO, é uma má escolha de terminologia.

Pelo que vale, o primeiro diagrama que você encontrou é fundamentalmente incorreto. Os servidores raiz não executam consultas em nenhum outro servidor, apenas emitem referências para outros servidores.

Alnitak
fonte
4

Pelo que entendi, a "pesquisa recursiva" é exclusivamente da visão do consultante original. Portanto, se ele solicitar um servidor DNS e receber uma resposta completamente resolvida, será uma "consulta recursiva". Se esse servidor, por sua vez, faz pesquisas recursivas ou iterativas, isso não é algo com que o consultor original precisa se preocupar.

Vatine
fonte
1

O primeiro dos dois diagramas da sua pergunta está incorreto. Servidores raiz não enviam consultas para outros servidores. Se os servidores raiz de fato encaminharem consultas como mostradas nesse diagrama, o sistema DNS estará muito mais vulnerável a ataques de DoS do que realmente é.

O segundo diagrama está mais correto, mas simplificado demais para mostrar a natureza recursiva das pesquisas. O diagrama ainda é detalhado o suficiente para que possamos apontar onde a recursão acontece.

O servidor DNS ao lado do número 12indicado Preferred DNS serveré onde ocorre a recursão. O termo servidor DNS preferido não é uma terminologia padrão. Esse servidor geralmente seria chamado de recursor DNS em cache ou alguma abreviação disso.

Ao olhar para o tráfego de rede, ele realmente parece iterativo. A recursão é totalmente interna ao recursor de DNS. Se você observar a implementação de um recursor DNS, encontrará uma estrutura recursiva em como as solicitações são tratadas.

A recursão pode ser fácil de detectar se a implementação usa um encadeamento por solicitação e as pesquisas são implementadas usando chamadas de função recursivas. Porém, projetos mais eficientes não usam um encadeamento por solicitação e, em vez disso, a recursão é encontrada dentro das estruturas de dados usadas pelo recursor DNS.

A razão pela qual a recursão é necessária se deve à maneira como as referências entre os servidores DNS autoritativos são implementadas. Isso é melhor ilustrado com um exemplo. No diagrama, você vê o servidor DNS autoritativo para microsoft.comapontar para o servidor DNS autoritativo para example.microsoft.com. Isso é feito usando um NSregistro que aponta para um nome de host. Por exemplo, o servidor autoritativo para microsoft.compoderia informar ao recursor DNS ms.example.netautoritativo example.microsoft.com.

Nesse ponto, o recursor do DNS precisaria resolver ms.example.netantes de poder prosseguir com a resolução de example.microsoft.com.

Para resolver um nome de host, primeiro é necessário resolver um nome de host diferente. Isso é recursão. Para que isso não leve à recursão infinita, o DNS possui registros de cola que são enviados juntamente com os NSregistros em certos casos.

Kasperd
fonte
Existem muitos erros nisso. O uso do termo "recursão" não tem nada a ver com o uso de "chamadas de função recursivas" - a resposta do Vatine está mais próxima - recursão é apenas um nome (mal escolhido) para quando um cliente solicita ao servidor uma resposta completa e resolvida . O mecanismo usado pelos chamados "servidores recursivos" é na verdade chamado iteração . Além disso, cole registros e não impeça a "recursão infinita" - eles estão lá para evitar o problema do "ovo e galinha" de como você encontra o endereço dos servidores de nomes se esses servidores estiverem dentro do espaço do domínio delegado .
Alnitak
A resolução de DNS do @Alnitak é inerentemente recursiva. Qualquer algoritmo recursivo pode ser transformado em algo iterativo, transformando a pilha de execução em uma estrutura de dados diferente. Essa possibilidade já está mencionada na minha resposta. E o problema de dependência cíclica que você mencionou não é algo diferente de uma recursão infinita. Os dois são realmente a mesma coisa. Se você aplicasse um algoritmo recursivo ingênuo sem perceber que a tarefa subjacente sofre de uma dependência cíclica, o resultado será uma recursão infinita.
kasperd
@Alnitak Você não pode se livrar da pilha de recursão e executar a resolução de DNS iterativamente, controlando apenas um número constante de nomes de DNS por vez. Você pode representar a pilha de recursão com uma estrutura de dados com aparência diferente, mas ela permanece inerentemente recursiva. É possível configurar um nome de domínio de forma a manter a profundidade da recursão em apenas um. Mas nem todos os nomes de domínio são configurados dessa maneira.
kasperd
Cito a RFC 1034 - "" As duas abordagens gerais para lidar com esse problema são "recursivas", nas quais o primeiro servidor busca a consulta do cliente em outro servidor e "iterativo", na qual o servidor refere o cliente a outro. servidor e permite que o cliente persiga a consulta . "" Não tem nada a ver com "pilhas" ou "estruturas de dados".
Alnitak
@ Alnitak Esse parágrafo está se referindo a um tipo diferente de recursão que a minha resposta. A recursão mencionada na minha resposta é (como claramente indicado na minha resposta) interna a um servidor DNS específico. Se você realmente tentasse implementar a recursão do DNS de maneira totalmente iterativa, isso nunca funcionaria. Assim que você receber uma resposta com um registro NS sem cola associada, é necessário procurar o endereço IP do nome do host apontado por esse registro NS antes de continuar com a resolução original.
kasperd