Хто насправді "рекурсує" в рекурсивному пошуку DNS?


16

Я намагаюся зрозуміти різницю між ітераційним та рекурсивним DNS-пошуками. По суті, я вважаю, що цей ітеративний спосіб є схожим на те, щоб зателефонувати в універмаг, шукаючи товар, і коли у них його немає, вони дають вам номер іншої однієї з їхніх філій, на яку потрібно зателефонувати, а потім ви самі телефонуєте до іншого відділення. На противагу рекурсивному, що схоже на дзвінок у універмаг, і коли у них немає того, що ви хочете, вони телефонують до іншого відділення від вашого імені, шукаючи товар. Справа в тому, що я отримую суперечливі погляди з цього приводу на DNS. Коли я думаю про рекурсивне, я думаю про щось таке: alt текст

Але читаючи статті в Інтернеті і навіть роблячи пошук зображень Google для рекурсивної DNS , я бачу набагато більше прикладів, які виглядають так: alt текст

Для мене цей другий приклад виглядає більш ітеративним, ніж рекурсивний, тому що кожен з "інших серверів DNS" повідомляє "бажаному серверу DNS" адресу наступної машини для пошуку, а не шукає його від імені бажаного DNS-сервер. Єдиний рекурсивний елемент, який я бачу, - це те, що бажаний сервер DNS виконує пошук від імені клієнта DNS, але з цього моменту він, звичайно, виглядає ітераційним.

Тож я думаю, що моє запитання полягає в тому, чи справді "рекурсивний" пошук DNS означає лише рекурсивний сенс, якщо вподобаний сервер DNS робить щось від імені клієнта, але дійсно ітеративний звідси далі? Більшість результатів, які я бачу в пошуку зображень Google , змушують мене повірити в це, що потім ставить питання, чи перше зображення в цій публікації просто невірно?


Ознайомтеся з подкастом Ask Mr DNS, розважальним, інформативним, і вони керують DNS, починаючи з 1989 року, автор чи співавтор кожної книги O'Reily DNS тощо. Ask-mrdns.com Дізнайтеся більше, ніж ви хотіли знати.
Рональд Поттол

Відповіді:


16

Ваш останній абзац правильний.

Прапор "Бажана рекурсія" (RD), надісланий клієнтом у заголовку запиту DNS (див. RFC 1035), просить сервер "будь ласка, дайте мені повну відповідь на це питання".

Цей сервер, ніж ітеративно, запитує ланцюжок серверів імен для правильної відповіді. Ці запити самі не повинні встановлювати біт RD.

Зрештою, на відповідь рекурсивного сервера буде встановлено прапор "Доступна рекурсія" (RA), що вказує на те, що відповідь дійсно була повністю відповідена. І навпаки, авторитетний сервер не встановить прапор RA.

ІМХО, це поганий вибір термінології.

Для чого варто, що перша діаграма, яку ви знайшли, є принципово неправильною. Кореневі сервери не виконують запитів до будь-якого іншого сервера, вони видають лише реферали до інших серверів.


4

Наскільки я розумію, "рекурсивний пошук" відбувається виключно з точки зору оригінального запиту. Отже, якщо він запитує сервер DNS і отримує повністю вирішену відповідь, то це "рекурсивний запит". Якщо цей сервер, у свою чергу, робить рекурсивні чи ітеративні пошуки, то це не те, про що має піклуватися оригінальний запит.


1

Перша з двох діаграм у вашому запитанні неправильна. Кореневі сервери не надсилають запити на інші сервери. Якби кореневі сервери насправді пересилали запити, як показано на цій діаграмі, система DNS була б набагато більш вразлива для DoS-атак, ніж це є насправді.

Друга діаграма здебільшого правильна, але занадто спрощена, щоб показати вам рекурсивний характер пошуку. Діаграма ще досить детальна, хоча ми можемо вказати, де відбувається рекурсія.

DNS-сервер поруч із номером, 12який позначається Preferred DNS server, де відбувається рекурсія. Термін " Кращий сервер DNS" не є стандартною термінологією. Цей сервер зазвичай називали б кешуючим рекурсором DNS або деяким абревіатурою цього.

