Chromium / Chromeは、実際には1分以上DNS要求をキャッシュしません。
興味深いことに、バグ-クロムから-問題164026-DNS TTLが2011年4月21日から尊重されない
システム内の唯一のDNSキャッシュはchromeにあり、TTLを尊重しません。クロムを修正するか、TTLを正しく処理する中間キャッシュを追加する必要があります。
2012年12月4日のチケットの回答:
HostCacheは現在、すべての肯定的な結果についてTTL = 60sを想定しています。非同期DNSリゾルバーでは、TTL = max(60s、server_reported_ttl)、つまり少なくとも60秒を使用する予定です。その理由は、キャッシュのパフォーマンスを向上させることです。(CDN NSがTTL = 10-20sを提供し、すべてのサブリソースをフェッチするのに30s +を要する場合、1ページのロード中に同じホスト名を再クエリする必要がしばしばあります。)
チケットは2013年10月10日に閉鎖されました:
CrOS上のChromeは、TTL = max(60s、> server_reported_ttl)を尊重する非同期DNSリゾルバーを使用します
これをWontFixとして閉じます(意図したとおりに廃止/動作します)。
これは既知の問題でした。内部DNSリゾルバーはDNSレコードのTTLを無視し、1分間だけDNS要求をキャッシュします。
ユーザーは長年、そのデフォルトの動作を変更する機能を要求してきましたが、Googleはこれを作成しませんでした。
以前は、内部DNSリゾルバを無効にすることができましたがchrome://flags
、現在は機能的に公開されていません。
それを要約すると、それは機能です。例えば、設計によってそれを行います。
(最初は変更できないと書きましたが、これは明らかに真実ではありません。本当に決心した人は、Chromiumを再コンパイルするか、Chromeバイナリをハッキングすることができます。)
したがって、アデンダとして:GoogleのエンジニアがChrome / iumで受信したDNS回答のデフォルトのTTLを尊重するつもりはないという文書化された証拠がたくさんあります。
DNSクエリのネガティブキャッシュから(DNS NCACHE)
肯定的な応答をキャッシュするのと同様に、リゾルバーが否定的な応答をキャッシュする期間を制限するのが賢明です...
リゾルバーがDNS回答のキャッシュに最大制限を課す/すべきであると示唆されていますが、Google Chromeの1分の制限が低すぎる可能性があります。
PS実際に、この質問に答えるためにChromeの統計情報を取得している間、長年私を悩ませてきた何かの答えを見つけました。Chrome :ランダムなDNS名を持つDNS要求:マルウェア?
PPS以下のコードから、否定的な回答がキャッシュされていないことが明らかです(TTL = 0)。
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 }