Найти тему
Цифровой чай

DNS. Что такое и с чем едят

Часть 1. Общие сведения.

DNS (англ. Domain Name System, Система доменных имён) — это сетевой протокол, обеспечивающий невидимый механизм, который помогает нам использовать "человеческие", легко запоминающиеся имена для доступа к веб-сайтам и другим сервисам в Интернете вместо того, чтобы запоминать сложные числовые адреса.

В чём суть?

В своё время мы рассматривали, что такое IP-адрес, и как вообще работает Интернет. Так вот, в силу того, что компьютеры в сети общаются друг с другом по IP-адресам, то не будь протокола DNS, нам бы пришлось в браузере вместо, например, "google.ru" набирать "142.250.74.131" (IP-адрес сервера Google). Не очень удобно, правда? А если завтра IP-адрес сервера изменится (это, в принципе, нормальное явление), то будет ещё менее удобно.

На практике, когда мы в браузере вводим имя сайта, наш компьютер сам обращается к специальному
DNS-серверу, чтобы узнать, какой IP-адрес соответствует этому имени сайта (его ещё называют доменное имя). "Эй, DNS! Скажи, какой IP-адрес у сайта yandex.ru?" DNS-сервер выдаёт нужный IP-адрес (говорят, что он разрешает доменное имя), и дальше наш компьютер всё так же незаметно для нас обращается к нужному веб-серверу по полученному адресу.

DNS можно сравнить с телефонным справочником, в котором имена людей соотносятся с их номерами телефонов. Только в данном случае имена сайтов соотносятся с IP-адресами нужных серверов, и работает такой "справочник" автоматически и незаметно для нас.

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

Откуда мой компьютер знает, как найти сам DNS-сервер?

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

Лайфхак: но если вдруг с вашим DNS-сервером возникла проблема, можете воспользоваться одним из публичных DNS-серверов, указав в настройках соответствующий адрес. Например, популярным публичным DNS является сервер Google с козырным адресом 8.8.8.8. Возможно, не слишком безопасно, но порой лучше, чем ничего.

Подводя итог, можно сказать, что протокол DNS — это солдат невидимого фронта. Он незаметно работает "под капотом" Интернета, а большинство людей и не догадываются о его существовании. Но если предположить, что однажды он откажет, то работа большей части сервисов в Интернете, говоря без обиняков, накроется медным эмалированным изделием.

Часть 2. Доменное имя

В первой части мы рассмотрели общие моменты, связанные с протоколом DNS. И для понимания, что он из себя представляет и для чего нужен — этого вполне достаточно. А теперь у нас задачка со звёздочкой 😉

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

Домен имён

Доменное имя состоит из нескольких частей, разделённых точкой (например, www.yandex.ru). Вы это прекрасно знаете из практики, даже если не акцентировали на этом внимания и вообще не знали, что это доменное имя. И это не просто так.
Дело в том, что все доменные имена объединены в группы. Каждая такая группа называется
домен имён (или доменная зона). Она включает в себя все имена, имеющие одинаковое окончание. Причем, система доменов имеет иерархическую структуру. Например, имена "yandex.ru" и "mail.ru" входят в домен "ru". А имена "www.yandex.ru" и "music.yandex.ru" входят, в свою очередь, в домен "yandex.ru". Чуете иерархию? Добавляя слева от существующего имени новую часть, отделённую точкой, мы создаём домен нового уровня. Да, домены принято разделять на уровни, которые нумеруются справа налево.

В нашем примере с www.yandex.ru:
www - домен 3 уровня
yandex - домен 2 уровня
ru - домен 1 уровня
Причём, в "соседнем" домене mail.ru может быть свой домен 3 уровня с именем "www" — www.mail.ru. Но полное имя всегда уникально.

Верхним считается домен с меньшим уровнем. Существует также домен нулевого уровня, или корневой домен. Это домен, в который входят все домены 1 уровня (.ru, .com, .net и т.п.).

Это интересно: по стандарту DNS любое доменное имя заканчивается точкой (www.yandex.ru.) Эта точка в конце — и есть домен 0 уровня. Но корневой домен — он на то и корневой, что единственный и общий для всех. Поэтому на практике точка в конце имени не используется (хотя обязательно используется при настройке DNS-серверов).

