Почему DNS иногда переключается на TCP?

«Почему DNS иногда переключается на TCP?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

DNS использует UDP по умолчанию (порт 53) для скорости и низких накладных расходов. Однако в ряде случаев протокол автоматически переключается на TCP (порт 53). Основные причины:

  1. Размер ответа превышает 512 байт. Это историческое ограничение DNS-over-UDP. Если ответ не помещается, сервер устанавливает в заголовке пакета флаг TC (Truncated) и отсылает урезанную версию. Клиент, увидев этот флаг, обязан повторить запрос по TCP, где такого ограничения нет.
  2. Зонные трансферы (Zone Transfer, AXFR/IXFR). При переносе всей зоны DNS с мастер-сервера на слейв передаются все записи, что почти всегда приводит к большому объему данных. Эта операция выполняется исключительно по TCP для надежности.
  3. Использование расширений DNS, например, DNSSEC. Подписи и дополнительные записи (RRSIG, DNSKEY) увеличивают размер ответа, часто выходя за пределы 512 байт, что требует TCP.
  4. Требования надежности. TCP обеспечивает гарантированную доставку, управление потоком и корректную последовательность пакетов, что критично для важных операций, таких как динамические обновления (DNS UPDATE).

Практический пример: Можно принудительно запросить DNS по TCP с помощью утилиты dig:

dig +tcp +nocookie example.com A
# Или проверить, был ли ответ урезан (флаг TC)
dig +ignore +noedns example.com ANY
# В выводе ищите строку: "Truncated, retrying in TCP mode."

Важно: Современный стандарт EDNS0 (Extension Mechanisms for DNS) позволяет клиенту и серверу договориться о поддержке UDP-пакетов большего размера (например, 4096 байт), что снижает необходимость перехода на TCP для больших ответов.