01

總覽與定位

DNS 把人類可讀的網域名稱轉成機器可連的 IP——是幾乎所有網路請求的第一跳。

你輸入 api.example.com 時,作業系統與瀏覽器並不知道該連哪個 IP。 DNS(Domain Name System) 是分散式的命名系統:把名稱解析成 A/AAAA 等紀錄, 再交給 TCP/UDP 真正建連。沒有 DNS,幾乎所有現代服務都動不了。

Stub Resolver
OS / Browser
應用端的輕量查詢器;通常只問本機或 ISP 的 Recursive Resolver,自己不做完整階層遍歷。
Recursive Resolver
ISP / 8.8.8.8
代客完成整條查詢鏈,並快取答案。開發者日常「查 DNS」多半打到這一層。
Root / TLD
. → .com
階層導航:Root 告訴你 .com 在哪;TLD 告訴你 example.com 的權威伺服器在哪。
Authoritative
Zone 真相來源
握有該網域的最終紀錄(A/MX/NS…)。改 DNS 設定,改的就是這一層。
座標在網路棧中的位置

DNS 通常跑在 UDP/TCP 53,介於「應用要連誰」與「L3 路由怎麼走」之間。 本篇接續 IP/LAN/NAT:有了位址與路徑之後,還缺「名稱 → 位址」這層目錄服務。

一句話答法DNS 是分散式名稱目錄:Stub 問 Recursive,Recursive 沿 Root→TLD→Authority 迭代查出 IP,再靠 TTL 快取減少重複查詢。
02

解析流程:遞迴與迭代

同一個「查 IP」請求,在 Stub 與 Resolver 眼裡是兩種完全不同的協議行為。

實務上幾乎所有客戶端都走遞迴查詢(Recursive Query):Stub 對 Resolver 設 RD(Recursion Desired)旗標, 期望對方「給我最終答案」。Resolver 對外則多半用迭代查詢(Iterative Query):自己一步步問 Root、TLD、Authority, 每次只拿到「下一步去哪問」的 referral,直到拿到最終紀錄。

遞迴查詢(客戶端視角)
Stub → Recursive Resolver
  • 客戶端只發一問,等最終答案(或錯誤)
  • 快取命中時幾乎零延遲
  • 客戶端不必知道 Root/TLD 拓樸
迭代查詢(Resolver 視角)
Resolver ↔ Root / TLD / Auth
  • 每次回應可能是 referral(NS+glue)
  • Resolver 自己決定下一跳
  • 可並行/快取各層 NS,降低 Root 壓力
sequenceDiagram
    participant C as Client
    participant R as Resolver
    participant Ro as Root
    participant T as TLD
    participant A as 權威
    C->>R: 遞迴查詢 RD=1
    R->>Ro: 迭代查詢
    Ro-->>R: .com NS referral
    R->>T: 迭代查詢
    T-->>R: example.com NS
    R->>A: 迭代查詢
    A-->>R: A 紀錄
    R-->>C: A 紀錄

看 Resolver 那條生命線:它上面有三組往返,客戶端卻只有一組——「誰在做迭代、誰只發一次遞迴」的分工全寫在這個不對稱裡。三個 referral(虛線)都不是最終答案,只是「下一步去哪問」。

想在真機看這條迭代鏈路,用 dig +trace——它會自己扮演 Resolver,從 Root 開始一層層問下去,把每個 referral 印出來:

$ dig +trace www.example.com

.            NS   a.root-servers.net.  ...        # 1) 從 Root hints 起步,拿到根區 NS
com.         NS   a.gtld-servers.net.  ...        # 2) 問 Root → 得到 .com 的 NS(referral)
example.com. NS   ns.example.com.                 # 3) 問 .com TLD → 得到 example.com 委派
www.example.com. A 93.184.216.34                  # 4) 問權威 → 拿到最終 A 紀錄

對照左邊:每個 NS 行都是一次 referral(「下一步去哪問」),只有最後一行才是最終答案。少了 +trace 的普通 dig www.example.com,則是直接打你系統設定的 Resolver、由它代跑整條鏈——多半直接命中快取。

陷阱「遞迴」不是協定裡的另一種封包格式

遞迴/迭代是查詢行為與誰負責走完整條鏈的差異,不是兩種不相容的 DNS 協議。 面試若只背「遞迴比較快」而不提「誰在做迭代、誰在快取」,容易被追問穿幫。

一句話答法客戶端對 Resolver 做遞迴;Resolver 對階層伺服器做迭代。快取命中時連迭代都不必跑。
03

伺服器階層:Root、TLD、Authority

DNS 是樹狀委派:每一層只負責「這一截名稱」與「下一層 NS 在哪」。

