Pourquoi DNS via UDP a une limite de 512 octets?

14

Je cherchais une réponse à cette question (celle du titre) et la meilleure chose que j'ai trouvée était:

Dans la conception du protocole DNS, la taille du bloc de transport UDP (taille de la charge utile) a été limitée à 512 octets pour optimiser les performances tout en générant un trafic réseau minimal.

ma question est: comment cela améliore-t-il exactement les performances et y a-t-il d'autres raisons à cette limitation lors de l'utilisation d'UDP?

Moha le chameau tout-puissant
la source
5
La question est en fait basée sur une fausse prémisse (tout au moins obsolète). La limite de charge utile de 512 octets n'est plus, voir ma réponse ci-dessous.
Håkan Lindqvist

Réponses:

18

La charge utile de 512 octets garantit que les paquets DNS peuvent être réassemblés s'ils sont fragmentés en transit. De plus, d'une manière générale, il y a moins de chances que des paquets plus petits soient abandonnés de manière aléatoire.

La norme IPv4 spécifie que chaque hôte doit pouvoir réassembler des paquets de 576 octets ou moins. Avec un en-tête IPv4 (20 octets, bien qu'il puisse atteindre 60 octets avec options) et un en-tête UDP de 8 octets, un paquet DNS avec une charge utile de 512 octets sera inférieur à 576 octets.

Comme le dit @RyanRies: DNS peut utiliser TCP pour des charges utiles plus importantes et pour les transferts de zone et DNSSEC. Il y a beaucoup plus de latence lorsque TCP entre en jeu car, contrairement à UDP, il y a une poignée de main entre le client et le serveur avant que les données ne commencent à circuler.

Evan Anderson
la source
7
Une remarque connexe: la raison pour laquelle il y aura toujours 13 noms de résolveurs DNS racine (a.root-servers.net à m.root-servers.net) parce que c'est le nombre maximum qui peut tenir dans une réponse DNS à une requête pour la racine sans dépasser la limite de 512 octets. Ainsi, même si nous ajoutons davantage de serveurs physiques à l'infrastructure DNS racine, il restera logiquement toujours treize serveurs racine.
phoebus
2
@RyanRies Pour DNSSEC EDNS0 avec une charge utile autorisée plus importante est en fait le mode de fonctionnement normal, pas TCP.
Håkan Lindqvist
1
La plus petite MTU autorisée n'est pas de 576 octets, elle est de 68 octets en IPv4 et de 1280 octets en IPv6.
kasperd
1
@phoebus pouvez-vous me montrer comment 13 serveurs ne dépassent pas 512 octets alors que 14 serveurs le font? quel est le calcul derrière cela?
Titi Wangsa bin Damhore
1
512 + 60 + 8 = 580 octets, pas 576, non?
Carlo Wood
12

Le DNS moderne n'est plus limité à 512 octets de charge utile pour UDP.

Lorsque EDNS0 est utilisé, une taille de charge utile plus grande peut être spécifiée, ce qui est également généralement le cas pour les clients prenant en charge DNSSEC.

La prise en charge de charges utiles plus importantes sur UDP a été une arme à double tranchant, cependant, c'est en partie la raison pour laquelle l'utilisation de serveurs de noms pour les attaques d'amplification est devenue plus populaire car vous pouvez obtenir une meilleure amplification si l'attaquant utilise une requête qui obtient une réponse importante. .

Voir rfc2671 pour plus de détails sur EDNS0

Håkan Lindqvist
la source
2
C'est vrai, mais il existe encore des routeurs et des pare-feu qui abandonnent les paquets DNS UDP sur 512 octets.
Ryan Ries
2
@RyanRies Oui, bien que ce comportement soit bien sûr considéré comme incorrect par les normes actuelles, c'est quelque chose qui occasionne encore parfois des problèmes. (En théorie, si l'on a une telle limite en place, on saurait configurer le logiciel pertinent pour ne pas annoncer la capacité de gérer / ne pas envoyer de réponses plus importantes.)
Håkan Lindqvist
1

Les opérations DNS par exemple, les requêtes et les opérations de maintenance de zone par défaut utilisent le port 53. Pour des raisons de performances, les requêtes utilisent le protocole UDP avec une limite de taille de bloc de 512 octets. TCP peut être éventuellement négocié transaction par transaction pour les opérations de requête, mais en raison de la surcharge de performances encourue avec TCP, il s'agit essentiellement d'une capacité théorique. Historiquement, le dépassement de la limite de taille de réponse de 512 octets était généralement évité à tout prix, et en effet, la limite de 13 serveurs racine IPv4 était le maximum pouvant être renvoyé dans une seule transaction UDP de 512 octets.

Ron Aitchison - Pro DNS et BIND 10-2011

Alex Zubkov
la source
Merci. Peut-on connaître la source de la citation (pour lui attribuer)?
Pothi Kalimuthu
-2

C'est une chose QOS.

Parce que UDP est sans état, la gestion des erreurs des paquets n'est pas possible.

Ainsi, en gardant les paquets à une taille maximale, il y a un plus grand changement qu'ils atteindront leur destination, réduisant l'impact de l'absence de gestion des erreurs.

Garreth McDaid
la source
Des paquets plus importants ne signifient pas que UDP bascule vers TCP. Suis-je mal compris ce que vous dites?
mfinni
Tu as probablement raison. Je pense que je l'ai lu quelque part dans un RFC proposé.
Garreth McDaid
UDP ne bascule pas mais pour DNS en particulier si la réponse est trop grande pour tenir lors de l'utilisation d'UDP, cela se traduira par une réponse tronquée (la réponse réelle ne contient pas toutes les données et l'indicateur `` tronqué '' est défini pour l'indiquer), le client peut alors réessayer en utilisant TCP à la place.
Håkan Lindqvist