Chromium / Chrome은 실제로 1 분 이상 DNS 요청을 캐시하지 않습니다.
흥미롭게도 버그-크롬-문제 164026-DNS TTL이 2011 년 4 월 21 일부터 인정되지 않음
시스템의 유일한 DNS 캐시는 크롬이며 TTL을 준수하지 않습니다. Chrome을 수정하거나 TTL을 올바르게 처리하는 중간 캐시를 추가해야합니다.
2012 년 12 월 4 일 티켓 답변 :
HostCache는 현재 모든 긍정적 결과에 대해 TTL = 60을 가정합니다. 비동기 DNS 리졸버를 사용하여 TTL = max (60s, server_reported_ttl), 즉 최소 60 초를 사용할 계획입니다. 이론적 근거는 캐시 성능을 향상시키는 것입니다. 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은이를 만들지 않았습니다.
과거 chrome://flags
에는에서 기능적으로 더 이상 노출되지 않는 내부 DNS 확인자를 비활성화 할 수있었습니다 .
요약하자면, 기능입니다. 예를 들어 의도적으로 기능입니다.
(처음에는 절대로 변경 될 수 없다고 썼습니다. 사실은 아닙니다. 정말로 결정된 사람은 Chromium을 다시 컴파일하거나 Chrome 바이너리를 해킹 할 수 있습니다.).
그래서, adenda과 같이 많은이 문서화 된 증거 구글 엔지니어가 크롬 / IUM에서받은 DNS 응답의 기본 TTL을 존중하려고하지 않습니다.
에서 DNS 쿼리의 네거티브 캐싱 (DNS NCACHE)
긍정적 인 응답을 캐싱하는 것처럼 리졸버가 부정적인 응답을 캐시하는 시간을 제한하는 것이 합리적입니다 ...
리졸버가 DNS 응답 캐싱에 최대 한도를 부과 할 수 있음을 암시하지만 Chrome의 1 분 한도는 너무 낮을 수 있습니다.
추신 : 나는 실제로이 질문에 대답하기 위해 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 }