Чому 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.
kasperd

1
@phoebus ви можете мені показати, як 13 серверів не перевищують 512 байт, тоді як це 14 серверів? який розрахунок за ним?
Тіті Ванса бен Дамхор

1
512 + 60 + 8 = 580 байт, а не 576, ні?
Карло Вуд

12

Сучасний DNS вже не обмежений навантаженням UDP на 512 байт.

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

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

Див. Rfc2671 щодо деталей, що містять зернистість EDNS0


2
Це правда, але все ще є маршрутизатори та брандмауери, які скидають пакети UDP DNS понад 512 байт.
Ryan Ries

2
@RyanRies Так, хоча це, звичайно, поведінка, яка вважається неправильною сьогоднішніми стандартами, це все-таки іноді викликає проблеми. (Теоретично, якщо у вас є такий ліміт, можна було б налаштувати відповідне програмне забезпечення, щоб не рекламувати можливість обробляти / не надсилати більші відповіді.)
Håkan Lindqvist

1

Наприклад, DNS-операції, запити та операції з обслуговування зони за замовчуванням використовують порт 53. З міркувань продуктивності запити використовують протокол UDP з обмеженням розміру блоку 512 байт. TCP можна необов'язково узгоджувати на основі транзакцій за операціями запитів, але внаслідок накладних витрат на виконання TCP це, по суті, теоретична можливість. Історично раніше перевищення межі розміру відповіді 512 байтів зазвичай уникалось будь-якою ціною, і дійсно межа 13 кореневих серверів IPv4 була максимальною, яку можна було повернути в одній транзакції UDP 512 байтів.

Рон Ейчісон - Pro DNS та BIND 10 - 2011


Спасибі. Чи можемо ми знати джерело цитати (дати атрибуцію їй)?
Pothi Kalimuthu

-2

Це QOS річ.

Оскільки UDP не має статусу, обробка помилок з пакетами неможлива.

Таким чином, зберігаючи пакети до максимального розміру, відбувається більша зміна, коли вони досягнуть місця призначення, зменшуючи вплив відсутності обробки помилок.


Більші пакети не означають, що UDP перейшов на TCP. Я нерозумію те, що ви говорите?
mfinni

Ви, мабуть, праві. Я думаю, що я десь прочитав це в запропонованому RFC.
Гаррет Мак-Дейд

UDP не провалюється, але для DNS, зокрема, якщо відповідь занадто велика, щоб підходити при використанні UDP, це призведе до усіченої відповіді (фактична відповідь містить не всі дані, і для цього вказується "усічений" прапор), потім клієнт може повторно спробувати використовувати TCP.
Хокан Ліндквіст
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.