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 }