Chromium / Chrome не кэширует DNS-запросы более минуты.
Интересно, что от ошибок хрома - выпуск 164026 - DNS TTL не соблюдается с 21 апреля 2011
Единственный DNS-кеш в системе находится в Chrome и не поддерживает TTL. Нам нужно либо исправить хром и / или добавить промежуточный кеш, который правильно обрабатывает TTL.
Ответ в билете 4 декабря 2012 года:
HostCache в настоящее время принимает TTL = 60 с для всех положительных результатов. При использовании асинхронного преобразователя DNS мы планируем использовать TTL = max (60 с, server_reported_ttl), т. Е. Как минимум 60 с. Обоснованием является повышение производительности кеша. (Когда CDN NS предоставляет TTL = 10-20 с, а для извлечения всех подресурсов требуется более 30 с, нам часто приходится повторно запрашивать одно и то же имя хоста во время загрузки одной страницы.)
Билет закрыт 10 октября 2013 года как:
Chrome на CrOS использует асинхронный преобразователь DNS, который принимает TTL = max (60 с,> server_reported_ttl)
Я закрываю это как WontFix (устарел / работает как задумано).
Это была известная проблема в течение многих лет; их внутренний DNS-распознаватель игнорирует TTL DNS-записей и кэширует DNS-запросы только в течение 1 минуты.
Пользователи годами запрашивали возможность изменить это поведение по умолчанию, и Google так и не создал ее.
В прошлом вы могли отключить внутренний DNS-преобразователь, в chrome://flags
настоящее время, который больше не работает.
Подводя итог, можно сказать, что это особенность, например, она делает это по замыслу.
(Первоначально я писал, что это никогда не может быть изменено, что, очевидно, не соответствует действительности. Действительно решительный человек может либо перекомпилировать Chromium, либо взломать двоичные файлы Chrome.).
Итак, в качестве дополнения: существует множество документально подтвержденных доказательств, что инженеры Google не намерены соблюдать TTL по умолчанию в полученных ответах DNS в Chrome / ium.
От отрицательного кеширования DNS-запросов (DNS NCACHE)
Как и в случае кеширования положительных ответов, для резольвера целесообразно ограничить продолжительность кеширования отрицательного ответа ...
Хотя подразумевается, что распознаватель может / должен наложить максимальный лимит на кэширование ответа DNS, 1-минутный лимит в Google Chrome может быть слишком низким.
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 }