Я пытаюсь понять разницу между итеративным и рекурсивным поиском в DNS. По сути, я думаю, что итеративность - это как звонок в универмаг в поисках продукта, и когда у них его нет, они дают вам номер другого из своих филиалов, чтобы позвонить, а затем вы сами звоните в другое отделение. По сравнению с рекурсивным, что похоже на звонок в универмаг, и когда у них нет того, что вам нужно, Oни позвоните в другое отделение от вашего имени в поисках продукта. Дело в том, что я получаю противоречивые мнения по этому поводу, когда дело касается DNS. Когда я думаю о рекурсии, я думаю о чем-то похожем на это:
Но при чтении статей в Интернете и даже при поиске изображений в Google для Рекурсивный DNS, Я вижу гораздо больше примеров, которые выглядят так:
Для меня этот второй пример выглядит более итеративным, чем рекурсивным, потому что каждый из «других DNS-серверов» сообщает «предпочтительному DNS-серверу» адрес следующей машины для поиска, а не ищет его от имени предпочтительного DNS-сервер. Единственный рекурсивный элемент, который я вижу, - это то, что предпочтительный DNS-сервер выполняет поиск от имени DNS-клиента, но с этого момента он определенно выглядит итеративным.
Итак, я предполагаю, что мой вопрос в том, действительно ли «рекурсивный» поиск в DNS означает рекурсивный в том смысле, что предпочтительный DNS-сервер делает что-то от имени клиента, но действительно итеративно с этого момента? Большинство результатов, которые я вижу в Поиск картинок Google заставляют меня поверить в это, и тогда возникает вопрос, является ли первое изображение в этом посте просто неправильным?
Ваш последний абзац правильный.
Флаг «Требуется рекурсия» (RD), отправляемый клиентом в заголовке запроса DNS (см. RFC 1035), просит сервер «пожалуйста, дайте мне полный ответ на этот вопрос».
Этот сервер, чем итеративно запрашивает правильный ответ у цепочки серверов имен. Эти запросы сами по себе не должны иметь установленный бит RD.
В конечном итоге для ответа рекурсивного сервера будет установлен флаг «Доступна рекурсия» (RA), указывающий, что ответ действительно был полностью получен. И наоборот авторитетный сервер не будет устанавливать флаг RA.
ИМХО, это плохой выбор терминологии.
Как бы то ни было, первая найденная вами диаграмма в корне неверна. Корневые серверы делают не выполнять запросы к любому другому серверу, они выдают только ссылки на другие серверы.
Насколько я понимаю, «рекурсивный поиск» осуществляется исключительно с точки зрения исходного запросчика. Итак, если он запрашивает DNS-сервер и получает обратно полностью разрешенный ответ, то это «рекурсивный запрос». Если этот сервер, в свою очередь, выполняет рекурсивный или итеративный поиск, то это не то, о чем исходный запросчик должен заботиться.
Первая из двух диаграмм в вашем вопросе неверна. Корневые серверы не отправляют запросы другим серверам. Если бы корневые серверы действительно пересылали запросы, как показано на этой диаграмме, система 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
записи в определенных случаях.