Чому Chromium не кешує DNS більше хвилини?


27

Я використовую Chromium і у мене проблеми з тим, що DNS не кешується протягом того часу, який я би очікував. Візьміть домен example.com. Відповідно до налаштувань DNS, цей домен слід кешувати ще 26151 секунди:

$ dig example.com

;; ANSWER SECTION:
example.com.        26151   IN  A   93.184.216.34

Однак, коли я відкриваю example.com у Chromium і відкриваю chrome: // net-Internals / # dns, то IP забувається протягом хвилини!

введіть тут опис зображення

Чому Chromium не дотримується TTL налаштування DNS домену? Як я можу змусити її кешувати дані DNS, поки вони не закінчуються?


4
"... цей домен слід кешувати ще 26151 секунд ..." - Ні, домен може бути кешований протягом 26151 секунд. Кешування DNS не є обов'язковим.
marcelm

Відповіді:


33

Хром / Chrome не кешує запити DNS більше хвилини.

Цікаво, що від помилок-хрому - випуск 164026 - DNS TTL не вшановувались з 21 квітня 2011 року

Єдиний кеш-пам'ять DNS в системі знаходиться в хромі, і він не шанує TTL. Нам потрібно або виправити хром і / або додати проміжний кеш, який правильно обробляє TTL.

Відповідь у квитку на 4 грудня 2012 року:

В даний час HostCache передбачає TTL = 60s для всіх позитивних результатів. За допомогою асинхронного DNS-резолютора ми плануємо використовувати TTL = max (60s, server_reported_ttl), тобто принаймні 60s. Обґрунтуванням є підвищення продуктивності кешу. (Коли CDN NS забезпечує TTL = 10-20s, а для отримання всіх субресурсів потрібно 30s +, нам часто доводиться повторно запитувати те саме ім’я хоста під час завантаження однієї сторінки.)

Квиток закритий 10 жовтня 2013 року:

Chrome on CrOS використовує асинхронний DNS-роздільник, який шанує TTL = max (60s,> 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   }

4
Цікаво, що для мене хром кешує пошук DNS на основі TTL для деяких доменів, наприклад, цей домен, dougblack.ioтому, можливо, повні правила трохи складніші. але 99 із ста доменів поводяться так, як ви описали.
the_velour_fog

2
Chrome робить випадкові запити DNS, щоб визначити, чи є в мережі, яка викрадає всі запити DNS (як-от деякі платні точки бездротового доступу). Крім того, я думаю, що значення "timeout", яке ви дивитеся в конфігурації, - це 1-секундний час очікування для відповіді серверів DNS, а не 1-хвилинний TTL.
сутінки

5
Сумно, що хром взагалі робить кеш-пам'ять dns. Щоразу, коли я роблю швидкі зміни на моєму NS і змиваю кеш-пам'ять dns, я завжди маю на увазі, що хром робить це також своїми силами.
Оле K

1
@OleK: Так, я поняття не мав, навіть у Chrome є власний кеш DNS. Завдяки цій сторінці, що вказав на це ...
Мехрдад

2
@OleK - Я якось погоджуюся, але в той же час я бачу, де короткий ... скажімо, 60 секунд або близько :), кеш - це гарна ідея (щоб трохи заощадити мережевий трафік) і все ще дозволяє такі речі, як кругла робота dns тощо працювати
ivanivan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.