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 }