Chromiumが1分以上DNSをキャッシュしないのはなぜですか?

Chromiumが1分以上DNSをキャッシュしないのはなぜですか?

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クエリの不正キャッシュ(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   }

関連情報