Резолвинг 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 заранее уменьшают.

Типы записей

ТипЧто хранитПример
AIPv4-адрес имениexample.com → 93.184.216.34
AAAAIPv6-адрес имени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 требует доразрешения: ведёт на имя, а не на адрес.
Проверьте себя
1. Чем рекурсивный резолвер отличается от итеративных запросов?
AЭто одно и то же
BРекурсивный резолвер сам обходит всю иерархию и возвращает готовый ответ; итеративно он шаг за шагом опрашивает серверы иерархии
CРекурсивный работает только в локальной сети
DИтеративный быстрее всегда
2. Что определяет TTL у DNS-записи?
AРазмер записи
BСколько секунд запись можно хранить в кэше до повторного запроса
CПриоритет записи
DВерсию протокола
3. Какая запись хранит IPv4-адрес для имени?
AA
BAAAA
CCNAME
DMX
4. На что указывает запись CNAME?
AНа IP-адрес напрямую
BНа другое доменное имя, которое нужно разрешать дальше
CНа почтовый сервер
DНа номер порта
Поддержать проект