Frage Wie wechselt das DNS-Protokoll von UDP zu TCP?


Bevor jemand fragt: Ich habe es gesehen Wann verwenden DNS-Abfragen TCP anstelle von UDP? und es beantwortet meine Frage nicht.

Alles was ich höre ist "Wenn die Antwort zu lang ist, verwendet DNS TCP"Das erklärt nicht, wie es passiert.

Also hier ist die Situation: DNS-Client fragt nach Auflösung eines Datensatzes mit UDP. Der Datensatz ist zu lang für UDP:

  1. Der Server antwortet mit einem bestimmten Opcode, damit der Client auf TCP umschaltet
  2. Server antwortet überhaupt nicht, und Client versucht erneut über TCP
  3. Server öffnet TCP-Verbindung zum Client (dumm, wenn Sie NAT zählen, aber wer weiß?)
  4. Irgendwie weiß der Client (?), dass die angegebene Abfrage über TCP laufen sollte, damit UDP überhaupt nicht gestört wird
  5. DNS-Pixies verwandeln UDP bei Bedarf magisch in TCP

Ich habe überall im Internet nach der Antwort gesucht, aber es gibt viel Lärm (siehe oben), und ich kann anscheinend keine richtige Google-Abfrage dafür schreiben (und auch die Informationen in RFCs finde ich nicht) .


30
2018-06-11 10:51


Ursprung


Alles, was ich finden konnte, war in RFC5966: "Ein Resolver SOLLTE zuerst eine UDP-Abfrage senden, aber kann stattdessen eine TCP-Abfrage senden, wenn es gute Gründe dafür gibt, dass die Antwort abgeschnitten wäre, wenn sie über UDP gesendet würde (mit oder ohne EDNS0) ) oder aus anderen betrieblichen Gründen, insbesondere wenn es bereits eine offene TCP-Verbindung zum Server hat. " Wann sollte der Resolver "erwarten", dass die Antwort abgeschnitten wird? - StanTastic
Ein offensichtliches Beispiel wäre, wenn eine vorherige Anforderung für den gleichen Datensatz zu lang war, um in ein UDP-Datagramm zu passen. - David Schwartz
Also gibt es einen Opcode, der "abgeschnitten" sagt, oder? Und es schaltet dann - im Grunde, was ich dachte, ist es die naheliegendste Lösung. - StanTastic
Fall (d) kann eine kluge Wahl sein, wenn die Abfrage mehrere "Fragen" (zu lösende Adressen) enthält. Wenn Sie 100 Adressen auflösen müssen, können Sie die Antwort nicht in ein einzelnes UDP-Paket einfügen. - MSalters
1.und 4. sind beide in etwa richtig (welche der beiden hängt von Umständen ab). - kasperd


Antworten:


Der Client weiß nicht im Voraus, dass die Antwort zu groß ist, also fragt er den Server über UDP ab.
Der Server antwortet über UDP und enthält so viel wie möglich und setzt das abgeschnittene Header-Bit ("TC") http://www.networksorcery.com/enp/protocol/dns.htm).
Der Client kann dann die Anfrage über TCP erneut senden und die vollständige Antwort erhalten.

Siehe auch: https://tools.ietf.org/html/rfc5966

In Abwesenheit von EDNS0 (Erweiterungsmechanismen für DNS 0) (siehe   unten), das normale Verhalten eines DNS - Servers, der ein   UDP-Antwort, die die 512-Byte-Grenze überschreiten würde, ist für den Server   um die Antwort so zu kürzen, dass sie innerhalb dieses Limits liegt und dann   Setzen Sie das Kennzeichen TC im Antwortheader. Wenn der Kunde empfängt   eine solche Antwort, es dauert das TC-Flag als ein Hinweis darauf   sollte stattdessen über TCP erneut versuchen.

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

Und wie in den Kommentaren erwähnt, verwenden DNS-Zonenübertragungen natürlich immer TCP.


43
2018-06-11 11:15



RFC 5966 bemerkt auch, dass TCP ist immer Wird für Zonenübertragungen verwendet. - Matt Nordhoff
@MattNordhoff Richtig, das ist wahr und gut zu erwähnen. Dies war mehr auf die "wie funktioniert der Wechsel von UDP zu TCP arbeiten?" Winkel. Aber ich werde es der Antwort hinzufügen. - faker
Wenn jedoch bereits eine TCP-Verbindung besteht, wird nur TCP verwendet - Jim B
Oh, das ist interessant. Wann greift es auf UDP zurück? - StanTastic
@ JimB Bist du dir da sicher? Ich glaube nicht, dass es eine dauerhafte TCP-Verbindung offen hält. - Barmar