Kto faktycznie „rekursuje” w rekurencyjnym wyszukiwaniu DNS?

16

Próbuję zrozumieć różnicę między iteracyjnymi i rekurencyjnymi zapytaniami DNS. Zasadniczo myślę, że iteracyjne jest jak zadzwonienie do domu towarowego w celu znalezienia produktu, a gdy go nie mają, podają numer innego z oddziałów, pod który można zadzwonić, a następnie sam dzwonisz do drugiego. Versus rekursywnego, który jest jak wywołanie dom towarowy, a gdy nie mają co jesteś po, oni nazywają inny oddział w Twoim imieniu szuka produktu. Rzecz w tym, że dostaję sprzeczne opinie na ten temat, jeśli chodzi o DNS. Kiedy myślę o rekurencyjnym, myślę o czymś, co wygląda tak: alternatywny tekst

Ale podczas czytania artykułów w Internecie, a nawet wyszukiwania rekurencyjnego obrazu DNS w Google , widzę znacznie więcej przykładów, które wyglądają tak: alternatywny tekst

Dla mnie ten drugi przykład wygląda bardziej iteracyjnie niż rekurencyjnie, ponieważ każdy z „innych serwerów DNS” podaje „preferowanemu serwerowi DNS” adres następnej maszyny do wyszukania, zamiast wyszukiwania w imieniu preferowanego Serwer DNS. Jedyny rekurencyjny element, jaki widzę, to to, że preferowany serwer DNS wyszukuje w imieniu klienta DNS, ale od tej pory z pewnością wygląda to iteracyjnie.

Wydaje mi się, że moje pytanie brzmi: czy „rekurencyjne” wyszukiwanie DNS naprawdę oznacza tylko rekurencyjne w tym sensie, że preferowany serwer DNS robi coś w imieniu klienta, ale naprawdę jest iteracyjny? Większość wyników, które widzę w wyszukiwarce grafiki Google, prowadzi mnie do przekonania, że ​​to nasuwa pytanie: czy pierwsze zdjęcie w tym poście jest po prostu błędne?

Bryce Thomas
źródło
Zapoznaj się z podcastem Ask Mr DNS, zapewniającym rozrywkę, dostarczającym informacji, a oni zarządzają DNS od 1989 roku, są autorami lub współautorami każdej książki O'Reily DNS itp. Ask-mrdns.com Dowiedz się więcej, niż kiedykolwiek chciałeś wiedzieć.
Ronald Pottol,

Odpowiedzi:

16

Twój ostatni akapit jest poprawny.

Flaga „Recursion Desired” (RD) wysłana przez klienta w nagłówku żądania DNS (patrz RFC 1035) pyta serwer „proszę o pełną odpowiedź na to pytanie”.

Ten serwer niż iteracyjnie prosi łańcuch serwerów nazw o poprawną odpowiedź. Te zapytania nie powinny same mieć ustawionego bitu RD.

Ostatecznie odpowiedź serwera rekurencyjnego będzie miała ustawioną flagę „Recursion Available” (RA), co oznacza, że ​​odpowiedź została rzeczywiście w pełni udzielona. I odwrotnie, autorytatywny serwer nie ustawi flagi RA.

IMHO, to zły wybór terminologii.

Co warte jest tego, że pierwszy znaleziony schemat jest zasadniczo niepoprawny. Serwery root nie wykonują zapytań do żadnego innego serwera, wysyłają tylko odwołania do innych serwerów.

Alnitak
źródło
4

O ile rozumiem, „wyszukiwanie rekurencyjne” wynika wyłącznie z pierwotnego zapytania. Jeśli więc zapyta serwer DNS i otrzyma całkowicie rozstrzygniętą odpowiedź, jest to „zapytanie rekurencyjne”. Jeśli ten serwer z kolei wyszukuje rekurencyjnie lub iteracyjnie, to nie jest czymś, o co musi dbać pierwotne pytanie.

Vatine
źródło
1

Pierwszy z dwóch diagramów w twoim pytaniu jest niepoprawny. Serwery główne nie wysyłają zapytań do innych serwerów. Gdyby serwery root faktycznie przekazywały zapytania, jak pokazano na tym schemacie, system DNS byłby o wiele bardziej podatny na ataki DoS, niż jest w rzeczywistości.

Drugi schemat jest w większości poprawny, ale zbyt uproszczony, aby pokazać rekurencyjną naturę wyszukiwań. Schemat jest jednak nadal wystarczająco szczegółowy, abyśmy mogli wskazać, gdzie następuje rekurencja.

Serwer DNS obok liczby, 12którą wskazano, Preferred DNS serverjest miejscem, w którym ma miejsce rekurencja. Termin Preferowany serwer DNS nie jest standardową terminologią. Ten serwer byłby zwykle nazywany buforującym rekursorem DNS lub jego skrótem.

