¿Cómo cambia el protocolo DNS de UDP a TCP?

31

Antes de que alguien pregunte: He visto ¿ Cuándo las consultas DNS usan TCP en lugar de UDP? y no responde mi pregunta

Todo lo que escucho es " si la respuesta es demasiado larga, DNS usará TCP ". Sin embargo, esto no explica cómo sucede.

Así que aquí está la situación: el cliente DNS solicita la resolución de un registro usando UDP. El registro es demasiado largo para UDP:

  1. el servidor responde con un código de operación específico, para que el cliente cambie a TCP
  2. el servidor no responde en absoluto y el cliente vuelve a intentarlo a través de TCP
  3. el servidor abre la conexión TCP al cliente (estúpido, si cuenta NAT, pero ¿quién sabe?)
  4. el cliente de alguna manera (?) 'sabe' que la consulta dada debe ejecutarse a través de TCP para que no se moleste con UDP en primer lugar
  5. Los pixies DNS convierten mágicamente UDP en TCP cuando sea necesario

He estado buscando en Internet la respuesta, pero hay mucho ruido (ver arriba), y parece que no puedo escribir una consulta de Google adecuada para eso (ni puedo encontrar la información en RFC, de hecho) .

StanTastic
fuente
1
Todo lo que pude encontrar fue en RFC5966: "Un resolutor DEBE enviar primero una consulta UDP, pero PUEDE optar por enviar una consulta TCP en su lugar si tiene una buena razón para esperar que la respuesta se truncaría si se enviara a través de UDP (con o sin EDNS0 ) o por otros motivos operativos, en particular, si ya tiene una conexión TCP abierta al servidor ". ¿Cuándo debe resolver "esperar" que la respuesta se truncará?
StanTastic
66
Un ejemplo obvio sería si una solicitud previa para el mismo registro fuera demasiado larga para caber en un datagrama UDP.
David Schwartz
1
Entonces, hay un código de operación que dice 'truncado', ¿verdad? Y luego cambia, básicamente lo que pensé, es la solución más obvia.
StanTastic
1
El caso (d) puede ser una buena elección si la consulta contiene múltiples "preguntas" (direcciones para resolver). Si necesita resolver 100 direcciones, no podrá ajustar la respuesta en un solo paquete UDP.
MSalters
1
1.y 4.ambos son aproximadamente correctos (cuál de los dos depende de las circunstancias).
kasperd

Respuestas:

45

El cliente no sabe de antemano que la respuesta será demasiado grande, por lo que consultará al servidor a través de UDP.
El servidor responderá a través de UDP e incluirá tanto como sea posible y establecerá el bit de encabezado truncado ("TC" http://www.networksorcery.com/enp/protocol/dns.htm ).
El cliente puede reenviar la solicitud a través de TCP y obtener la respuesta completa.

Ver también: https://tools.ietf.org/html/rfc5966

En ausencia de EDNS0 (Mecanismos de extensión para DNS 0) (ver más abajo), el comportamiento normal de cualquier servidor DNS que necesite enviar una respuesta UDP que exceda el límite de 512 bytes es que el servidor trunque la respuesta para que se ajuste dentro de ese límite y luego establezca el indicador TC en el encabezado de respuesta. Cuando el cliente recibe dicha respuesta, toma el indicador TC como una indicación de que debería reintentar a través de TCP.

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

Y como se menciona en los comentarios, por supuesto, las transferencias de zona DNS siempre usan TCP.

falsificador
fuente
2
RFC 5966 también señala que TCP siempre se usa para transferencias de zona.
Matt Nordhoff
@ MattNordhoff Correcto, eso es cierto y es bueno mencionarlo. Esto estaba más dirigido a '¿cómo funciona el cambio de UDP a TCP?' ángulo. Pero lo agregaré a la respuesta.
falsificador
Sin embargo, si ya hay una conexión TCP, solo usará TCP
Jim B
Oh eso es interesante. Entonces, ¿cuándo vuelve a UDP?
StanTastic
@JimB ¿Estás seguro de eso? No creo que mantenga abierta una conexión TCP persistente.
Barmar