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を開くと、1分でIPを忘れてしまいます!
ChromiumがドメインDNSによって設定されたTTLに準拠していないのはなぜですか? DNSデータが期限切れになるまで強制的にキャッシュするようにするにはどうすればよいですか?
答え1
Chromium / Chromeは1分以上DNS要求をキャッシュしません。
興味深いことに、bugs-chromium - 問題164026 - 2011年4月21日以降、DNS TTLはサポートされていません。
システムの唯一のDNSキャッシュはChromeにあり、TTLをサポートしていません。 Chromeを変更するか、TTLを正しく処理するための中間キャッシュを追加する必要があります。
2012年12月4日チケットの回答:
HostCacheは現在、すべての肯定的な結果に対してTTL = 60秒を仮定しています。非同期DNSリゾルバーの場合は、少なくとも60秒のTTL = max(60s、server_reported_ttl)を使用する予定です。基本原則は、キャッシュのパフォーマンスを向上させることです。 (CDN NSがTTL = 10-20秒を提供している場合は、すべてのサブリソースを取得するのに30秒以上かかり、ページの読み込み中に同じホスト名を再クエリする必要があります。)
チケット締め切り: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回答キャッシュに最大制限を適用できるか、または適用する必要があることを示唆していますが、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 }