以查 www.example.com 的冷快取路徑為例:

  1. Root(.):不存業務紀錄;回傳 .com 的 NS 與 glue A/AAAA。
  2. TLD(.com):回傳 example.com 的權威 NS(常來自註冊商/DNS 託管商)。
  3. Authoritative:回傳 www.example.com 的最終答案(例如 A → 93.184.216.34)。

Authority 管理的單位叫 Zone。Zone 檔裡的 NS 紀錄宣告「誰是這區的權威」; 父 Zone(如 .com)必須有對應的委派,否則全世界找不到你的伺服器——這也是「剛買網域卻解析不到」的常見根因。

關鍵為什麼需要 glue record?——打破循環依賴

委派 example.com 給 ns1.example.com 時會遇到雞生蛋問題:TLD 只回「權威 NS 叫 ns1.example.com」,但你要先解析 ns1.example.com 才知道它的 IP,而它本身又在 example.com 這個 Zone 內——要問它得先找到它,形成死循環。解法是 TLD 在回覆 NS 委派時,順帶附上該 NS 的 A/AAAA 位址,這筆「額外附帶的黏合紀錄」就是 glue record,讓 Resolver 不必再繞回來查就能直接連上權威。只有當 NS 名稱落在被委派的 Zone 之內(in-bailiwick)時才需要 glue;若 NS 用的是外部網域(如 ns.some-dns-provider.net)則不需要。

層級 回答什麼 典型運營者 開發者何時碰到
Root TLD 的 NS Root Server Operators 幾乎從不直接設定;Resolver 內建 Root hints
TLD 網域 NS 委派 Verisign、各 ccTLD 改註冊商 Nameserver 時
Authoritative Zone 內最終紀錄 Cloudflare、Route53、自建 Bind 加 A/CNAME/MX、切藍綠、驗證所有權

階層委派:每一層只導航,最終真相在 Authoritative Zone。

一句話答法Root 指 TLD、TLD 指網域 NS、Authority 給最終紀錄;改 DNS 設定改的是 Authority,委派要與父 Zone 一致。
04

常見記錄類型

面試與上線最常考的五種:A、AAAA、CNAME、MX、NS——各管一件事,不要混用。

類型 語意 典型用途 注意
A 名稱 → IPv4 網站/API 主機 可多值做簡易 DNS LB
AAAA 名稱 → IPv6 雙棧服務 客戶端 Happy Eyeballs 會並行試
CNAME 名稱 → 另一名稱 CDN/別名/驗證 不可與同名其他紀錄並存;apex 常受限
MX 郵件交換主機 收信路由 帶 priority;值應是主機名非 IP
NS Zone 權威伺服器 委派與託管 父子 Zone 必須一致,否則裂腦

紀錄類型對照:選錯類型比設錯 IP 更難除錯。

關鍵CNAME 鏈與 apex

CNAME 指向另一個名稱,Resolver 會繼續追到 A/AAAA。 根網域(apex,如 example.com)常因需同時存在 NS/MX 而不能放 CNAME——這才有 ALIAS/ANAME 等廠商擴充。 面試提到 CDN 時,能講清「為何 www 用 CNAME、apex 用 A/ALIAS」會加分。

一句話答法A/AAAA 給位址、CNAME 給別名、MX 給郵件、NS 給權威;CNAME 不能跟同名其他紀錄共存,apex 要特別小心。
05

TTL 與各層快取

開發者最常誤解的地方:改了 DNS 卻「立刻/永遠」不生效——多半是快取層次沒對齊。

TTL(Time To Live) 是權威伺服器在答案上附的「允許快取多久(秒)」。 它不是「保證在 TTL 秒內全球同步切換」,而是「快取端最長可保留多久」的上限建議。

補充負向答案(NXDOMAIN)的 TTL 從哪來?——SOA

正向答案的快取時間由該筆紀錄自己的 TTL 決定;但「查無此名(NXDOMAIN)」這種負向答案沒有具體紀錄可附 TTL,於是改由該 Zone 的 SOA(Start of Authority)紀錄裡的 minimum 欄位(RFC 2308)決定要快取多久。每個 Zone 有且只有一筆 SOA,記錄該區的主要 NS、負責人信箱、序號(serial,控制 secondary 同步)與各項計時器。所以「拼錯網域會卡一陣子」正是負向快取按 SOA minimum 在生效。

瀏覽器/應用快取
Chrome 等可能另有連線/DNS 快取;長連線、HTTP keep-alive 會讓「看起來沒切」。
TTL:廠商自訂,常短於 DNS TTL
OS Stub 快取
系統 resolver 快取正向/負向答案;nscd、systemd-resolved 都會插手。
TTL:遵循紀錄,負向快取另有規則
Recursive Resolver
ISP/公共 DNS 的主力快取層;同一 Resolver 上的用戶共享命中。
TTL:嚴格依剩餘 TTL 遞減
陷阱三個常見誤解

