Вершина иерархии имён
Система доменных имён устроена как дерево. Внизу отдельные узлы, выше домены второго уровня, ещё выше зоны верхнего уровня вроде com или ru, а в самом основании находится корень, обозначаемый пустой меткой. Корневые серверы знают о корне и, что важнее, хранят адреса серверов зон верхнего уровня. На вопрос «где искать example.com» корень не отвечает, но подсказывает, кто обслуживает зону com.
Без этой подсказки резолверу было бы неоткуда начинать. Поэтому адреса корневых серверов заранее вшиты в программное обеспечение резолверов в виде списка, называемого корневыми подсказками (root hints).
Тринадцать имён, но не тринадцать машин
Корневых серверов принято называть тринадцать: их обозначают буквами от A до M, например a.root-servers.net. Число исторически связано с ограничением размера DNS-ответа по UDP, куда помещались адреса именно такого количества серверов. Но физических машин намного больше. Каждым из тринадцати идентификаторов управляет своя организация, а используется технология anycast: один и тот же IP-адрес анонсируется из множества точек мира, и запрос попадает в ближайшую по маршрутизации.
Поэтому правильнее говорить о тринадцати корневых адресах и многочисленных экземплярах за ними. Операторами выступают университеты, компании, научные и некоммерческие организации, а содержимое корневой зоны согласуется централизованно.
Что происходит при вашем запросе
Обычный человек с корневыми серверами почти не взаимодействует. Рекурсивный резолвер обращается к ним редко: ответ о серверах зоны com или ru живёт в кэше долго, поэтому чаще всего запрос сразу идёт к серверам нужной зоны верхнего уровня. Именно кэширование позволяет обслуживать миллиарды запросов, не перегружая корень. Общий порядок вы найдёте на странице rekursivnyy-dns-server.
Корневые серверы отвечают быстро и по существу: они отдают делегирование, то есть список NS-записей нужной зоны верхнего уровня и их адреса. Информации о конкретных сайтах у них нет.
Что будет, если корень недоступен
Из-за кэширования и множества экземпляров краткая недоступность части корневых серверов обычно остаётся незамеченной. Резолвер просто выбирает другой из списка. Серьёзно пострадала бы система лишь при длительном отказе всех корневых серверов, когда истёк бы срок жизни кэшированных записей. Такая ситуация крайне маловероятна именно благодаря распределённой архитектуре.
Для защиты корневой зоны используется DNSSEC: она подписана, и резолверы с проверкой подписей могут убедиться, что делегирование не подделано. Подробности вынесены на страницу dnssec.
Как заглянуть в корень самостоятельно
Команда dig . NS выведет список корневых серверов, а dig @a.root-servers.net ru. NS покажет делегирование зоны ru. Результат приходит не как окончательный ответ, а как перечень серверов зоны в секции authority или additional. Для трассировки всего пути пригодна опция +trace: dig +trace example.com покажет каждый шаг от корня до авторитетного сервера.
Это удобный способ понять, где в цепочке ломается разрешение имени: на уровне корня, зоны верхнего уровня или у сервера самого домена.
Корневая зона и её содержимое
Сама корневая зона невелика по меркам DNS. В ней нет записей о сайтах, только делегирования зон верхнего уровня: для каждой зоны перечислены её серверы имён и адреса, а также данные для проверки подписей. Файл корневой зоны публично доступен, его может скачать любой желающий и проверить содержимое. Изменения вносятся сравнительно редко и проходят согласование, после чего публикуются на все экземпляры серверов.
Специалистам интересна и практика использования локального зеркала корня: некоторые крупные резолверы держат копию корневой зоны у себя, чтобы не обращаться к корневым серверам по сети и быстрее получать делегирования. Для обычных пользователей это заметно лишь косвенно, но показывает, что корень служит справочником, а не узким местом. Если вы видите в ответах dig корневых серверов записи с большим TTL, вспомните, что именно длительное хранение делает нагрузку на корень умеренной.
Знание про корень пригодится и при диагностике: если недоступен только один домен, корень тут ни при чём. Его проверяют, лишь когда не разрешаются имена сразу во многих зонах, и то после того, как исключены проблемы вашей сети и резолвера.