Часть 3. Иерархия DNS-серверов

Мой DNS-сервер знает все доменные имена в Интернете?
Нет, все он не знает. Это была бы слишком большая база данных. К тому же, имена и адреса различных ресурсов в Интернете могут меняться и добавляться новые. Для эффективной работы со всем этим обилием информации требуется распределённая система: в Интернете существует множество DNS-серверов, которые при необходимости обмениваются информацией друг с другом.

За каждый
домен имён отвечает свой DNS-сервер (на сленге — сервер держит доменную зону). Это значит, что на этом сервере прописаны все имена доменов на уровень ниже (т.е. более длинные имена) и соответствующие им IP-адреса. Также на этом сервере прописаны адреса DNS-серверов, которые отвечают, в свою очередь, за эти домены нижнего уровня. Благодаря этому выстраивается структура, когда каждый DNS-сервер знает IP-адреса для всех "своих" имён, а для "чужих" — знает, куда перенаправить запрос. Корневую зону обслуживают т.н. корневые DNS-серверы. Для надёжности их 13 штук (плюс более 100 копий по всему миру), и их адреса по стандарту протокола DNS известны каждому DNS-серверу. Таким образом, даже если наш DNS-сервер не знает какого-то имени сам, он всегда может "добраться" до того сервера, который это имя знает, опрашивая по цепочке другие DNS-сервера, начав в корневых.

Для наглядности разберём пример.

Предположим, DNS-сервер получил запрос на разрешение имени www.vasya.pupkin.ru. Это имя ему неизвестно, и наш сервер поступает следующим образом:

1️⃣ Справшивает у
Корневого сервера: знаешь, где это имя?
Получает ответ: не знаю, но Сервер 1 (IP-адрес такой-то), отвечает за домен "ru".
2️⃣ Справшивает у
Сервера 1: знаешь, где это имя?
Получает ответ: не знаю, но Сервер 2, отвечает за домен "pupkin".
3️⃣ Справшивает у
Сервера 2: знаешь, где это имя?
Получает ответ: не знаю, но Сервер 3, отвечает за домен "vasya".
4️⃣ Справшивает у
Сервера 3: знаешь, где это имя?
Получает ответ: знаю, вот его IP-адрес.

На практике после получения адреса для искомого имени наш DNS-сервер будет хранить эту информацию у себя определённое время. И если кто-то вновь спросит его об этом имени, он не будет заново раскручивать всю цепочку, начиная с корня, а сразу даст ответ. Это называется
кэширование, и благодаря ему снижается нагрузка на DNS-серверы и соединяющие их сети.

Но навсегда кэшированную информацию сервер у себя не сохраняет, как можно было бы подумать. Во-первых, это лишняя нагрузка на его ресурсы, а во-вторых, через некоторое время сохранённая пара "имя-адрес" может стать неактуальной (адрес изменится, или имя удалят), и узнать об этом можно будет, только пройдя всю цепочку запросов заново. А пока адрес
закэширован, наш сервер новых запросов по этому имени делать не будет. И для сохранения актуальности данных, периодически сервер "забывает" накопленную информацию о "чужих" именах (имён своего домена это не касается).

Мой домен — мои имена

Вся система DNS-серверов имеет распределённую структуру. Т.е. нет какого-то одного центра, управляющего всеми серверами. Наоборот, когда вы хотите создать свой домен, вы регистрируете новое имя в домене верхнего уровня (за денюжку, как правило) и создаёте свой DNS-сервер, который и будет обслуживать этот новый домен (или покупаете эту услугу в специальном сервисе, но суть не меняется, этот сервис создаёт новый DNS-сервер у себя).
Таким образом достигается гибкость в управлении системой доменных имён — каждый участник системы волен создавать или изменять имена (и соответствующие им IP-адреса) внутри своего домена, независимо от других. Но при этом существует механизм, с помощью которого любой участник может получить актуальную информацию об именах из любого другого домена.
Это позволяет не использовать какую-то централизованную базу данных для доменных имён (она была бы слишком большой, неповоротливой и
уязвимой).

Друзья, надеюсь, каждый из читателей смог получить о системе доменных имён информацию той глубины, какая ему комфортна.

============
Мы в Telegram -
здесь. «Цифровой чай». Про IT доступно.