W jaki sposób protokół DNS zmienia się z UDP na TCP?

31

Zanim ktokolwiek zapyta: Widziałem Kiedy zapytania DNS używają TCP zamiast UDP? i to nie odpowiada na moje pytanie.

Ciągle słyszę tylko: „ jeśli odpowiedź jest za długa, DNS użyje TCP ”. Nie wyjaśnia to jednak, jak to się dzieje.

Oto sytuacja: klient DNS prosi o rozstrzygnięcie rekordu za pomocą UDP. Rekord jest za długi dla UDP:

  1. serwer odpowiada określonym kodem operacji, aby klient przeszedł na TCP
  2. serwer w ogóle nie odpowiada, a klient próbuje ponownie przez TCP
  3. serwer otwiera połączenie TCP z klientem (głupie, jeśli liczyć NAT, ale kto wie?)
  4. klient jakoś (?) „wie”, że dane zapytanie powinno być uruchamiane przez TCP, aby nie przeszkadzało to UDP
  5. W razie potrzeby pixie DNS w magiczny sposób przekształcają UDP w TCP

Szukałem odpowiedzi w całym Internecie, ale jest dużo hałasu (patrz wyżej) i wydaje mi się, że nie mogę napisać odpowiedniego zapytania Google (nie mogę też znaleźć informacji w RFC) .

StanTastic
źródło
1
Wszystko, co mogłem znaleźć, to RFC5966: „Program tłumaczący POWINIEN najpierw wysłać zapytanie UDP, ale MOŻE zdecydować się na wysłanie zapytania TCP, jeśli ma dobry powód, aby oczekiwać, że odpowiedź zostanie obcięta, jeśli zostanie wysłana przez UDP (z EDNS0 lub bez ) lub z innych powodów operacyjnych, w szczególności jeśli ma już otwarte połączenie TCP z serwerem. ”. Kiedy resolver powinien „oczekiwać”, że odpowiedź zostanie obcięta?
StanTastic
6
Oczywistym przykładem byłoby, gdyby poprzednie żądanie tego samego rekordu było zbyt długie, aby zmieściło się w datagramie UDP.
David Schwartz,
1
Jest więc kod operacyjny z napisem „obcięty”, prawda? I wtedy się zmienia - w zasadzie to, co myślałem, to najbardziej oczywiste rozwiązanie.
StanTastic
1
Przypadek (d) może być dobrym wyborem, jeśli zapytanie zawiera wiele „pytań” (adresów do rozwiązania). Jeśli musisz rozwiązać 100 adresów, nie będziesz w stanie zmieścić odpowiedzi w jednym pakiecie UDP.
MSalters
1
1.i 4.oba są mniej więcej poprawne (które z nich zależy od okoliczności).
kasperd

Odpowiedzi:

45

Klient nie wie z góry, że odpowiedź będzie zbyt duża, więc przesyła zapytanie do serwera za pośrednictwem UDP.
Serwer odpowie przez UDP i będzie zawierać jak najwięcej i ustawi obcięty bit nagłówka („TC” http://www.networksorcery.com/enp/protocol/dns.htm ).
Klient może następnie ponownie wysłać żądanie przez TCP i uzyskać pełną odpowiedź.

Zobacz także: https://tools.ietf.org/html/rfc5966

W przypadku braku EDNS0 (Mechanizmy rozszerzenia dla DNS 0) (patrz poniżej), normalnym zachowaniem każdego serwera DNS, który musi wysłać odpowiedź UDP przekraczającą limit 512 bajtów, jest obcięcie odpowiedzi przez serwer, aby pasowała w ramach tego limitu, a następnie ustaw flagę TC w nagłówku odpowiedzi. Gdy klient otrzymuje taką odpowiedź, bierze flagę TC jako wskazówkę, że zamiast tego powinien ponowić próbę przez TCP.

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

I jak wspomniano w komentarzach, oczywiście transfery stref DNS zawsze używają TCP.

oszust
źródło
2
RFC 5966 zauważa również, że TCP jest zawsze używany do przesyłania stref.
Matt Nordhoff,
@MattNordhoff Racja, to prawda i warto o tym wspomnieć. To było bardziej ukierunkowane na „jak działa przejście z UDP na TCP?” kąt. Ale dodam to do odpowiedzi.
faker
Jeśli jednak istnieje już połączenie TCP, użyje tylko TCP
Jim B
Och, to interesujące. Kiedy więc wraca do UDP?
StanTastic
@JimB Czy jesteś tego pewien? Nie sądzę, że utrzymuje stałe połączenie TCP otwarte.
Barmar