Warum ist DNS über UDP auf 512 Byte begrenzt?

14

Ich habe nach einer Antwort auf diese Frage gesucht (die im Titel) und das Beste, was ich gefunden habe, war:

Beim Entwurf des DNS-Protokolls wurde die UDP-Transportblockgröße (Nutzlastgröße) auf 512 Byte begrenzt, um die Leistung zu optimieren und gleichzeitig minimalen Netzwerkverkehr zu generieren.

Meine Frage ist: Wie genau verbessert dies die Leistung und gibt es andere Gründe für diese Einschränkung bei der Verwendung von UDP?

Moha das allmächtige Kamel
quelle
5
Die Frage basiert tatsächlich auf einer falschen Prämisse (zumindest einer veralteten). Das 512-Byte-Payload-Limit ist nicht mehr, siehe meine Antwort unten.
Håkan Lindqvist

Antworten:

18

Die 512-Byte-Nutzlast garantiert, dass DNS-Pakete bei einer Fragmentierung während der Übertragung wieder zusammengesetzt werden können. Im Allgemeinen besteht auch eine geringere Wahrscheinlichkeit, dass kleinere Pakete nach dem Zufallsprinzip verworfen werden.

Der IPv4-Standard legt fest, dass jeder Host Pakete mit maximal 576 Byte neu zusammenstellen kann. Mit einem IPv4-Header (20 Byte, obwohl er bis zu 60 Byte mit Optionen umfassen kann) und einem 8-Byte-UDP-Header ist ein DNS-Paket mit einer Nutzlast von 512 Byte kleiner als 576 Byte.

Wie @RyanRies sagt: DNS kann TCP für größere Nutzdaten und für Zonentransfers und DNSSEC verwenden. Wenn TCP ins Spiel kommt, ist die Latenz wesentlich höher, da im Gegensatz zu UDP ein Handshake zwischen Client und Server stattfindet, bevor Daten fließen.

Evan Anderson
quelle
7
Eine verwandte Anmerkung: Der Grund dafür, dass es immer 13 DNS-Resolvernamen im Stammverzeichnis (a.root-servers.net bis m.root-servers.net) gibt, ist, dass dies die maximale Anzahl ist, die in eine DNS-Antwort auf eine Abfrage für passen kann die Wurzel, ohne die 512-Byte-Grenze zu überschreiten. Selbst wenn wir der DNS-Stamminfrastruktur weitere physische Server hinzufügen, bleiben logischerweise immer dreizehn Stammserver übrig.
Phoebus
2
@RyanRies Für DNSSEC ist EDNS0 mit einer größeren zulässigen Nutzlast der normale Betriebsmodus, nicht TCP.
Håkan Lindqvist
1
Die kleinste zulässige MTU beträgt nicht 576 Byte, sondern 68 Byte in IPv4 und 1280 Byte in IPv6.
Kasperd
1
@phoebus können Sie mir zeigen, wie 13 Server 512 Byte nicht überschreiten, während 14 Server dies tun? Was ist die Berechnung dahinter?
Titi Wangsa bin Damhore
1
512 + 60 + 8 = 580 Bytes, nicht 576, nein?
Carlo Wood
12

Modernes DNS ist nicht mehr auf 512 Byte Nutzlast für UDP beschränkt.

Bei Verwendung von EDNS0 kann eine größere Nutzlast angegeben werden, was auch bei DNSSEC-fähigen Clients häufig der Fall ist.

Die Unterstützung größerer Nutzlasten über UDP war ein zweischneidiges Schwert. Dies ist jedoch zum Teil der Grund dafür, warum die Verwendung von Nameservern für Verstärkungsangriffe populärer wurde, da Sie eine bessere Verstärkung erzielen können, wenn der Angreifer eine Abfrage verwendet, die eine große Antwort erhält .

Siehe rfc2671 für die Details von EDNS0

Håkan Lindqvist
quelle
2
Dies ist wahr, aber es gibt immer noch Router und Firewalls, die UDP-DNS-Pakete über 512 Byte löschen.
Ryan Ries
2
@RyanRies Ja, obwohl dies natürlich ein Verhalten ist, das nach heutigen Maßstäben als inkorrekt angesehen wird, ist es immer noch etwas, das gelegentlich Probleme verursacht. (In der Theorie, wenn man ein solches Limit hat, würde man wissen, dass die relevante Software so konfiguriert werden muss, dass die Fähigkeit zur Bearbeitung nicht beworben wird / keine größeren Antworten
Håkan Lindqvist
1

DNS-Vorgänge, z. B. Abfragen, und Zonenwartungsvorgänge, verwenden standardmäßig Port 53. Aus Leistungsgründen verwenden Abfragen das UDP-Protokoll mit einer Blockgrößenbeschränkung von 512 Byte. TCP kann für Abfrageoperationen optional transaktionsweise ausgehandelt werden. Aufgrund des mit TCP verbundenen Leistungsaufwands handelt es sich jedoch im Wesentlichen um eine theoretische Funktion. In der Vergangenheit wurde das Überschreiten des 512-Byte-Antwortgrößenlimits in der Regel um jeden Preis vermieden, und in der Tat war das Limit von 13 IPv4-Stammservern das Maximum, das in einer einzelnen 512-Byte-UDP-Transaktion zurückgegeben werden konnte.

Ron Aitchison - Pro DNS und BIND 10 - 2011

Alex Zubkov
quelle
Vielen Dank. Dürfen wir die Quelle des Zitats kennen (um ihm eine Zuschreibung zu geben)?
Pothi Kalimuthu
-2

Es ist eine QOS-Sache.

Da UDP zustandslos ist, ist eine Fehlerbehandlung von Paketen nicht möglich.

Indem Pakete auf einer maximalen Größe gehalten werden, kommt es zu einer größeren Änderung, sodass sie ihr Ziel erreichen, was die Auswirkung der fehlenden Fehlerbehandlung verringert.

Garreth McDaid
quelle
Größere Pakete bedeuten nicht, dass UDP auf TCP umschaltet. Verstehe ich falsch, was Sie sagen?
Mfinni
Du hast wahrscheinlich Recht. Ich glaube, ich habe das irgendwo in einem vorgeschlagenen RFC gelesen.
Garreth McDaid
UDP führt kein Failover durch, aber für DNS, insbesondere wenn die Antwort zu groß ist, um bei Verwendung von UDP zu passen, führt dies zu einer abgeschnittenen Antwort (die tatsächliche Antwort enthält nicht alle Daten, und das Flag "abgeschnitten" wird gesetzt, um dies anzuzeigen). Der Client kann es dann erneut über TCP versuchen.
Håkan Lindqvist