Почему DNS-ответ по UDP ограничен 512 байтами?

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

Ответ

Ограничение в 512 байт для DNS-over-UDP — это историческое и фундаментальное проектное решение, закрепленное в оригинальном RFC 1035 (1987). Причины:

  1. Избегание фрагментации IP-пакетов. Минимальный гарантированный размер MTU (Maximum Transmission Unit) в IPv4 — 576 байт. Из них 512 байт отводилось под данные DNS, а остальное — на заголовки IP (20 байт) и UDP (8 байт). Это гарантировало, что DNS-ответ поместится в один нефрагментированный пакет, что критично для скорости и надежности: фрагментация увеличивает задержки и риск потери пакетов (потеря одного фрагмента ведет к потере всего сообщения).
  2. Простота и эффективность. Малый фиксированный размер упрощал реализацию как для серверов, так и для клиентов в условиях ограниченных ресурсов раннего интернета.
  3. Обратная совместимость. Жесткий лимит обеспечивал работу со всеми существовавшими на тот момент реализациями.

Механизм работы: Если DNS-сервер формирует ответ размером более 512 байт, он:

  1. Обрезает ответ до допустимого лимита.
  2. Устанавливает в заголовке пакета флаг TC (Truncated = 1).
  3. Отправляет урезанный ответ по UDP. Клиент, получив ответ с флагом TC, понимает, что данные неполные, и повторяет исходный запрос, но уже по TCP, где ограничения на размер ответа нет.

Современное развитие: Стандарт EDNS0 (RFC 6891) решает эту проблему. Он позволяет клиенту в дополнительном псевдо-заголовке OPT сообщить серверу о поддержке более крупных UDP-пакетов (например, 4096 байт). Если сервер также поддерживает EDNS0, он использует этот увеличенный лимит, избегая перехода на TCP.