Skip to content

瀏覽器透過本機 cache、router 與 recursive resolver,逐層查詢 DNS 後找到目的伺服器

瀏覽器如何把網域名稱轉換成 IP? ​

在人類世界中,人跟人會透過語言溝通,也會呼叫對方的名字。但在電腦世界裡,裝置真正連線時使用的是 IP 位址。

然而,要人類記住一長串數字實在太困難了!所以我們平常會使用網域名稱,再由 DNS 將它解析成 IP 位址。等瀏覽器取得可用的 IP 位址後,才有辦法繼續建立連線並傳輸資料。

這個章節就是要探討這一系列的轉換如何進行,最終又是怎麼得到 IP 位址的。那我們就接著開始吧!

本機與 DNS server 的 cache ​

一開始,如果瀏覽器的 host resolver cache 已經有可用的解析結果,通常就能省下後續的 DNS 查詢。以 Chrome 來說,可以開啟 chrome://net-internals/#dns,輸入網域名稱後手動執行 lookup;這個頁面也提供清除 Chrome host cache 的功能。下圖是查詢 youtube.com 後得到的結果:

Chrome net-internals 顯示 youtube.com 的 DNS lookup 結果

如果瀏覽器沒有可用的 cache,接下來會依瀏覽器、作業系統與網路設定繼續解析,例如查找 hosts 檔案、作業系統 cache,或向設定好的 DNS server 發出查詢。這台 DNS server 可能是家用 router、ISP 提供的 resolver、公司或 VPN 內部的 resolver,也可能是自己指定的 public DNS;使用 DoH(DNS over HTTPS)時,瀏覽器還可能直接向指定的服務查詢。

想確認目前 nslookup 會詢問哪一台 DNS server,以及它回傳的解析結果,可以執行:

bash
nslookup google.com

nslookup 會直接詢問指定或系統預設的 DNS server,並不是用來查看本機 DNS cache。以下圖來說,我的電腦會顯示這些資料:

nslookup 顯示預設 DNS server 與 google.com 的解析結果

可以先看一下 Server 與第一個 Address:

  • Server:這次查詢使用的 DNS server。圖中是 192.168.213.1,代表我的電腦把家用 router 當成 DNS server,但其他網路環境不一定相同。
  • Address:DNS server 的 IP 位址與 port。圖中的 192.168.213.1#53 表示使用 192.168.213.1 的 port 53。

下面的 Name 與 Address 則是查詢結果,告訴你網域名稱解析到哪個 IP 位址。Non-authoritative answer 表示這份回應不是由該網域的 Authoritative Name Server 直接回答,而是由目前詢問的 recursive resolver 或 forwarding resolver 回傳;它可能直接命中 cache,也可能剛向上游完成查詢,因此不能只靠這行文字判斷是否命中 cache。

所以,一般使用者的電腦不需要自己運行一套完整的 recursive DNS server,而是透過本機的 stub resolver,把查詢交給設定好的 DNS server。若家用 router 扮演 forwarding resolver,它通常會再把查詢轉送給上游的 recursive resolver;這些 resolver 也可能有自己的 cache,如果 cache 裡沒有可用資料,才需要繼續往 DNS 階層查找!

這兩種 resolver 的工作方式不太一樣:

  • forwarding resolver:收到查詢後,不會自己沿著 Root、TLD 與 Authoritative Name Server 逐層尋找答案,而是把查詢轉送給預先設定的上游 resolver,再將結果回傳給用戶端。家用 router 提供的 DNS proxy 經常扮演這個角色;至於會不會保存 cache,則取決於實作與設定。
  • recursive resolver:負責替用戶端取得最終答案。它會先查找自己的 cache;cache miss 時,如果由它自己執行解析,就會從 Root Name Server 開始進行 iterative query,依序找到 TLD 與 Authoritative Name Server,直到取得答案或確認查詢失敗。

forwarding resolver 與 recursive resolver 描述的是處理查詢的角色,不一定代表兩套獨立的軟體或兩台不同的主機。同一套 DNS server 可以同時具備 forwarding、recursive 與 caching 等能力,實際行為仍要看服務的設定。

DNS resolver ​

當 recursive resolver 的 cache 也找不到答案時,實際路徑就會像抽絲剝繭一樣:先從 Root Name Server 取得 TLD Name Server 的位置,再向 TLD Name Server 取得目標網域的 Authoritative Name Server,最後查到 A、AAAA 或 CNAME 等 DNS record。recursive resolver 取得結果後會回傳給用戶端,瀏覽器才能接著往解析出的 IP 位址建立連線!

recursive resolver 常見的來源包含:

  • ISP(Internet Service Provider)
  • Public DNS provider,例如 Google Public DNS(8.8.8.8)與 Cloudflare(1.1.1.1)