Якщо дивитися на мережевий трафік, він дійсно виглядає ітераційним. Рекурсія є повністю внутрішньою для DNS-рекурсора. Якщо ви подивитесь на реалізацію рекурсора DNS, ви знайдете деяку рекурсивну структуру в обробці запитів.

Рекурсію може бути легко помітити, якщо реалізація використовує потік на запит, а пошуки здійснюються за допомогою рекурсивних викликів функцій. Але більш ефективні конструкції не використовують потік на запит, і натомість рекурсія знаходиться у структурах даних, використовуваних рекурсором DNS.

Причина необхідності рекурсії пов'язана з тим, як реалізуються посилання між авторитетними серверами DNS. Це найкраще проілюструвати на прикладі. На діаграмі ви бачите авторитетний DNS-сервер для microsoft.comвказівки на авторитетний DNS-сервер для example.microsoft.com. Це робиться за допомогою NSзапису, який вказує на ім’я хоста. Так, наприклад, авторитетний сервер for microsoft.comможе сказати рекурсору DNS, який ms.example.netє авторитетним example.microsoft.com.

У цей момент рекурсор DNS повинен був би вирішитись, ms.example.netперш ніж він зможе приступити до вирішення example.microsoft.com.

Для вирішення одного імені хоста спочатку слід вирішити інше ім’я хоста. Це рекурсія. Для того, щоб це не призвело до нескінченної рекурсії, DNS має клейові записи, які надсилаються разом із NSзаписами в певних випадках.


У цьому багато помилок. Використання терміна "рекурсія" не має нічого спільного з тим, чи використовуються "рекурсивні виклики функцій" - відповідь Ватіна ближче - рекурсія - це лише (погано вибране) ім'я, коли клієнт просить сервер про повну вирішену відповідь . Механізм, який використовують так звані "рекурсивні сервери", насправді називається ітерацією . Крім того, склейте записи і не запобігайте "нескінченній рекурсії" - вони є там, щоб запобігти проблемі "курка і яйце", як знайти адресу серверів імен, якщо ці сервери знаходяться в просторі делегованого домену .
Альнітак

@ Алнітак роздільна здатність DNS по суті є рекурсивною. Будь-який рекурсивний алгоритм можна перетворити на щось ітеративне, перетворивши стек виконання в іншу структуру даних. Така можливість вже згадується у моїй відповіді. І проблема циклічної залежності, яку ви згадуєте, не є чимось відмінним від нескінченної рекурсії. Два насправді одне і те ж. Якщо ви застосовували наївний рекурсивний алгоритм, не помічаючи, що основна задача страждає від циклічної залежності, результатом буде нескінченна рекурсія.
kasperd

@Alnitak Ви не можете позбутися стеку рекурсії та виконувати роздільну здатність DNS ітеративно, відстежуючи одночасно лише постійну кількість імен DNS. Ви можете представляти стек рекурсії з іншою структурою даних, але він залишається за своєю суттю рекурсивним. Можна налаштувати доменне ім’я таким чином, щоб зберегти глибину рекурсії до однієї. Але не всі доменні імена налаштовані саме так.
kasperd

Я цитую RFC 1034 - "" Два загальних підходу до вирішення цієї проблеми є "рекурсивними", в яких перший сервер здійснює запит для клієнта на іншому сервері, і "ітераційний", в якому сервер посилає клієнта на інший сервер і дозволяє клієнту виконувати запит . "" Це не має нічого спільного зі "стеками" або "структурами даних".
Альнітак

@Alnitak У цьому абзаці йдеться про інший тип рекурсії, ніж моя відповідь. Рекурсія, згадана у моїй відповіді, є (як чітко зазначено у моїй відповіді) внутрішньою для одного конкретного сервера DNS. Якби ви насправді намагалися реалізувати рекурсію DNS цілком ітеративно, це ніколи не вийшло. Як тільки ви отримаєте відповідь із записом NS без пов’язаного клею, вам слід шукати IP-адресу імені хоста, на яку вказує цей запис NS, перш ніж ви зможете продовжувати оригінальну роздільну здатність.
kasperd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.