Ответ
Да, DNS преимущественно использует UDP (порт 53). В своей работе при настройке инфраструктуры и диагностике сетевых проблем я постоянно сталкиваюсь с этим.
Почему UDP — основной выбор для DNS:
- Низкие накладные расходы: Запрос и ответ обычно умещаются в один пакет (ограничение 512 байт для UDP). Установка TCP-соединения (three-way handshake) добавила бы значительную задержку для простых запросов.
- Быстрота и эффективность: Серверы могут обрабатывать тысячи простых запросов в секунду без необходимости поддерживать состояние соединения.
Когда DNS переключается на TCP (порт 53):
- Ответ превышает 512 байт: Если в ответе слишком много записей (например, большая зона при AXFR-трансфере) или включены расширения вроде DNSSEC, в ответе выставляется флаг
TC(Truncated). Клиент должен повторить запрос, используя TCP. - Трансфер зоны (Zone Transfer): Механизм AXFR/IXFR для репликации данных между primary и secondary DNS-серверами всегда использует TCP из-за объёма передаваемых данных и требований к надёжности.
Практическая проверка с помощью dig:
# Стандартный запрос по UDP (по умолчанию)
dig @8.8.8.8 example.com A
# Принудительный запрос по TCP (полезно для диагностики проблем с большими ответами или файрволами)
dig @8.8.8.8 example.com A +tcp
# Запрос с отключением флага truncation, чтобы увидеть полный UDP-ответ, если он влазит в буфер
dig @8.8.8.8 example.com A +ignore
Для DevOps это важно понимать при:
- Настройке сетевых ACL и правил файрвола (нужно разрешать и UDP, и TCP на порт 53 для исходящих и входящих запросов).
- Диагностике проблем с разрешением имён в контейнерах или облачных сетях.
- Настройке собственных кэширующих DNS-резолверов (например,
dnsmasq,CoreDNS).