瀏覽器可使用 ISP、Cloudflare 或 Google Public DNS 提供的 recursive resolver

這裡是說 recursive resolver 可以由不同服務提供,實際上會依系統或瀏覽器設定選用 resolver,並不是每次同時向圖中的三個服務查詢。

那下圖就是 cache miss 後的分層查找流程,接著繼續細講。圖中的 IP 僅是流程示意,不代表 google.com 的實際解析結果。

recursive resolver 依序查詢 Root、TLD 與 Authoritative Name Server

Root Name Server ​

假如說我要查找 blog.itskylen.com 時,完整網域名稱可以寫成 blog.itskylen.com.,最後面的 . 代表 DNS root。recursive resolver 會先詢問 Root Name Server,取得負責 .com 的 TLD Name Server 資訊,才有辦法進行下一階段的查找。

TLD Name Server(Top-Level Domain Name Server) ​

有了上一階段的結果後,就準備向 .com 的 TLD Name Server 查詢 itskylen.com 由哪些 Authoritative Name Server 負責。目前常見的 TLD 類型包含:

  • gTLD(Generic Top-Level Domain,通用頂級網域):例如 .com、.org、.net,後來也陸續加入 .app、.blog 等新通用頂級網域。
  • ccTLD(Country Code Top-Level Domain,國家及地區頂級網域):代表特定國家或地區,例如 .uk 代表英國、.cn 代表中國、.jp 代表日本。ccTLD 通常由相應國家或地區的註冊管理機構管理,也可能有特定的註冊與使用要求。
  • sTLD(Sponsored Top-Level Domain,贊助類頂級網域):由特定社群或組織贊助及管理,例如 .gov 由美國政府管理,供符合資格的美國政府機構使用;.edu 則有特定的教育機構資格限制。

所以,跟 .com 的 TLD Name Server 溝通後,recursive resolver 會得到 itskylen.com 的 NS record,以及必要時用來找到這些 Name Server 的 IP 位址。這些 Name Server 才是下一階段要詢問的對象。

Authoritative Name Server ​

在這個階段,Authoritative Name Server 會依自己管理的 zone 回答 blog.itskylen.com 對應的 DNS record。A record 會指向 IPv4 位址,AAAA record 會指向 IPv6 位址;如果查到的是 CNAME,則代表它是另一個網域名稱的別名,recursive resolver 還要繼續解析該名稱,最後才取得可用的 IP 位址。

我們平常在 DNS provider 後台設定 A、AAAA 或 CNAME record,就是在維護這個 zone 的授權資料。recursive resolver 取得最終結果後,會把答案一路回傳給本機,並依 DNS record 的 TTL cache 一段時間,讓後續查詢不必每次都從 Root Name Server 重新開始。

TTL(Time to Live)不是另一種 cache,而是 DNS record 附帶的 cache 有效時間,通常以秒為單位。例如 TTL 設為 300,代表 resolver 最多可以在 300 秒內重複使用這份結果;時間到了之後,並不是網域名稱或 IP 位址立刻失效,而是 resolver 不能再直接信任舊的 cache,下一次收到查詢時需要重新解析並取得最新資料。

TTL 設得較長,可以減少重複查詢與 DNS server 的負擔,但修改 DNS record 後,舊結果也可能在 cache 裡停留比較久;TTL 設得較短,變更通常能更快反映,代價則是 resolver 需要更頻繁地重新查詢。因此在調整 DNS record 時,也要一起考量查詢量與變更生效速度!

總結 ​

所以,當我們在瀏覽器輸入網域名稱時,瀏覽器並不是每次都會立刻從 Root Name Server 開始查找。它會先確認自己的 host resolver cache,再依瀏覽器、作業系統與網路設定,透過 stub resolver 將查詢交給指定的 DNS server。如果家用 router 扮演 forwarding resolver,它會把請求轉送給上游;真正負責取得最終答案的 recursive resolver 也會先檢查自己的 cache。

只有在前面的 cache 都找不到可用結果,而且 recursive resolver 需要自己執行解析時,才會依序詢問 Root、TLD 與 Authoritative Name Server,最後取得 A、AAAA 或 CNAME 等 DNS record。取得結果後,recursive resolver 會依 TTL cache 一段時間,瀏覽器與作業系統也可能依自己的規則保存結果,讓後續查詢可以更快完成。

也就是說,DNS resolution 不是單純把網域名稱換成 IP 而已,而是由不同角色分工,再搭配多層 cache 完成的查找流程。等瀏覽器拿到可用的 IP 位址後,接下來才會進入建立連線與傳輸資料的階段!

參考資料 ​

按 Enter 或空白鍵放大圖片,按 Escape 關閉放大檢視。