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