Patrząc na ruch sieciowy, rzeczywiście wygląda iteracyjnie. Rekursja jest całkowicie wewnętrzna dla rekursora DNS. Jeśli spojrzysz na implementację rekursora DNS, znajdziesz pewną rekurencyjną strukturę w sposobie obsługi żądań.

Rekurencja może być łatwa do wykrycia, jeśli implementacja używa wątku na żądanie, a wyszukiwania są implementowane przy użyciu rekurencyjnych wywołań funkcji. Jednak bardziej wydajne projekty nie używają wątku na żądanie, a rekurencja jest zamiast tego znajdowana w strukturach danych używanych przez rekursor DNS.

Powodem, dla którego potrzebna jest rekurencja, jest sposób, w jaki implementowane są odwołania między autorytatywnymi serwerami DNS. Najlepiej ilustruje to przykład. Na schemacie widać autorytatywny serwer DNS dla microsoft.comwskazania na autorytatywny serwer DNS dla example.microsoft.com. Odbywa się to za pomocą NSrekordu, który wskazuje nazwę hosta. Na przykład serwer autorytatywny microsoft.commoże powiedzieć, że rekursor DNS ms.example.netjest autorytatywny example.microsoft.com.

W tym momencie rekursor DNS musiałby rozwiązać, ms.example.netzanim będzie mógł kontynuować rozwiązywanie problemu example.microsoft.com.

Aby rozwiązać jedną nazwę hosta, najpierw musi ona rozwiązać inną nazwę hosta. To jest rekurencja. Aby nie doprowadziło to do nieskończonej rekurencji, DNS ma rekordy kleju, które są wysyłane wraz z NSrekordami w niektórych przypadkach.

kasperd
źródło
Jest w tym wiele błędów. Użycie terminu „rekurencja” nie ma nic wspólnego z tym, czy używane są „rekurencyjne wywołania funkcji” - odpowiedź Vatine jest bliższa - rekursja to tylko (źle wybrana) nazwa, gdy klient prosi serwer o pełną rozstrzygniętą odpowiedź . Mechanizm wykorzystywany przez tak zwane „serwery rekurencyjne” nazywa się w rzeczywistości iteracją . Ponadto przyklejaj rekordy i nie zapobiegaj „nieskończonej rekurencji” - służą one temu, aby zapobiec problemowi z „kurczakiem i jajkiem” dotyczącym sposobu znalezienia adresu serwerów nazw, jeśli te serwery znajdują się w przestrzeni domeny delegowanej .
Alnitak,
@Alnitak Rozdzielczość DNS jest z natury rekurencyjna. Dowolny algorytm rekurencyjny można przekształcić w coś iteracyjnego, zmieniając stos wykonawczy w inną strukturę danych. Ta możliwość jest już wspomniana w mojej odpowiedzi. A cykliczny problem zależności, o którym wspominasz, nie różni się od nieskończonej rekurencji. Te dwie rzeczy są naprawdę takie same. Jeśli zastosujesz naiwny algorytm rekurencyjny, nie zauważając, że zadanie leżące u jego podstaw cierpi z powodu cyklicznej zależności, wynikiem będzie rekurencja nieskończona.
kasperd
@Alnitak Nie można pozbyć się stosu rekurencyjnego i wykonać iteracyjne rozpoznawanie DNS, śledząc tylko stałą liczbę nazw DNS jednocześnie. Możesz reprezentować stos rekurencyjny z inną strukturą danych, ale z natury pozostaje rekurencyjny. Możliwe jest skonfigurowanie nazwy domeny w taki sposób, aby zachować głębokość rekurencji tylko do jednej. Ale nie wszystkie nazwy domen są skonfigurowane w ten sposób.
kasperd
Cytuję RFC 1034 - „” Dwa ogólne podejścia do rozwiązania tego problemu to „rekurencyjny”, w którym pierwszy serwer wykonuje zapytanie dla klienta na innym serwerze, i „iteracyjny”, w którym serwer odwołuje klienta do innego serwer i pozwala klientowi wykonać zapytanie . ”„ Nie ma to nic wspólnego z „stosami” lub „strukturami danych”.
Alnitak,
@Alnitak Ten akapit odnosi się do innego rodzaju rekurencji niż moja odpowiedź. Rekurencja wspomniana w mojej odpowiedzi jest (jak wyraźnie stwierdzono w mojej odpowiedzi) wewnętrznie na jednym konkretnym serwerze DNS. Jeśli rzeczywiście próbowałbyś zaimplementować rekurencję DNS w sposób całkowicie iteracyjny, to nigdy nie zadziałałoby. Gdy tylko otrzymasz odpowiedź z rekordem NS bez powiązanego kleju, musisz wyszukać adres IP nazwy hosta wskazanej przez ten rekord NS, aby móc kontynuować oryginalną rozdzielczość.
kasperd