Chromium / Chrome ไม่ได้แคช DNS ร้องขอมากกว่าหนึ่งนาที
น่าสนใจพอจากบั๊กโครเมี่ยม - ฉบับที่ 164026 - DNS TTL ไม่ได้รับเกียรติตั้งแต่ 21 เมษายน 2011
แคช DNS เดียวในระบบอยู่ในโครเมียมและไม่เป็นไปตาม TTL เราต้องแก้ไขโครเมียมและ / หรือเพิ่มแคชระดับกลางที่จัดการกับ TTL ได้อย่างถูกต้อง
คำตอบในตั๋ว 4 ธันวาคม 2012:
HostCache ในปัจจุบันถือว่า TTL = 60s สำหรับผลลัพธ์ที่เป็นบวกทั้งหมด ด้วยตัวแก้ไข DNS แบบอะซิงโครนัสเราวางแผนที่จะใช้ TTL = สูงสุด (60s, server_reported_ttl) เช่นอย่างน้อย 60 วินาที เหตุผลคือการปรับปรุงประสิทธิภาพแคช (เมื่อ CDN NS ให้ TTL = 10-20s และใช้เวลา 30 วินาทีในการดึงข้อมูลย่อยทั้งหมดเรามักจะต้องค้นหาชื่อโฮสต์เดียวกันอีกครั้งระหว่างการโหลดหน้าเว็บหนึ่งครั้ง)
บัตรเข้าชมจะปิดในวันที่ 10 ตุลาคม 2556 โดยเป็น:
Chrome บน CrOS ใช้ตัวแก้ไข DNS แบบอะซิงโครนัสซึ่งให้เกียรติ TTL = สูงสุด (60s,> server_reported_ttl)
ฉันปิดนี่เป็น WontFix (ล้าสมัย / ทำงานตามที่ตั้งใจ)
นี่เป็นปัญหาที่ทราบมานานหลายปี ตัวแก้ไข DNS ภายในจะไม่สนใจระเบียน TTL ของ DNS และจะแคชคำขอ DNS เป็นเวลา 1 นาทีเท่านั้น
ผู้ใช้ได้รับการร้องขอมานานหลายปีมีคุณสมบัติในการเปลี่ยนพฤติกรรมเริ่มต้นนั้นและ Google ไม่เคยสร้างขึ้นมา
ก่อนหน้านี้คุณสามารถปิดการใช้งานตัวแก้ไข DNS ภายในได้ในchrome://flags
ปัจจุบันที่ไม่สามารถใช้งานได้อีกต่อไป
ดังนั้นการสรุปมันเป็นคุณสมบัติเช่นทำโดยการออกแบบ
(ตอนแรกฉันเขียนมันไม่สามารถเปลี่ยนแปลงได้ซึ่งไม่เห็นได้ชัดว่าไม่เป็นความจริงคนที่ตั้งใจจริง ๆ สามารถทำการคอมไพล์ Chromium หรือแฮ็ก Chrome ได้อีกครั้ง)
ดังนั้นในฐานะ adenda: มีหลักฐานมากมายที่บันทึกไว้ในเอกสารวิศวกรของ Google ไม่ได้ตั้งใจที่จะเคารพ TTL เริ่มต้นในคำตอบ DNS ที่ได้รับใน Chrome / ium
จากการแคชเชิงลบของการค้นหา DNS (DNS NCACHE)
เช่นเดียวกับแคชตอบสนองเชิงบวกมันเป็นเรื่องที่สมเหตุสมผลที่ตัวแก้ไขจะ จำกัด ระยะเวลาที่แคชจะตอบสนองเชิงลบ ...
แม้ว่าตัวแปลความหมายอาจ / ควรกำหนดขีด จำกัด สูงสุดสำหรับการแคชคำตอบ DNS แต่การ จำกัด 1 นาทีใน Google Chrome อาจต่ำเกินไป
ป.ล. ฉันค้นพบคำตอบสำหรับสิ่งที่หลอกฉันมานานหลายปีแล้วในขณะที่ดึงข้อมูลสถิติของ 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 }