Chromium neden DNS’yi bir dakikadan fazla önbelleğe almıyor?


27

Chromium kullanıyorum ve DNS'in beklediğim süre boyunca önbelleğe alınmamasıyla ilgili sorun yaşıyorum. Example.com alan adını alın. DNS ayarlarına göre, bu etki alanı 26151 saniye daha önbelleğe alınmalıdır:

$ dig example.com

;; ANSWER SECTION:
example.com.        26151   IN  A   93.184.216.34

Ancak example.com'u Chromium'da açtığımda ve chrome: // net-internals / # dns dosyasını açtığımda IP bir dakika içinde unutulur!

görüntü tanımını buraya girin

Chromium neden etki alanının DNS ayarının TTL'sine uygun değil? DNS verilerini süresi doluncaya kadar önbelleğe almaya nasıl zorlayabilirim?


4
"... Bu alan adı ... Başka 26151 saniye önbelleğe alınması gerektiği" - Hayır, alan edebilir 26151 saniye önbelleğe alınması. DNS önbelleklemesi zorunlu değildir.
marcelm

Yanıtlar:


33

Chromium / Chrome, DNS isteklerini gerçekten bir dakikadan fazla önbelleğe almaz.

İlginç bir şekilde, bug-chromium'dan - Sayı 164026 - DNS TTL 21 Nis 2011'den onur duyulmadı

Sistemdeki tek DNS önbelleği kromdur ve TTL'yi onurlandırmaz. Kromu düzeltmemiz ve / veya TTL'yi doğru şekilde işleyen bir ara önbellek eklememiz gerekiyor.

4 Aralık 2012 biletindeki cevap:

HostCache şu anda tüm pozitif sonuçlar için TTL = 60s olduğunu varsaymaktadır. Eşzamansız DNS çözümleyicisiyle, TTL = max (60s, server_reported_ttl), yani en az 60s kullanmayı planlıyoruz. Gerekçe, önbellek performansını arttırmaktır. (Bir CDN NS, TTL = 10-20s sağladığında ve tüm alt kaynakların getirilmesi 30s + alırsa, genellikle bir sayfa yüklenirken aynı ana bilgisayar adını yeniden sorgulamamız gerekir.)

Bilet 10 Ekim 2013'te şu şekilde kapandı:

CrOS'taki Chrome, TTL = max (60s,> server_reported_ttl) adlı bir eşzamansız DNS çözücü kullanır

Bunu WontFix olarak kapatıyorum (eski / amaçlandığı gibi çalışıyor).

Bu yıllardır bilinen bir sorun olmuştur; iç DNS çözümleyicileri, DNS kayıtlarının TTL'sini dikkate almaz ve yalnızca DNS isteklerini 1 dakika önbelleğe alır.

Kullanıcılar yıllardır talep ediyor, bu varsayılan davranışı değiştirme özelliği ve Google hiçbir zaman bir tane oluşturmadı.

Geçmişte, içsel DNS çözümleyicisini devre dışı bırakabilirsiniz chrome://flags, günümüzde işlevsel olarak artık kullanılmamaktadır.

Özetle, bir özelliktir, örneğin bunu tasarım olarak yapar.

