Wie wechselt das DNS-Protokoll von UDP zu TCP?

31

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

Ich höre nur noch " Wenn die Antwort zu lang ist, verwendet DNS TCP ". Dies erklärt jedoch nicht, wie es passiert.

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

  1. Der Server antwortet mit einem bestimmten Opcode, damit der Client zu TCP wechselt
  2. Der Server antwortet überhaupt nicht und der Client versucht es erneut über TCP
  3. Server öffnet TCP-Verbindung zum Client (dumm, wenn man NAT zählt, aber wer weiß?)
  4. Der Client (?) 'weiß' irgendwie, dass eine bestimmte Abfrage über TCP ausgeführt werden sollte, damit er sich überhaupt nicht um UDP kümmert
  5. DNS-Pixies verwandeln UDP bei Bedarf auf magische Weise in TCP

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

StanTastic
quelle
1
Alles, was ich finden konnte, war in RFC5966: "Ein Resolver SOLLTE zuerst eine UDP-Abfrage senden, aber KANN sich dafür entscheiden, stattdessen eine TCP-Abfrage zu senden, wenn es guten Grund zu der Annahme gibt, dass die Antwort abgeschnitten wird, wenn sie über UDP gesendet wird (mit oder ohne EDNS0) ) oder aus anderen betrieblichen Gründen, insbesondere wenn bereits eine offene TCP-Verbindung zum Server besteht. " Wann sollte der Resolver damit rechnen, dass die Antwort abgeschnitten wird?
StanTastic
6
Ein naheliegendes Beispiel wäre, wenn eine vorherige Anforderung für denselben Datensatz zu lang wäre, um in ein UDP-Datagramm zu passen.
David Schwartz
1
Es gibt also einen Opcode mit der Aufschrift "abgeschnitten", oder? Und es wechselt dann - im Grunde genommen, was ich dachte, es ist die naheliegendste Lösung.
StanTastic
1
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 einpassen.
MSalters
1
1.und 4.sind beide ungefähr richtig (welches von beiden von den Umständen abhängt).
Kasperd

Antworten:

45

Der Client weiß nicht im Voraus, dass die Antwort zu groß ist, und fragt 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 Anforderung ü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) besteht das normale Verhalten eines DNS-Servers, der eine UDP-Antwort senden muss, die das 512-Byte-Limit überschreitet, darin, dass der Server die Antwort so abschneidet, dass sie passt innerhalb dieses Limits und setzen Sie dann das TC-Flag im Antwortheader. Wenn der Client eine solche Antwort erhält, wird das TC-Flag als Hinweis darauf verwendet, dass stattdessen ein erneuter Versuch über TCP durchgeführt werden soll.

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

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

Schwindler
quelle
2
RFC 5966 stellt außerdem fest, dass TCP immer für Zonenübertragungen verwendet wird.
Matt Nordhoff
@MattNordhoff Richtig, das ist wahr und gut zu erwähnen. Dies bezog sich eher auf die Frage, wie der Wechsel von UDP zu TCP funktioniert. Winkel. Aber ich werde es der Antwort hinzufügen.
Fälscher
Wenn jedoch bereits eine TCP-Verbindung besteht, wird nur TCP verwendet
Jim B,
Oh, das ist interessant. Wann fällt 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