เหตุใด 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 ไม่ยึดติดกับการตั้งค่า DNS ของโดเมน ฉันจะบังคับให้แคชข้อมูล DNS จนกว่าจะหมดอายุได้อย่างไร


4
"... โดเมนนี้ควรถูกแคชอีก 26151 วินาที ... " - ไม่โดเมนอาจถูกแคชเป็นเวลา 26151 วินาที การแคช DNS นั้นไม่จำเป็น
marcelm

คำตอบ:


33

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   }

4
น่าสนใจสำหรับฉันโครเมี่ยมกำลังแคชการค้นหา DNS ตาม TTL สำหรับบางโดเมนเช่นโดเมนนี้dougblack.ioดังนั้นบางทีกฎเต็มอาจซับซ้อนกว่าเล็กน้อย แต่ 99 จากหนึ่งร้อยโดเมนนั้นมีพฤติกรรมตามที่คุณได้อธิบายไว้
the_velour_fog

2
Chrome ทำการร้องขอ DNS ที่ดูสุ่มเพื่อตรวจสอบว่าอยู่ในเครือข่ายที่ร้องขอ DNS ทั้งหมดหรือไม่ (เช่นจุดเชื่อมต่อไร้สายที่ต้องชำระเงิน) นอกจากนี้ฉันคิดว่าค่า "หมดเวลา" ที่คุณกำลังดูในการกำหนดค่าคือการหมดเวลา 1 วินาทีสำหรับเซิร์ฟเวอร์ DNS ที่จะตอบสนองไม่ใช่ TTL 1 นาที
duskwuff

5
เป็นเรื่องน่าเศร้าที่โครเมียมทำแคช DNS อยู่เลย เมื่อใดก็ตามที่ฉันทำการเปลี่ยนแปลงอย่างรวดเร็วใน NS ของฉันและล้างแคช dns ฉันจะต้องจำไว้เสมอว่าโครเมี่ยมทำด้วยตัวเองเช่นกัน
Ole K

1
@OleK: ใช่ฉันไม่รู้ว่า Chrome มีแคช DNS ของตัวเองด้วย ขอขอบคุณที่หน้านี้ได้ชี้ให้เห็นนี้ ...
Mehrdad

2
@OleK - ฉันเห็นด้วย แต่ในเวลาเดียวกันฉันสามารถดูว่าสั้น ๆ ... พูด, 60 วินาทีหรือมากกว่านั้น :) แคชเป็นความคิดที่ดี dns และอื่น ๆ ให้ใช้งานได้
ivanivan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.