Ответ
Ограничение в 512 байт для DNS-over-UDP — это историческое и фундаментальное проектное решение, закрепленное в оригинальном RFC 1035 (1987). Причины:
- Избегание фрагментации IP-пакетов. Минимальный гарантированный размер MTU (Maximum Transmission Unit) в IPv4 — 576 байт. Из них 512 байт отводилось под данные DNS, а остальное — на заголовки IP (20 байт) и UDP (8 байт). Это гарантировало, что DNS-ответ поместится в один нефрагментированный пакет, что критично для скорости и надежности: фрагментация увеличивает задержки и риск потери пакетов (потеря одного фрагмента ведет к потере всего сообщения).
- Простота и эффективность. Малый фиксированный размер упрощал реализацию как для серверов, так и для клиентов в условиях ограниченных ресурсов раннего интернета.
- Обратная совместимость. Жесткий лимит обеспечивал работу со всеми существовавшими на тот момент реализациями.
Механизм работы: Если DNS-сервер формирует ответ размером более 512 байт, он:
- Обрезает ответ до допустимого лимита.
- Устанавливает в заголовке пакета флаг
TC(Truncated = 1). - Отправляет урезанный ответ по UDP.
Клиент, получив ответ с флагом
TC, понимает, что данные неполные, и повторяет исходный запрос, но уже по TCP, где ограничения на размер ответа нет.
Современное развитие: Стандарт EDNS0 (RFC 6891) решает эту проблему. Он позволяет клиенту в дополнительном псевдо-заголовке OPT сообщить серверу о поддержке более крупных UDP-пакетов (например, 4096 байт). Если сервер также поддерживает EDNS0, он использует этот увеличенный лимит, избегая перехода на TCP.