(Başlangıçta asla değiştirilemediğini yazdım, ki bu kesinlikle doğru değildir. Gerçekten kararlı bir kişi Chromium'u yeniden derleyebilir veya Chrome ikili dosyalarını kesebilir.)

Yani, bir adenda olarak: bol belgelenmiş kanıt Google mühendisleri Krom / ium alınan DNS cevapları varsayılan TTL saygı niyetinde değiliz.

Gönderen DNS Sorgularını Negatif Caching (DNS NCACHE)

Olumlu yanıtları önbelleğe almak gibi, bir çözücünün olumsuz bir yanıtı ne kadar süre önleyeceğini sınırlaması da mantıklıdır.

Çözümleyici, DNS yanıtını önbelleğe almak için maksimum bir sınır getirebilir / getirmelidir, ancak Google Chrome'daki 1 dakikalık limit çok düşük olabilir.

PS Bu soruyu cevaplamak için Chrome istatistiklerini alırken yıllardır beni rahatsız eden bir şeyin cevabını gerçekten keşfettim: Chrome: Rastgele DNS adlarına sahip DNS istekleri: malware?

PPS Aşağıdaki koddan anlaşılacağı gibi olumsuz cevaplar önbelleğe alınmamış (TTL = 0).

Gönderen https://chromium.googlesource.com/chromium/src/net/dns/host_resolver_impl.cc

  99 // Default TTL for successful resolutions with ProcTask.
 100 const unsigned kCacheEntryTTLSeconds = 60;
 101 
 102 // Default TTL for unsuccessful resolutions with ProcTask.
 103 const unsigned kNegativeCacheEntryTTLSeconds = 0;
 104 
 105 // Minimum TTL for successful resolutions with DnsTask.
 106 const unsigned kMinimumTTLSeconds = kCacheEntryTTLSeconds;

1518   // Called by ProcTask when it completes.
1519   void OnProcTaskComplete(base::TimeTicks start_time,
1520                           int net_error,
1521                           const AddressList& addr_list) {
1522     DCHECK(is_proc_running());
1523 
1524     if (dns_task_error_ != OK) {
1525       base::TimeDelta duration = base::TimeTicks::Now() - start_time;
1526       if (net_error == OK) {
1527         UMA_HISTOGRAM_LONG_TIMES_100("AsyncDNS.FallbackSuccess", duration);
1528         if ((dns_task_error_ == ERR_NAME_NOT_RESOLVED) &&
1529             ResemblesNetBIOSName(key_.hostname)) {
1530           UmaAsyncDnsResolveStatus(RESOLVE_STATUS_SUSPECT_NETBIOS);
1531         } else {
1532           UmaAsyncDnsResolveStatus(RESOLVE_STATUS_PROC_SUCCESS);
1533         }
1534         base::UmaHistogramSparse("Net.DNS.DnsTask.Errors",
1535                                  std::abs(dns_task_error_));
1536         resolver_->OnDnsTaskResolve(dns_task_error_);
1537       } else {
1538         UMA_HISTOGRAM_LONG_TIMES_100("AsyncDNS.FallbackFail", duration);
1539         UmaAsyncDnsResolveStatus(RESOLVE_STATUS_FAIL);
1540       }
1541     }
1542 
1543     if (ContainsIcannNameCollisionIp(addr_list))
1544       net_error = ERR_ICANN_NAME_COLLISION;
1545 
1546     base::TimeDelta ttl =
                                              # always  0 seconds
1547         base::TimeDelta::FromSeconds(kNegativeCacheEntryTTLSeconds);
1548     if (net_error == OK)
                                              # always 60 seconds 
1549       ttl = base::TimeDelta::FromSeconds(kCacheEntryTTLSeconds);  
1550 
1551     // Source unknown because the system resolver could have gotten it from a
1552     // hosts file, its own cache, a DNS lookup or somewhere else.
1553     // Don't store the |ttl| in cache since it's not obtained from the server.
1554     CompleteRequests(
1555         MakeCacheEntry(net_error, addr_list, HostCache::Entry::SOURCE_UNKNOWN),
1556         ttl);
1557   }

4
İlginçtir ki benim için krom, bazı alanlar için TTL'ye dayalı DNS aramalarını önbelleğe alıyor, örneğin bu alan adı dougblack.iobelki de tüm kurallar biraz daha karmaşık. Ancak, yüz etki alanından 99'u, tanımladığınız gibi davranır.
the_velour_fog

2
Chrome, tüm DNS isteklerini ele geçiren bir ağda olup olmadığını (bazı ücretli kablosuz erişim noktaları gibi) belirlemek için rastgele görünen DNS istekleri yapar. Ayrıca, yapılandırmada baktığınız "zaman aşımı" değerinin, DNS sunucularının 1 dakikalık TTL'ye yanıt vermesi için 1 saniyelik bir zaman aşımı olduğunu hayal ediyorum.
duskwuff

5
Kromun bir dns önbelleği yapması üzücü. Ne zaman NS'mde hızlı bir değişiklik yapıp dns önbelleğini temizlesem de her zaman aklımda tutmalıyım. Krom da kendi başına yapar.
Ole K,

1
@OleK: Evet, Chrome'un kendi DNS önbelleğine sahip olduğu hakkında hiçbir fikrim yoktu. Bunu işaret ettiğin için bu sayfaya teşekkürler ...
Mehrdad

2
@OleK - Katılıyorum, ama aynı zamanda kısa bir süre… 60 saniye ya da öylesine nerede olduğunu görebiliyorum :), önbellek iyi bir fikir (biraz ağ trafiğini kurtarmak için) ve hala tur robin gibi şeylere izin veriyor dns, vs. çalışmak
ivanivan
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.