Zoom-in: DNS

Gõ 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.
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.
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.
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/hosts → dig @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
Zoom-in: TCP
Mọi HTTP request đều đi trên TCP — nhưng trước khi byte đầu tiên của dữ liệu đi qua, đã có 3 gói tin trao đổi mà không mang dữ liệu nào. TCP giải quyết vấn đề mà Internet không giải quyết được.
Zoom-in: Load Balancer
Một domain, hàng triệu request mỗi ngày. Load balancer không chỉ phân phối traffic — nó là điểm quyết định routing, health check, và session management cho toàn bộ hệ thống.
Zoom-in: HTTP
Mọi ứng dụng web đều bắt đầu từ một mô hình đơn giản: client hỏi, server trả lời. HTTP là ngôn ngữ của cuộc hội thoại đó.