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


27

Chromiumを使用していますが、DNSがキャッシュされないという問題があります。example.comドメインを取得します。DNS設定によると、このドメインはさらに26151秒間キャッシュされるはずです。

$ dig example.com

;; ANSWER SECTION:
example.com.        26151   IN  A   93.184.216.34

ただし、example.comをChromiumで開いてchrome:// net-internals /#dnsを開くと、IPは1分以内に忘れられます。

ここに画像の説明を入力してください

ChromiumがドメインのDNS設定のTTLに準拠していないのはなぜですか?有効期限が切れるまでDNSデータをキャッシュさせるにはどうすればよいですか?


4
「...このドメインはさらに26151秒間キャッシュされる必要があります...」 -いいえ、ドメイン 26151秒間キャッシュされる場合あります。DNSキャッシングは必須ではありません。
-marcelm

回答:


33

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   }

4
おもしろいことに、Chromeは一部のドメイン(このドメインなど)のTTLに基づいてDNSルックアップをキャッシュしているdougblack.ioため、完全なルールはもう少し複雑です。しかし、100のドメインのうち99は、説明したとおりに動作します。
-the_velour_fog

2
Chromeは、ランダムに見えるDNSリクエストを作成して、すべてのDNSリクエスト(一部の有料ワイヤレスアクセスポイントなど)をハイジャックするネットワーク上にあるかどうかを判断します。また、構成で見ている「タイムアウト」値は、1分間のTTLではなく、DNSサーバーが応答する1秒のタイムアウトであると思います。
夕暮れの

5
クロムがDNSキャッシュをまったく行わないのは悲しいことです。NSで簡単な変更を行い、DNSキャッシュをフラッシュするときはいつでも、クロムがそれを独自に行うことを常に念頭に置いておく必要があります。
オレK

1
@OleK:ええ、Chromeに独自のDNSキャッシュがあることすら知りませんでした。これを指摘してくれたこのページに感謝します
...-Mehrdad

2
@OleK-私はちょっと同意しますが、同時に... 60秒かそこらの短い場所を見ることができます:) dnsなどが働く
ivanivan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.