DNS — phân giải tên miền hoạt động thế nào
DNS biến tên miền thành IP qua một cây phân cấp root → TLD → authoritative, không có cơ sở dữ liệu trung tâm. Bài này giải thích recursive vs authoritative resolver, query flow từng bước, vai trò TTL & cache, và cách trace bằng dig +trace.
TL;DR: Máy định tuyến theo IP, người nhớ theo tên — DNS là hệ tra cứu biến tên thành IP. Không có database trung tâm: tên miền là một cây phân cấp — root biết các TLD (.com, .vn), TLD biết authoritative server của từng domain, authoritative giữ bản ghi thật. Trình duyệt hỏi một recursive resolver, nó đi hỏi hộ cả chuỗi root → TLD → authoritative rồi trả kết quả, cache lại theo TTL. Lần đầu tốn vài chục ms; lần sau gần như 0 nhờ cache. dig +trace cho bạn xem từng bước.
Gõ google.com, khoảng 20ms sau bạn đã có IP của nó — từ một hệ thống không có cơ sở dữ liệu trung tâm nào chứa "mọi tên miền trên đời". Hàng trăm triệu domain, thay đổi liên tục, mà tra ra trong chớp mắt. Làm sao?
Bí mật là phân cấp + cache. Bài này (đào sâu chặng DNS bạn đã gặp lướt ở Module 1) giải thích cây tên miền, ai hỏi ai, và vì sao nó vừa nhanh vừa không cần trung tâm.
1. Analogy — Hỏi đường phân cấp
Bạn tìm "phòng Kế toán, công ty X, toà nhà Y". Bạn không hỏi một "người biết tuốt". Bạn hỏi lễ tân toà nhà Y → chỉ tầng của công ty X → hỏi tiếp tân công ty X → chỉ phòng Kế toán. Mỗi cấp chỉ biết "cấp dưới kế tiếp ở đâu", không ai giữ toàn bộ bản đồ.
| Hỏi đường | DNS |
|---|---|
| Bạn (người hỏi) | Trình duyệt / stub resolver |
| Người dẫn đường đi hỏi hộ | Recursive resolver |
| Lễ tân toà nhà → chỉ tầng | Root → chỉ TLD |
| Tiếp tân công ty → chỉ phòng | TLD → chỉ authoritative |
| Phòng Kế toán trả lời | Authoritative server (bản ghi thật) |
Không ai biết hết. Mỗi cấp chỉ biết "ai phụ trách cấp dưới". Đọc tên miền từ phải sang trái chính là đi từ gốc cây xuống: www.google.com. → root (.) → .com → google.com → www.
2. Cây tên miền phân cấp
Tên miền là một cây lộn ngược, gốc ở trên:
flowchart TD
R["Root (.)<br/>biet cac TLD"] --> C["TLD .com<br/>biet authoritative .com"]
R --> V["TLD .vn"]
R --> O["TLD .org"]
C --> G["Authoritative google.com<br/>giu ban ghi that"]
C --> E["Authoritative example.com"]
G --> W["www.google.com -> IP"]- Root (ký hiệu
.): 13 nhóm root server, biết server của mọi TLD. - TLD (Top-Level Domain):
.com,.vn,.org… mỗi TLD biết authoritative server của các domain dưới nó. - Authoritative server: nơi giữ bản ghi thật của một domain (vd
google.com) — câu trả lời cuối cùng.
3. Recursive resolver vs authoritative
Hai vai trò khác nhau, dễ lẫn:
- Recursive resolver (thường của ISP, hoặc
8.8.8.8,1.1.1.1): nhận câu hỏi từ bạn rồi đi hỏi hộ cả chuỗi root → TLD → authoritative, gom kết quả trả về. Nó làm việc thay bạn. - Authoritative server: chỉ trả lời về domain nó phụ trách, không đi hỏi ai. Nó là nguồn sự thật.
Trình duyệt bạn chỉ nói chuyện với recursive resolver (qua một stub resolver nhỏ trong OS).
4. Query flow — một lần tra "nguội"
Lần đầu hỏi www.example.com (chưa cache gì):
sequenceDiagram
participant B as Trinh duyet
participant R as Recursive resolver
participant Root as Root
participant TLD as TLD .com
participant Auth as Authoritative
B->>R: www.example.com co IP nao?
R->>Root: .com o dau?
Root-->>R: hoi TLD .com (day server)
R->>TLD: example.com o dau?
TLD-->>R: hoi authoritative cua example.com
R->>Auth: www.example.com?
Auth-->>R: A record = dia chi IP
R-->>B: tra IP + cache theo TTLRecursive resolver đi từng bậc, mỗi bậc chỉ vào hơn một chút, tới authoritative thì có câu trả lời cuối (bản ghi A = IPv4). Rồi nó trả về và nhớ lại.
5. TTL & cache — vì sao lần sau nhanh
Mỗi bản ghi DNS kèm TTL (Time To Live) — số giây được phép cache. Kết quả được cache ở nhiều tầng: trình duyệt, OS, recursive resolver. Lần sau hỏi lại trong thời hạn TTL → trả ngay từ cache, không đi lại cả chuỗi → gần như 0ms.
Hệ quả thực tế là propagation: khi bạn đổi IP của domain, các nơi đang cache bản cũ vẫn dùng IP cũ tới khi TTL hết. Vì vậy trước khi chuyển server, người ta hạ TTL xuống thấp vài ngày trước, để khi cắt sang IP mới các cache hết hạn nhanh.
DNS trả về IP — chính là đầu vào cho routing ở Module 2. Bản đồ 5 chặng giờ khép kín: DNS (bài này) cho IP → routing đưa gói tới máy → port/socket vào đúng app (bài trước).
6. Tự trace bằng dig
dig +trace cho bạn xem recursive resolver đi từng bậc:
dig google.com +short # chi in IP (ket qua A record)
dig google.com +trace # in tung buoc: root -> TLD -> authoritative
+trace mô phỏng chính query flow ở trên — mỗi khối output là một bậc trong cây. Đây là cách trực quan nhất để "thấy" DNS hoạt động.
7. Pitfall — hiểu nhầm thường gặp
❌ Nhầm 1: "Có một server DNS trung tâm chứa mọi tên miền." ✅ Không hề. DNS là phân tán + phân cấp: root chỉ biết TLD, TLD chỉ biết authoritative, mỗi authoritative chỉ giữ domain của mình. Không nơi nào giữ tất cả.
❌ Nhầm 2: "Đổi DNS là có hiệu lực ngay." ✅ Còn TTL: các cache giữ bản cũ tới khi hết hạn. Đổi IP mà TTL 3600 thì có client dùng IP cũ tới một giờ. Hạ TTL trước khi chuyển.
❌ Nhầm 3: "Recursive resolver và authoritative là một." ✅ Recursive đi hỏi hộ (làm việc thay bạn); authoritative là nguồn sự thật (chỉ trả lời domain của nó, không hỏi ai). Hai vai trò tách biệt.
8. 📚 Deep Dive — tài liệu gốc
Đọc khi muốn tới gốc DNS:
- RFC 1034 — Domain Names: Concepts and Facilities — mô hình cây phân cấp, recursive/authoritative.
- RFC 1035 — Domain Names: Implementation and Specification — định dạng message, record, query.
Ghi chú: DNS cũ (1987) nhưng là một trong những hệ phân tán thành công nhất từng có — phân cấp + cache cho phép tra hàng tỉ lần/giây mà không cần trung tâm. Record types và debug ở bài kế tiếp.
9. Tóm tắt
- DNS biến tên → IP vì máy định tuyến theo IP còn người nhớ theo tên.
- Tên miền là cây phân cấp: root → TLD (
.com) → authoritative (giữ bản ghi thật). Không có database trung tâm. - Recursive resolver đi hỏi hộ cả chuỗi; authoritative chỉ trả lời domain của mình. Trình duyệt chỉ nói với recursive (qua stub resolver).
- Query flow nguội: resolver hỏi root → TLD → authoritative, nhận A record (IP), trả về và cache theo TTL.
- TTL/cache khiến lần sau ~0ms nhưng gây propagation khi đổi DNS — hạ TTL trước khi chuyển server.
dig +tracecho xem từng bậc trong cây phân cấp — cách trực quan nhất để "thấy" DNS hoạt động.
10. Tự kiểm tra
Q1DNS không có cơ sở dữ liệu trung tâm, vậy làm sao tra được IP của bất kỳ domain nào?▸
Q2Phân biệt recursive resolver và authoritative server theo vai trò.▸
Q3Mô tả các bước một recursive resolver tra www.example.com khi chưa có cache.▸
- Hỏi root ".com ở đâu?" → root chỉ tới server TLD .com.
- Hỏi TLD .com "example.com ở đâu?" → chỉ tới authoritative của example.com.
- Hỏi authoritative "www.example.com?" → trả về A record (địa chỉ IP).
- Resolver trả IP cho trình duyệt và cache theo TTL.
Mỗi bậc chỉ "vào sâu" thêm một mức cho tới khi tới nguồn sự thật.
Q4Vì sao đổi IP của một domain không có hiệu lực ngay với mọi người dùng?▸
Q5Liên hệ: kết quả của DNS nối vào Module 2 (routing) thế nào?▸
Q6Trình duyệt không tự đi hỏi root → TLD → authoritative mà nói chuyện với một stub resolver và một recursive resolver. Vai trò mỗi cái là gì, và vì sao tách như vậy?▸
8.8.8.8) mới thực sự đi hỏi hộ root → TLD → authoritative và cache kết quả theo TTL. Tách như vậy để máy client gọn nhẹ (chỉ cần biết hỏi ai), còn phần việc nặng và cache dùng chung được tập trung ở recursive resolver — nhiều client chia sẻ một cache nên hiệu quả hơn nhiều so với mỗi máy tự tra từ đầu.Bài tiếp theo: DNS record types & debug — A, CNAME, MX và dig
Bài này có giúp bạn hiểu bản chất không?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên