DNS 的層次架構
DNS 是樹狀的分散式系統:
根域(.)
├── .com
│ ├── example.com ← authoritative DNS server
│ │ ├── api.example.com
│ │ └── www.example.com
│ └── google.com
└── .tw
└── ...
遞迴查詢的過程
當你輸入 api.example.com,你的電腦的 DNS resolver 要解析它:
你的電腦
↓ 詢問本機 DNS cache / /etc/hosts
↓ 沒有 → 問 recursive resolver(通常是你的 ISP 或 8.8.8.8)
Recursive Resolver
↓ 詢問 Root Name Server(知道所有 TLD 的位置)
→ Root: ".com 的 TLD server 在 192.5.6.30"
↓ 詢問 .com TLD Server
→ TLD: "example.com 的 authoritative NS 在 ns1.example.com (203.0.113.1)"
↓ 詢問 ns1.example.com(authoritative server)
→ "api.example.com 的 A record 是 93.184.216.34"
Recursive Resolver 把結果快取,返回給你的電腦
這個過程在 cache 都是 cold 的時候可能需要 20-200ms,但大多數情況 resolver 有 cache,所以幾毫秒就解析完了。
TTL(Time to Live):每個 DNS record 都有保鮮期
Authoritative DNS server 在每個 record 上設定 TTL(秒)。Resolver 快取這個 record,直到 TTL 過期才重新查詢。
api.example.com. 3600 IN A 93.184.216.34
↑
TTL(這個 record 快取 3600 秒 = 1 小時)
為什麼改了 DNS 不立刻生效:
- 你在 authoritative DNS 改了 A record 指向新 IP
- 但所有曾經解析過這個域名的 resolver 都在快取舊的 record,直到 TTL 過期
如果 TTL 是 3600(1 小時),改了 record 後最多需要等 1 小時,全球的 resolver cache 才會刷新。
最佳實踐:在計劃做 DNS 切換之前,提前 24-48 小時把 TTL 降到 300(5 分鐘),這樣切換完成後等待時間更短,確認新設定沒問題後再把 TTL 調回。
Recursive vs Iterative 查詢
Recursive(你的電腦問 resolver):resolver 幫你問完整個鏈,返回最終答案。
Iterative(resolver 問 root/TLD/authoritative):root 只告訴 resolver「去問誰」,不幫它繼續查。
Flush DNS Cache
如果你改了 DNS record 但想立刻測試:
# macOS
sudo dscacheutil -flushcache && sudo killall -HUP mDNSResponder
# Linux (systemd-resolved)
sudo systemd-resolve --flush-caches
# Windows
ipconfig /flushdns
# 用 Google 的 DNS 查詢(bypass 本機 cache)
dig @8.8.8.8 api.example.com
# 或直接問 authoritative server(不管任何 cache)
dig +trace api.example.comDNS 看起來是「把域名翻成 IP」的簡單事,但理解它的遞迴結構和 TTL 機制,能讓你在 migration、disaster recovery、CDN 切換這類場景做出正確的決策。