Кто на самом деле «рекурсирует» в рекурсивном поиске DNS?

16

Я пытаюсь понять разницу между итеративным и рекурсивным поиском DNS. По сути, я думаю, что итеративный подход - это как звонить в универмаг в поисках продукта, и когда у них его нет, они дают вам номер другого из своих филиалов для вызова, а затем вы сами звоните в другой филиал. В отличие от рекурсивного, который похож на звонок в универмаг, и когда у них нет того, что вам нужно, они звонят в другой филиал от вашего имени в поисках продукта. Дело в том, что я получаю противоречивые мнения об этом, когда дело доходит до DNS. Когда я думаю о рекурсии, я думаю о чем-то, что выглядит так: альтернативный текст

Но, читая статьи в Интернете и даже делая поиск изображений Google для рекурсивного DNS , я вижу гораздо больше примеров, которые выглядят так: альтернативный текст

Для меня этот второй пример выглядит более итеративным, чем рекурсивным, потому что каждый из «других 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-сервер и получает полностью разрешенный ответ, то это «рекурсивный запрос». Если этот сервер, в свою очередь, выполняет рекурсивный или итеративный поиск, ну, это не то, о чем должен заботиться оригинальный запросчик.

Vatine
источник
1

Первая из двух диаграмм в вашем вопросе неверна. Корневые серверы не отправляют запросы на другие серверы. Если бы корневые серверы действительно передавали запросы, как показано на этой диаграмме, система DNS была бы намного более уязвимой для DoS-атак, чем на самом деле.

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

DNS-сервер рядом с номером, 12который обозначен, Preferred DNS serverявляется местом , где происходит рекурсия. Термин Предпочитаемый DNS-сервер не является стандартной терминологией. Этот сервер обычно называют кеширующим DNS-рекурсором или его сокращением.

Если смотреть на сетевой трафик, он действительно выглядит итеративным. Рекурсия полностью внутренняя для рекурсора DNS. Если вы посмотрите на реализацию рекурсора DNS, то обнаружите некоторую рекурсивную структуру в обработке запросов.

Рекурсию можно легко обнаружить, если реализация использует поток на запрос, а поиск реализован с использованием рекурсивных вызовов функций. Но более эффективные проекты не используют поток для запроса, а рекурсия вместо этого находится внутри структур данных, используемых рекурсором DNS.

Причина, по которой необходима рекурсия, заключается в том, как реализованы ссылки между авторитетными DNS-серверами. Это лучше всего иллюстрируется на примере. На схеме вы видите авторитетный DNS-сервер для microsoft.comуказания на полномочный DNS-сервер для example.microsoft.com. Это делается с помощью NSзаписи, которая указывает на имя хоста. Так, например, авторитетный сервер microsoft.comмог бы указать рекурсору DNS, для которого он ms.example.netявляется авторитетным example.microsoft.com.

На этом этапе рекурсору DNS придется разрешить, ms.example.netпрежде чем он сможет продолжить разрешение example.microsoft.com.

Чтобы разрешить одно имя хоста, сначала нужно разрешить другое имя хоста. Это рекурсия. Чтобы это не привело к бесконечной рекурсии, в DNS есть склеенные записи, которые NSв определенных случаях отправляются вместе с записями.

kasperd
источник
В этом много ошибок. Использование термина «рекурсия» не имеет никакого отношения к тому, используются ли «рекурсивные вызовы функций» - ответ Ватина ближе - рекурсия - это просто (плохо выбранное) имя для случая, когда клиент запрашивает у сервера полный решенный ответ . Механизм, используемый так называемыми «рекурсивными серверами», фактически называется итерацией . Кроме того, склеивайте записи, а не предотвращайте «бесконечную рекурсию» - они предназначены для того, чтобы предотвратить проблему «курицы и яйца» о том, как найти адрес серверов имен, если эти серверы находятся в пространстве делегированного домена .
Альнитак
Разрешение @Alnitak DNS по своей сути рекурсивно. Любой рекурсивный алгоритм можно превратить в нечто итеративное, превратив стек выполнения в другую структуру данных. Эта возможность уже упоминалась в моем ответе. И проблема циклической зависимости, которую вы упоминаете, ничем не отличается от бесконечной рекурсии. Два действительно одно и то же. Если вы примените простой рекурсивный алгоритм, не заметив, что основная задача страдает от циклической зависимости, результатом будет бесконечная рекурсия.
Касперд
@Alnitak Невозможно избавиться от стека рекурсии и выполнить разрешение DNS итеративно, отслеживая только постоянное количество имен DNS одновременно. Вы можете представить стек рекурсии с другой структурой данных, но она остается по своей природе рекурсивной. Можно настроить доменное имя таким образом, чтобы глубина рекурсии оставалась равной единице. Но не все доменные имена настроены таким образом.
kasperd
Я цитирую RFC 1034 - « Два основных подхода к решению этой проблемы - это« рекурсивный », в котором первый сервер выполняет запрос клиента на другом сервере, и« итеративный », в котором сервер передает клиента другому сервер и позволяет клиенту выполнять запрос . "" Это не имеет ничего общего с "стеками" или "структурами данных".
Альнитак
@Alnitak Этот абзац относится к другой рекурсии, чем мой ответ. Упомянутая в моем ответе рекурсия (как четко указано в моем ответе) является внутренней для одного конкретного DNS-сервера. Если вы действительно попытаетесь реализовать рекурсию DNS полностью итеративным способом, это никогда не сработает. Как только вы получите ответ с NS-записью без связанного клея, вы должны найти IP-адрес имени хоста, на который указывает эта NS-запись, прежде чем вы сможете продолжить с исходным разрешением.
Касперд