Chromium이 1 분 이상 DNS를 캐시하지 않는 이유는 무엇입니까? 설정에 따르면이 도메인은 다시 26151

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 데이터가 만료 될 때까지 어떻게 강제로 DNS 데이터를 캐시하도록 할 수 있습니까?



답변

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   }


답변