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

14

Я искал ответ на этот вопрос (тот, что в заголовке), и лучшее, что я нашел, было:

При разработке протокола DNS размер транспортного блока UDP (размер полезной нагрузки) был ограничен 512 байтами для оптимизации производительности при одновременной генерации минимального сетевого трафика.

Мой вопрос: как именно это повышает производительность и есть ли другие причины для такого ограничения при использовании UDP?

Моха всемогущий верблюд
источник
5
Вопрос фактически основан на ложной предпосылке (по крайней мере, устаревшей). Предел полезной нагрузки в 512 байт больше не существует, см. Мой ответ ниже.
Хокан Линдквист,

Ответы:

18

Полезная нагрузка 512 байт гарантирует, что пакеты DNS могут быть повторно собраны, если они фрагментированы при передаче. Кроме того, вообще говоря, есть меньшая вероятность случайного отбрасывания небольших пакетов.

Стандарт IPv4 определяет, что каждый хост должен иметь возможность собирать пакеты размером 576 байтов или меньше. С заголовком IPv4 (20 байт, хотя он может достигать 60 байт с параметрами) и 8-байтовым заголовком UDP, пакет DNS с полезной нагрузкой 512 байт будет меньше, чем 576 байт.

Как говорит @RyanRies: DNS может использовать TCP для больших нагрузок и для зонных передач и DNSSEC. Когда TCP вступает в игру, гораздо больше задержек, потому что, в отличие от UDP, между клиентом и сервером происходит рукопожатие, прежде чем начинают передаваться какие-либо данные.

Эван Андерсон
источник
7
Соответствующее примечание: причина, по которой всегда будет 13 имен корневых преобразователей DNS (от a.root-servers.net до m.root-servers.net), заключается в том, что это максимальное число, которое может поместиться в ответе DNS на запрос для корень без превышения лимита в 512 байт. Таким образом, даже если мы добавим больше физических серверов в корневую инфраструктуру DNS, логически всегда останется тринадцать корневых серверов.
Феб
2
@RyanRies Для DNSSEC EDNS0 с большей разрешенной полезной нагрузкой фактически является обычным режимом работы, а не TCP.
Хокан Линдквист,
1
Наименьшее допустимое значение MTU - не 576 байтов, это 68 байтов в IPv4 и 1280 байтов в IPv6.
Касперд
1
@phoebus Можете ли вы показать мне, как 13 серверов не превышают 512 байт, а 14 серверов? какой за этим стоит расчет?
Тити Вангса бин Дамхор
1
512 + 60 + 8 = 580 байт, а не 576, нет?
Карло Вуд
12

Современный DNS больше не ограничен полезной нагрузкой 512 байт для UDP.

При использовании EDNS0 можно указать больший размер полезной нагрузки, что также обычно бывает для клиентов, поддерживающих DNSSEC.

Поддержка больших полезных нагрузок по UDP была обоюдоострым мечом, однако это отчасти является причиной того, почему использование серверов имен для атак с усилением стало более популярным, поскольку вы можете добиться лучшего усиления, если злоумышленник использует запрос, который получает большой ответ ,

См. Подробности о EDNS0 в rfc2671.

Хокан Линдквист
источник
2
Это правда, но все еще существуют маршрутизаторы и брандмауэры, которые отбрасывают UDP-пакеты UDP более 512 байт.
Райан Райс
2
@RyanRies Да, хотя это, конечно, поведение, которое считается неправильным в сегодняшних стандартах, оно иногда вызывает проблемы. (Теоретически, если у кого-то есть такой лимит, можно было бы настроить соответствующее программное обеспечение таким образом, чтобы оно не объявляло о возможности обработки / не отправки больших ответов.)
Хакан Линдквист,
1

Операции DNS, например, запросы и операции обслуживания зоны по умолчанию используют порт 53. Из соображений производительности запросы используют протокол UDP с ограничением размера блока 512 байт. TCP может быть дополнительно согласован на основе транзакций для транзакций запросов, но из-за снижения производительности, связанного с TCP, это, по сути, теоретическая возможность. Исторически превышение предела размера ответа в 512 байт обычно избегалось любой ценой, и действительно, ограничение в 13 корневых серверов IPv4 было максимумом, который мог быть возвращен в одной 512-байтовой транзакции UDP.

Рон Эйтчисон - Pro DNS и BIND 10 - 2011

Алекс Зубков
источник
Благодарю. Можем ли мы знать источник цитаты (чтобы дать ссылку на него)?
Поти Калимуту
-2

Это вещь QOS.

Поскольку UDP не имеет состояния, обработка пакетов с ошибками невозможна.

Таким образом, поддерживая максимальный размер пакетов, будет больше изменений в том, что они достигнут своего назначения, уменьшая влияние отсутствия обработки ошибок.

Гаррет МакДейд
источник
Большие пакеты не означают, что UDP переключается на TCP. Я неправильно понимаю, что вы говорите?
mfinni
Возможно Вы правы. Я думаю, что я читал это в предложенном RFC где-то.
Гаррет МакДейд
UDP не переключается при сбое, но для DNS, в частности, если ответ слишком велик, чтобы соответствовать при использовании UDP, это приведет к усеченному ответу (фактический ответ не содержит все данные, и для этого установлен флаг «усеченный»), клиент может повторить попытку, используя вместо этого TCP.
Хокан Линдквист