1.「把 TTL 改成 60 就 60 秒內全球切完」——舊 TTL 仍被舊快取遵守,要提前降 TTL 再切。
2.「flush DNS 就能逼所有人更新」——你只能清本機;別人的 ISP Resolver 不受影響。
3.「NXDOMAIN 不會被快取」——負向答案也有 TTL(SOA minimum 等),拼錯網域一樣會卡一陣子。

場景 建議 TTL 心智 理由
穩定官網 A 紀錄 較長(如 1h–24h) 降低查詢量與延遲
即將切換/災備演練 提前降到數分鐘 縮短舊答案殘留窗口
動態服務發現(少用公網 DNS) 極短或不走公網 DNS DNS 不是強一致註冊中心

TTL 是快取契約,不是全球原子開關。

一句話答法TTL 是快取上限不是切換保證;改 DNS 前先降 TTL,並記住瀏覽器、OS、Resolver 三層都會留舊答案。
06

互動 · TTL 決定這一次要問幾層

調 TTL、推時間,再按「下一問」——每一步要問誰,全由各層快取的剩餘 TTL 算出來。

互動 · DNS 解析步數模擬器 左尺是還剩多少時間,右尺是花了多少毫秒
快取命中 即將過期 已過期 從未快取 / 不過期

左尺「還剩多少時間」:五列共用同一條時間橫軸(平方根壓縮,才能同時容納 30 s 與 48 h),藍色細線是你拖到的「時間流逝」位置。線掃過哪一列,那一列就熄滅。Root hints 是設定檔不是快取,永遠不過期,所以畫成常駐斜紋;「即將過期」是殘量低於該層 TTL 10% 的呈現用分箱,不是協定規則。

右尺「花了多少毫秒」:實線格是這次真的發生的問答(寬度正比於該段 RTT),虛線格是被快取省掉的層與它省下的毫秒。一次問答算一個 hop,最後把答案回覆 Stub 不另計 RTT。

拖動任一個滑桿,或直接按「下一問」。
一句話答法冷查詢走完整 Root→TLD→Authority;熱查詢打 Resolver 快取;TTL 過期等於快取失效,必須重查權威。
07

面試折衷與實務選型

DNS 看起來「只是查 IP」,但選型牽涉延遲、切換速度、可用性與安全。

議題 常見選項 Trade-off
TTL 長短 長 TTL vs 短 TTL 長:省查詢、穩;短:切換快、權威壓力大
DNS 負載均衡 多 A 紀錄 vs GSLB 多 A 簡單但不懂健康檢查;GSLB 聰明但複雜、仍受 TTL 綁架
權威託管 雲 DNS vs 自建 雲:Anycast/任播/API;自建:可控但要扛 DDoS 與可用性
安全 DNSSEC / DoH / DoT 防污染與竊聽;代價是複雜度、延遲與除錯成本

DNS 選型沒有銀彈:切換速度與快取效益永遠在拉扯。

原生 DNS 有兩個安全弱點:答案可被竄改(快取污染/中間人偽造 referral),且查詢明文可被竊聽。三個常混為一談、其實正交的機制各解一半:

機制保護什麼怎麼做代價 / 注意
DNSSEC 真實性 / 完整性 權威用私鑰對紀錄簽章(RRSIG),沿信任鏈(DS/DNSKEY)逐層驗證 不加密(內容仍明文可見);金鑰輪替、簽章過期是常見營運事故
DoT(DNS over TLS) 傳輸機密性 把 stub↔resolver 查詢包在 TLS,走專用 port 853 獨立 port 易被網管識別/封鎖;不保證答案未被權威端偽造
DoH(DNS over HTTPS) 傳輸機密性 查詢包進 HTTPS(port 443),混在一般網頁流量中 難被封鎖但也繞過企業 DNS 監控;同樣不驗證答案真偽

關鍵區分:DNSSEC 管「答案是不是被竄改」,DoT/DoH 管「查詢過程有沒有被偷看」——兩者正交,完整防護會同時用。

面試高頻追問怎麼答

Q:為什麼改了 A 紀錄還連到舊 IP? 答:列三層快取+舊 TTL 仍有效;解法是提前降 TTL、等窗口、必要時雙寫一段時間。
Q:CNAME 和 A 差在哪? 答:A 直接給 IP;CNAME 給別名需再解析;apex 常不能 CNAME。
Q:DNS LB 能取代健康檢查 LB 嗎? 答:不能——TTL 與客戶端快取會讓故障摘除變慢且不均勻。

一句話答法DNS 擅長名稱與粗粒度流量導向,不擅長秒級故障轉移;設計時永遠把 TTL 與快取層算進 RTO。