Резолвинг DNS и типы записей
Разбираем, как именно имя превращается в адрес: рекурсивный резолвер, кэш и основные типы записей.
Резолвинг — процесс получения IP-адреса по имени. За кулисами одного «открытия сайта» может пройти несколько DNS-запросов по иерархии.
Рекурсивный и итеративный запросы
В резолвинге участвуют два типа поведения:
- Рекурсивный резолвер (обычно у провайдера или публичный, как 8.8.8.8) берёт всю работу на себя: вы спрашиваете один раз — он сам обходит иерархию и возвращает готовый ответ.
- Итеративные запросы — это то, как резолвер общается с серверами иерархии: он спрашивает корневой сервер, тот отвечает «иди к серверу .com», резолвер идёт туда, получает «иди к серверу example.com» и так до ответа.
Ваш браузер
| (рекурсивно: "дай мне IP www.example.com")
v
Рекурсивный резолвер
|-- итеративно --> Корневой сервер: "спроси .com вот тут"
|-- итеративно --> Сервер .com: "спроси example.com вот тут"
|-- итеративно --> Сервер example.com: "A-запись = 93.184.216.34"
v
Возвращает браузеру 93.184.216.34
Кэширование и TTL
Обходить всю иерархию каждый раз было бы медленно. Поэтому ответы кэшируются на каждом уровне: в браузере, в ОС, в резолвере. У каждой записи есть TTL (Time To Live) — на сколько секунд её можно хранить в кэше. Пока TTL не истёк, повторный запрос отвечается мгновенно из кэша.
Отсюда эффект «домен ещё не прогрелся»: вы поменяли запись, но старое значение живёт в кэшах до истечения TTL. Поэтому перед переездом TTL заранее уменьшают.
Типы записей
| Тип | Что хранит | Пример |
| A | IPv4-адрес имени | example.com → 93.184.216.34 |
| AAAA | IPv6-адрес имени | example.com → 2606:2800:220:1:: |
| CNAME | псевдоним (ссылка на другое имя) | www → example.com |
| MX | почтовый сервер домена | example.com → mail.example.com |
| TXT | произвольный текст (проверки, SPF) | верификация домена |
| NS | авторитетные серверы имён зоны | ns1.example.com |
Моделируем резолвинг CNAME
Запись CNAME — это псевдоним: она указывает не на IP, а на другое имя, которое надо разрешать дальше. Смоделируем эту цепочку на Python:
records = {
'www.example.com': ('CNAME', 'example.com'),
'example.com': ('A', '93.184.216.34'),
}
def resolve(name, depth=0):
indent = ' ' * depth
rtype, value = records.get(name, (None, None))
if rtype is None:
print(f'{indent}{name}: запись не найдена')
return None
print(f'{indent}{name} [{rtype}] -> {value}')
if rtype == 'CNAME':
return resolve(value, depth + 1)
return value
ip = resolve('www.example.com')
print('Итоговый IP:', ip)
Вывод:
www.example.com [CNAME] -> example.com example.com [A] -> 93.184.216.34 Итоговый IP: 93.184.216.34
Видно, как www.example.com сначала разрешается в имя example.com (CNAME), а уже оно — в IP (A-запись). Реальный резолвер делает ровно это, только по сети.
Итог
- Рекурсивный резолвер делает всю работу; итеративно опрашивает иерархию серверов.
- Ответы кэшируются с учётом TTL — отсюда задержки при смене записей.
- Основные записи: A (IPv4), AAAA (IPv6), CNAME (псевдоним), MX (почта).
- CNAME требует доразрешения: ведёт на имя, а не на адрес.