In che modo il protocollo DNS passa da UDP a TCP?


31

Prima che qualcuno chieda: ho visto Quando le query DNS utilizzano TCP anziché UDP? e non risponde alla mia domanda.

Tutto quello che continuo a sentire è " se la risposta è troppo lunga, DNS utilizzerà TCP ". Questo non spiega come succede però.

Quindi, ecco la situazione: il client DNS richiede la risoluzione di un record utilizzando UDP. Il record è troppo lungo per UDP:

  1. il server risponde con un codice operativo specifico, per fare in modo che il client passi a TCP
  2. il server non risponde affatto e il client riprova su TCP
  3. il server apre la connessione TCP al client (stupido, se conti NAT, ma chi lo sa?)
  4. client in qualche modo (?) 'sa' che una determinata query dovrebbe essere eseguita su TCP in modo da non disturbare UDP in primo luogo
  5. I pixel DNS trasformano magicamente UDP in TCP quando necessario

Ho cercato su Internet la risposta, ma c'è molto rumore (vedi sopra), e non riesco a scrivere una query Google appropriata per questo (né posso trovare le informazioni negli RFC, per quella materia) .


1
Tutto ciò che ho potuto trovare è stato in RFC5966: "Un resolver DOVREBBE inviare prima una query UDP, ma POTREBBE decidere di inviare una query TCP invece se ha buone ragioni per aspettarsi che la risposta venga troncata se fosse inviata su UDP (con o senza EDNS0 ) o per altri motivi operativi, in particolare se dispone già di una connessione TCP aperta al server. ". Quando il resolver dovrebbe "aspettarsi" che la risposta venga troncata?
StanTastic,

6
Un esempio ovvio sarebbe se una precedente richiesta per lo stesso record fosse troppo lunga per essere inserita in un datagramma UDP.
David Schwartz,

1
Quindi c'è un codice operativo che dice "troncato", giusto? E poi cambia - praticamente quello che pensavo, è la soluzione più ovvia.
StanTastic,

1
Il caso (d) può essere una scelta saggia se la query contiene più "domande" (indirizzi da risolvere). Se devi risolvere 100 indirizzi, non sarai in grado di adattare la risposta in un singolo pacchetto UDP.
Salterio

1
1.e 4.sono entrambi approssimativamente corretti (quale dei due dipende dalle circostanze).
Kasperd,

Risposte:


45

Il client non sa in anticipo che la risposta sarà troppo grande, quindi interrogherà il server tramite UDP.
Il server risponderà tramite UDP e includerà il più possibile e imposterà il bit di intestazione troncato ("TC" http://www.networksorcery.com/enp/protocol/dns.htm ).
Il client può quindi inviare nuovamente la richiesta tramite TCP e ottenere la risposta completa.

Vedi anche: https://tools.ietf.org/html/rfc5966

In assenza di EDNS0 (Extension Mechanisms for DNS 0) (vedi sotto), il comportamento normale di qualsiasi server DNS che deve inviare una risposta UDP che superi il limite di 512 byte è che il server troncerà la risposta in modo che si adatti entro tale limite e quindi impostare il flag TC nell'intestazione della risposta. Quando il client riceve tale risposta, prende il flag TC come indicazione che dovrebbe riprovare invece su TCP.

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

E come menzionato nei commenti, ovviamente i trasferimenti di zona DNS utilizzano sempre TCP.


2
RFC 5966 rileva inoltre che TCP viene sempre utilizzato per i trasferimenti di zona.
Matt Nordhoff l'

@MattNordhoff Giusto, è vero e bello da menzionare. Questo era più mirato al "come funziona il passaggio da UDP a TCP?" angolo. Ma lo aggiungerò alla risposta.
falso

Tuttavia, se esiste già una connessione TCP, utilizzerà solo TCP
Jim B

Oh, è interessante. Quindi, quando torna a UDP?
StanTastic,

@JimB Ne sei sicuro? Non credo che mantenga aperta una connessione TCP persistente.
Barmar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.