Chromium이 1분 이상 DNS를 캐시하지 않는 이유는 무엇입니까?

Chromium이 1분 이상 DNS를 캐시하지 않는 이유는 무엇입니까?

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 데이터가 만료될 때까지 강제로 캐시하도록 하려면 어떻게 해야 합니까?

답변1

Chromium/Chrome은 1분 이상 DNS 요청을 캐시하지 않습니다.

흥미롭게도,bugs-chromium - 문제 164026 - 2011년 4월 21일부터 DNS TTL이 지원되지 않습니다.

시스템의 유일한 DNS 캐시는 Chrome에 있으며 TTL을 지원하지 않습니다. 크롬을 수정하거나 TTL을 올바르게 처리하는 중간 캐시를 추가해야 합니다.

2012년 12월 4일 티켓의 답변:

HostCache는 현재 모든 긍정적인 결과에 대해 TTL=60초를 가정합니다. 비동기식 DNS 확인자의 경우 최소 60초인 TTL=max(60s, server_reported_ttl)를 사용할 계획입니다. 기본 원칙은 캐시 성능을 향상시키는 것입니다. (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은 그런 기능을 만든 적이 없습니다.

이전에는 에서 내부 DNS 확인자를 비활성화할 수 있었지만 chrome://flags이 기능은 더 이상 표시되지 않습니다.

전체적으로 이것은 기능입니다. 즉, 설계에 따라 구현되었습니다.

(원래는 절대 변하지 않을 것이라고 썼는데 이는 분명히 사실이 아닙니다. 정말로 결심한 사람은 Chromium을 다시 컴파일하거나 Chrome 바이너리를 해킹할 수 있습니다.)

그래서 부록으로: 많은 것들이 있습니다녹음된증거에 따르면 Google 엔지니어는 Chrome/ium에서 수신된 DNS 응답의 기본 TTL을 존중할 의도가 없습니다.

~에서DNS 쿼리의 부정 캐싱(DNS NCACHE)

긍정적인 응답을 캐싱하는 것과 마찬가지로 확인자가 부정적인 응답을 캐시하는 시간을 제한하는 것이 현명할 것입니다.

확인자가 DNS 답변 캐싱에 최대 제한을 적용할 수 있거나 적용해야 한다는 것이 암시되어 있지만 Google 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   }

관련 정보