私はChromiumを使用しており、DNSが予期した時間キャッシュされないという問題があります。 example.comドメインを取ります。 DNS設定によると、このドメインはさらに26151秒間キャッシュされる必要があります。
$ Dig example.com
;; ANSWER SECTION:
example.com. 26151 IN A 93.184.216.34
ただし、Chromiumでexample.comを開いてchrome:// net-internals /#dnsを開くと、IPは1分以内に忘れられます。
ChromiumがドメインのDNS設定のTTL=)に準拠しないのはなぜですか?期限切れになるまでDNSデータをキャッシュするように強制するにはどうすればよいですか?
実際、Chromium/ChromeはDNSリクエストを1分以上キャッシュしません。
興味深いことに、 bugs-chromiumから-問題164026-DNS TTL 2011年4月21日以降は認められない
システム内の唯一のDNSキャッシュはchromeにあり、TTLを尊重していません。chromeを修正するか、中間キャッシュを追加する必要があります。ハンドルTTL正しく。
2012年12月4日チケットの回答:
HostCacheは現在、すべての肯定的な結果に対してTTL = 60秒を想定しています。非同期DNSリゾルバーでは、TTL = max(60s、server_reported_ttl)、つまり少なくとも60sを使用する予定です。理論的根拠は、キャッシュのパフォーマンスを向上させることです。 (CDN NSはTTL = 10-20sを提供し、すべてのサブリソースをフェッチするために30秒以上かかる場合、1つのページのロード中に同じホスト名を再クエリする必要があることがよくあります。)
チケットは2013年10月10日に次のように終了しました:
Chrome on CrOSは、TTL = max(60s、> server_reported_ttl)を尊重する非同期DNSリゾルバーを使用します
私はこれをWontFixとしてクローズします(廃止/意図したとおりに機能します)。
これは何年もの間既知の問題でした。内部DNSリゾルバーはDNSレコードのTTL=を無視し、1分間のみDNSリクエストをキャッシュします。
ユーザーは何年もの間、デフォルトの動作を変更する機能を要求してきましたが、Googleがこれを作成したことはありません。
以前は、chrome://flags
で内部DNSリゾルバーを無効にすることができましたが、現在では機能的に公開されていません。
要約すると、それは機能です。これは、仕様によるものです。
(私は最初にそれを変更することはできなかったと書いたが、それは明らかに真実ではない。本当に決心した人はChromiumを再コンパイルするか、Chrome binaries。)をハックできる。).
したがって、アデンダとして:文書化された証拠がたくさんありますGoogleのエンジニアはデフォルトのTTL Chrome/iumでDNS回答を受け取りました。
From DNSクエリのネガティブキャッシング(DNS NCACHE)
肯定的な応答のキャッシュと同様に、リゾルバーが否定的な応答をキャッシュする期間を制限するのが賢明です...
リゾルバーはDNS回答のキャッシュに最大制限を課す可能性がありますが、Googleの1分の制限は、Chromeが低すぎる可能性があります。
追伸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 }