DNS protokolü UDP'den TCP'ye nasıl geçiyor?


31

Kimse sormadan önce: Gördüm DNS sorguları ne zaman UDP yerine TCP kullanıyor? ve sorumu cevaplamıyor.

Tek duyduğum " cevap çok uzunsa DNS TCP kullanır " dır . Bu olsa nasıl olduğunu açıklamıyor.

İşte durum şu: DNS istemcisi UDP kullanarak bir kaydın çözümlenmesini istiyor. UDP için kayıt çok uzun:

  1. istemcinin TCP'ye geçmesi için sunucu belirli bir kodla cevap veriyor
  2. sunucu hiç cevap vermiyor ve istemci TCP üzerinden yeniden deniyor
  3. sunucu istemciye TCP bağlantısı açar (aptal, NAT sayıyorsanız, kim bilir?)
  4. müşteri bir şekilde (?) 'Sorgulanır' sorgusu verilen sorgu TCP üzerinden çalıştırılmalı, böylece ilk sırada UDP ile uğraşmaz
  5. DNS pixies, gerektiğinde UDP'yi sihirli bir şekilde TCP'ye çevirir

Cevap için internetin her yerini aradım, ancak çok fazla gürültü var (yukarıya bakın) ve bunun için uygun bir Google sorgusu yazamıyorum (ya da bununla ilgili bilgileri RFC'lerde bulamıyorum) .


1
Tek bulabildiğim RFC5966’daydı: "Bir çözümleyici önce bir UDP sorgusu göndermelidir, ancak UDP üzerinden (EDNS0'la veya EDNS0 olmadan) yanıtın kesilmesini beklemek için iyi bir nedeni varsa, bir TCP sorgusu göndermeyi seçebilir. veya özellikle operasyonel nedenlerden ötürü, özellikle sunucuya açık bir TCP bağlantısı varsa. " Çözümleyici ne zaman cevabın kesileceğini "beklemeli" olmalıdır?
StanTastic

6
Açık bir örnek, aynı kayıt için önceki bir talebin bir UDP datagramına sığmayacak kadar uzun olması durumunda olacaktır.
David Schwartz

1
Yani 'kesik' yazan bir kod var, değil mi? Ve sonra değişir - temelde düşündüğüm en açık çözümdür.
StanTastic

1
Sorgu birden fazla "soru" içeriyorsa (çözümlenecek adresler) durum (d) akıllıca bir seçim olabilir. 100 adres çözmeniz gerekiyorsa, yanıtı tek bir UDP paketine sığdıramazsınız.
MSalters

1
1.ve 4.her ikisi de kabaca doğrudur (ikisinden hangisi şartlara bağlıdır).
kasperd

Yanıtlar:


45

İstemci yanıtın çok büyük olacağını önceden bilmediğinden, sunucuyu UDP aracılığıyla sorgulayacaktır.
Sunucu UDP üzerinden yanıt verecek ve mümkün olduğu kadar içerecek ve kesilmiş başlık bitini ("TC" http://www.networksorcery.com/enp/protocol/dns.htm ) ayarlayacaktır .
İstemci daha sonra isteği TCP yoluyla tekrar gönderebilir ve tam yanıtı alabilir.

Ayrıca bakınız: https://tools.ietf.org/html/rfc5966

EDNS0 (DNS 0 için Uzatma Mekanizmaları) yokluğunda (aşağıya bakın), 512 bayt sınırını aşacak bir UDP yanıtı göndermek isteyen herhangi bir DNS sunucusunun normal davranışı, sunucunun yanıtı kesecek şekilde kesmesidir. bu limit dahilinde ve daha sonra TC bayrağını cevap başlığında ayarlayın. Müşteri böyle bir yanıt aldığında, TC bayrağını TCP yerine yeniden denemesi gerektiğini gösteren bir gösterge olarak alır.

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

Ve yorumlarda da belirtildiği gibi, tabii ki DNS bölge transferleri her zaman TCP kullanıyor.


2
RFC 5966 ayrıca TCP'nin daima bölge transferleri için kullanıldığını da not eder .
Matt Nordhoff

@MattNordhoff Doğru, bu doğru ve söylemesi güzel. Bu daha çok 'UDP'den TCP'ye geçiş nasıl çalışıyor?' Hedefine yönelikti. açı. Ama cevabı ben ekleyeceğim.
faker

Ancak, zaten bir TCP bağlantısı varsa, sadece TCP kullanacaktır
Jim B

Vay ilginçmiş. Peki ne zaman UDP'ye geri döner?
StanTastic

@JimB Bundan emin misin? Sürekli bir TCP bağlantısını açık tuttuğunu sanmıyorum.
Barmar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.