Skip to content

Zoom-in: DNS

Karify98·
Cover Image for Zoom-in: DNS

google.com, nhấn Enter. Máy tính không hiểu google.com — nó chỉ hiểu địa chỉ IP như 142.250.185.46. Câu hỏi đơn giản nhất lại kéo theo một chuỗi tra cứu qua nhiều server trước khi browser gửi được một byte nào.

Phóng to dần vào đó.


Layer 1 — Browser cache: hỏi gần nhất trước

Mỗi lần DNS trả về kết quả, browser lưu lại kèm theo TTL.

graph LR
    B["💻 Browser"] -->|"google.com?"| BC["📦 Browser cache"]
    BC -->|"142.250.185.46 (còn 45s)"| B
    style B fill:#1e3a5f,stroke:#3b82f6,color:#93c5fd
    style BC fill:#3b2a1a,stroke:#f59e0b,color:#fcd34d

TTL do chủ domain tự quyết định. TTL ngắn (60s) cho phép thay đổi IP nhanh. TTL dài (86400s) giảm tải cho DNS server nhưng propagation chậm hơn khi cần update.

Vấn đề còn lại: browser cache chỉ sống trong một phiên làm việc. Restart browser — cache mất. Và mỗi app, mỗi process đều phải tra riêng.

Layer 2 — OS cache: tầng dùng chung

Hệ điều hành duy trì một DNS cache cho toàn bộ process trên máy.

graph LR
    B["💻 Browser"] -->|"google.com?"| BC["📦 Browser cache\n(miss)"]
    BC -->|"không có"| OS["🖥️ OS DNS cache\n(systemd-resolved / mDNSResponder)"]
    OS -->|"142.250.185.46"| B
    style B fill:#1e3a5f,stroke:#3b82f6,color:#93c5fd
    style BC fill:#3b2a1a,stroke:#f59e0b,color:#fcd34d
    style OS fill:#3b2a1a,stroke:#f59e0b,color:#fcd34d

Trên Linux, systemd-resolved quản lý cache này. Trên macOS là mDNSResponder. File /etc/hosts được kiểm tra tại đây — và nó có độ ưu tiên cao hơn mọi DNS server. Đây là lý do tại sao thêm 127.0.0.1 myapp.local vào /etc/hosts hoạt động ngay lập tức.

Vấn đề còn lại: OS cache cũng có thể miss. Lúc đó cần hỏi ra ngoài — nhưng hỏi ai?

Layer 3 — Recursive resolver: người hỏi thay

Khi cache local miss, OS gửi query đến một recursive resolver — thường là DNS của ISP, hoặc 8.8.8.8 (Google), 1.1.1.1 (Cloudflare).

graph LR
    OS["🖥️ OS"] -->|"google.com?"| R["🔄 Recursive resolver\n8.8.8.8"]
    R -->|"cache hit → 142.250.185.46"| OS
    style OS fill:#1e3a5f,stroke:#3b82f6,color:#93c5fd
    style R fill:#3b2a1a,stroke:#f59e0b,color:#fcd34d

Recursive resolver là "người đi hỏi thay" — nó cache kết quả cho hàng triệu client. Nếu có người khác đã hỏi google.com trong vòng TTL, resolver trả ngay từ cache mà không cần hỏi thêm.

Vấn đề còn lại: recursive resolver cũng có thể không biết. Lúc đó nó phải tự đi tìm — từ đầu.

Layer 4 — Hệ thống phân giải: hỏi từ gốc xuống

Khi recursive resolver không có cache, nó thực hiện một chuỗi tra cứu theo cấu trúc cây của DNS.

sequenceDiagram
    participant R as Recursive Resolver
    participant Root as 🌐 Root Nameserver
    participant TLD as 📂 TLD Nameserver (.com)
    participant Auth as 📋 Authoritative NS (google.com)

    R->>Root: ai quản lý .com?
    Root-->>R: TLD nameserver: a.gtld-servers.net

    R->>TLD: ai quản lý google.com?
    TLD-->>R: ns1.google.com, ns2.google.com

    R->>Auth: google.com → IP?
    Auth-->>R: 142.250.185.46 (TTL: 300s)

    R-->>R: cache lại 300s

Ba bước — ba server khác nhau:

  • Root nameserver (13 cụm, vận hành bởi ICANN và các tổ chức lớn): biết ai quản lý từng TLD (.com, .vn, .io...)
  • TLD nameserver (Verisign cho .com): biết ai quản lý từng domain trong TLD đó
  • Authoritative nameserver (do chủ domain cấu hình, thường là Cloudflare, Route 53...): biết IP cuối cùng

Sau bước này, resolver cache kết quả theo TTL. Mọi client hỏi sau đó đều nhận ngay từ cache.


Full picture

sequenceDiagram
    participant B as Browser
    participant BC as Browser Cache
    participant OS as OS Cache + /etc/hosts
    participant R as Recursive Resolver
    participant Root as Root NS
    participant TLD as TLD NS
    participant Auth as Authoritative NS

    B->>BC: google.com?
    BC-->>B: miss

    B->>OS: google.com?
    OS-->>B: miss

    B->>R: google.com?

    alt Cache hit ở resolver
        R-->>B: 142.250.185.46
    else Cache miss
        R->>Root: .com ở đâu?
        Root-->>R: a.gtld-servers.net
        R->>TLD: google.com ở đâu?
        TLD-->>R: ns1.google.com
        R->>Auth: google.com → IP?
        Auth-->>R: 142.250.185.46 (TTL 300s)
        R-->>B: 142.250.185.46
    end

    Note over B,Auth: Browser cache lại theo TTL

Takeaway

DNS là cây phân cấp, không phải bảng tra cứu phẳng. Mỗi tầng cache theo TTL riêng — từ browser đến OS đến resolver. Khi deploy thay đổi DNS, propagation chậm vì mỗi tầng cache phải hết hạn theo TTL của nó, không phải TTL của bản ghi mới.

Khi debug DNS, thứ tự kiểm tra: /etc/hostsdig @1.1.1.1 (bypass resolver của ISP) → dig +trace (đi từ root xuống). Mỗi bước loại trừ một tầng cache.


Bài viết được hỗ trợ bởi Amy 🌸 - AI Assistant. Nội dung đã được kiểm duyệt bởi tác giả.

Related Posts