Comment le protocole DNS passe-t-il de l'UDP au TCP ?

Avant que quiconque ne pose la question : j’ai vu Quand les requêtes DNS utilisent-elles TCP au lieu d’UDP ? et cela ne répond pas à ma question.

Tout ce que j’entends, c’est « si la réponse est trop longue, le DNS utilisera TCP ». Cela n’explique pas comment cela se produit cependant.

Voici donc la situation : le client DNS demande la résolution d’un enregistrement en utilisant UDP. L’enregistrement est trop long pour UDP :

  • le serveur répond avec un opcode spécifique, pour que le client passe en TCP

  • le serveur ne répond pas du tout, et le client réessaie en TCP

  • le serveur ouvre une connexion TCP vers le client (stupide, si l’on tient compte du NAT, mais qui sait ?)

  • le client « sait » en quelque sorte (?) que la requête donnée devrait être exécutée en TCP, donc il ne s’embête pas avec UDP en premier lieu

  • des fées DNS transforment magiquement l’UDP en TCP quand c’est nécessaire

J’ai cherché partout sur Internet la réponse, mais il y a beaucoup de bruit (voir ci-dessus), et je n’arrive pas à écrire la bonne requête Google pour cela (ni à trouver l’information dans les RFC, d’ailleurs).


Source : Server Fault

Le client ne sait pas à l’avance que la réponse sera trop volumineuse, il interroge donc le serveur via UDP.

Le serveur répondra via UDP et inclura autant que possible et définira le bit d’en-tête tronqué (« TC » http://www.networksorcery.com/enp/protocol/dns.htm).

Le client peut alors renvoyer la requête via TCP et obtenir la réponse complète.

Voir aussi : https://www.rfc-editor.org/rfc/rfc5966

En l’absence d’EDNS0 (Extension Mechanisms for DNS 0) (voir
ci-dessous), le comportement normal de tout serveur DNS devant envoyer une
réponse UDP qui dépasserait la limite de 512 octets est que le serveur
tronque la réponse pour qu’elle tienne dans cette limite puis
définisse le drapeau TC dans l’en-tête de la réponse. Lorsque le client reçoit
une telle réponse, il prend le drapeau TC comme indication qu’il devrait
réessayer via TCP à la place.

Et : https://www.ietf.org/rfc/rfc2181.txt

Et comme mentionné dans les commentaires, bien entendu les transferts de zone DNS utilisent toujours TCP.