为什么Chromium无法将DNS缓存超过一分钟?


27

我使用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!

在此处输入图片说明

为什么Chromium不遵守域的DNS设置的TTL?如何强制DNS缓存DNS数据直到过期?


4
“ ...此域应再缓存26151秒...” -否,该域可能要缓存26151秒。DNS缓存不是强制性的。
marcelm '17年

Answers:


33

Chromium / Chrome确实不会缓存DNS请求超过一分钟。

有趣的是,来自bugs-chromium-问题164026-从2011年4月21日开始不支持DNS TTL

系统中唯一的DNS缓存位于Chrome中,并且不支持TTL。我们需要修复Chrome和/或添加一个能够正确处理TTL的中间缓存。

在2012年12月4日的票中回答:

对于所有肯定的结果,HostCache当前假定TTL = 60s。对于异步DNS解析器,我们计划使用TTL = max(60s,server_reported_ttl),即至少60s。基本原理是提高缓存性能。(当CDN NS提供TTL = 10-20s,并且获取所有子资源需要30s +时,我们通常必须在一页加载期间重新查询相同的主机名。)

门票在2013年10月10日关闭,原因是:

CrOS上的Chrome使用异步DNS解析器,该解析器支持TTL = max(60s,> server_reported_ttl)

我将其作为WontFix关闭(已过时/按预期工作)。

多年来一直是一个已知问题;其内部DNS解析器将忽略DNS记录的TTL,仅将DNS请求缓存1分钟。

多年来,用户一直在要求使用一种更改默认行为的功能,而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因此完整规则可能会更复杂。但一百个域中有99个的行为与您描述的相同。
the_velour_fog's

2
Chrome浏览器发出外观随机的DNS请求,以确定它是否在劫持所有DNS请求的网络(例如某些付费无线访问点)上。另外,我想您在配置中看到的“超时”值是DNS服务器响应的1秒钟超时,而不是1分钟的TTL。
2013年

5
令人遗憾的是,铬根本没有DNS缓存。每当我在NS上进行快速更改并刷新dns缓存时,我总是要牢记chrome也要自己完成。
Ole K

1
@OleK:是的,我不知道Chrome甚至拥有自己的DNS缓存。感谢此页指出了这一点……
Mehrdad

2
@OleK-我有点同意,但是同时我可以看到短的时间,比如说60秒左右:),缓存是个好主意(以节省一些网络流量),并且仍然允许循环访问DNS等工作
ivanivan '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.