通過 DNS 查詢,得到域名的 IP 地址,才能訪問網站。
那麼,DNS 查詢到底是怎麼完成的?本文通過實例,詳細介紹背後的步驟。

一、DNS 服務器
域名對應的 IP 地址,都保存在 DNS 服務器。
我們輸入域名,瀏覽器就會在後臺,自動向 DNS 服務器發出請求,獲取對應的 IP 地址。這就是 DNS 查詢。

舉例來說,我輸入 es6.ruanyifeng.com 這個域名,瀏覽器就要向 DNS 服務器查詢,它的 IP 地址是什麼,然後向該 IP 發出訪問請求。
網上有很多公用的 DNS 服務器,這篇文章選擇 Cloudflare 公司提供的 1.1.1.1 進行演示。

二、dig 命令
命令行工具 dig 可以跟 DNS 服務器互動,我們就用它演示 DNS 查詢。如果你還沒有安裝,可以搜一下安裝方法,在 Linux 系統下是非常容易的。
它的查詢語法如下(美元符號$是命令行提示符)。
$ dig @[DNS 服務器] [域名]
向 1.1.1.1 查詢域名,就執行下面的命令。
$ dig @1.1.1.1 es6.ruanyifeng.com
正常情況下,它會輸出一大堆內容。

在其中找到 ANSWER SECTION 這個部分,它給出了查詢的答案,域名對應的 IP 地址是 104.198.14.52。
三、域名的樹狀結構
你可能會問,難道 DNS 服務器(比如 1.1.1.1)保存了世界上所有域名(包括二級域名、三級域名)的 IP 地址?
當然不是。DNS 是一個分佈式系統,1.1.1.1 只是用戶查詢入口,它也需要再向其他 DNS 服務器查詢,才能獲得最終的 IP 地址。
要說清楚 DNS 完整的查詢過程,就必須瞭解 域名是一個樹狀結構。
最頂層的域名是根域名(root),然後是頂級域名(top-level domain,簡寫 TLD),再是一級域名、二級域名、三級域名。

(1)根域名
所有域名的起點都是根域名,它寫作一個點.,放在域名的結尾。因為這部分對於所有域名都是相同的,所以就省略不寫了,比如example.com等同於example.com.(結尾多一個點)。
你可以試試,任何一個域名結尾加一個點,瀏覽器都可以正常解讀。
(2)頂級域名
根域名的下一級是頂級域名。它分成兩種:通用頂級域名(gTLD,比如 .com 和 .net)和國別頂級域名(ccTLD,比如 .cn 和 .us)。
頂級域名由國際域名管理機構 ICANN 控制,它委託商業公司管理 gTLD,委託各國管理自己的國別域名。
(3)一級域名
一級域名就是你在某個頂級域名下面,自己註冊的域名。比如,ruanyifeng.com就是我在頂級域名.com下面註冊的。
(4)二級域名
二級域名是一級域名的子域名,是域名擁有者自行設置的,不用得到許可。比如,es6 就是 ruanyifeng.com 的二級域名。
四、域名的逐級查詢
這種樹狀結構的意義在於,只有上級域名,才知道下一級域名的 IP 地址,需要逐級查詢。
每一級域名都有自己的 DNS 服務器,存放下級域名的 IP 地址。
所以,如果想要查詢二級域名 es6.ruanyifeng.com 的 IP 地址,需要三個步驟。
第一步,查詢根域名服務器,獲得頂級域名服務器
.com(又稱 TLD 服務器)的 IP 地址。第二步,查詢 TLD 服務器
.com,獲得一級域名服務器ruanyifeng.com的 IP 地址。第三步,查詢一級域名服務器
ruanyifeng.com,獲得二級域名es6的 IP 地址。
下面依次演示這三個步驟。
五、根域名服務器
根域名服務器全世界一共有13臺(都是服務器集群)。它們的域名和 IP 地址如下。

根域名服務器的 IP 地址是不變的,集成在操作系統裡面。
操作系統會選其中一臺,查詢 TLD 服務器的 IP 地址。
$ dig @192.33.4.12 es6.ruanyifeng.com
上面示例中,我們選擇192.33.4.12,向它發出查詢,詢問es6.ruanyifeng.com的 TLD 服務器的 IP 地址。
dig 命令的輸出結果如下。

因為它給不了 es6.ruanyifeng.com 的 IP 地址,所以輸出結果中沒有 ANSWER SECTION,只有一個 AUTHORITY SECTION,給出了com.的13臺 TLD 服務器的域名。
下面還有一個 ADDITIONAL SECTION,給出了這13臺 TLD 服務器的 IP 地址(包含 IPv4 和 IPv6 兩個地址)。
六、TLD 服務器
有了 TLD 服務器的 IP 地址以後,我們再選一臺接著查詢。
$ dig @192.41.162.30 es6.ruanyifeng.com
上面示例中,192.41.162.30 是隨便選的一臺 .com 的 TLD 服務器,我們向它詢問 es6.ruanyifeng.com 的 IP 地址。
返回結果如下。

它依然沒有 ANSWER SECTION 的部分,只有 AUTHORITY SECTION,給出了一級域名 ruanyifeng.com 的兩臺 DNS 服務器。
下面的 ADDITIONAL SECTION 就是這兩臺 DNS 服務器對應的 IP 地址。
七、一級域名的 DNS 服務器
第三步,再向一級域名的 DNS 服務器查詢二級域名的 IP 地址。
$ dig @172.64.32.123 es6.ruanyifeng.com
返回結果如下。

這次終於有了 ANSWER SECTION,得到了最終的二級域名的 IP 地址。
至此,三個步驟的 DNS 查詢全部完成。
八、DNS 服務器的種類
總結一下,上面一共提到了四種服務器。
- 1.1.1.1
- 根域名服務器
- TLD 服務器
- 一級域名服務器
它們都屬於 DNS 服務器,都用來接受 DNS 查詢。但是作用不一樣,屬於不同的類別。
8.1 遞歸 DNS 服務器
後三種服務器只用來查詢下一級域名的 IP 地址,而 1.1.1.1 則把分步驟的查詢過程自動化,方便用戶一次性得到結果,所以它稱為遞歸 DNS 服務器(recursive DNS server),即可以自動遞歸查詢。
我們平常說的 DNS 服務器,一般都是指遞歸 DNS 服務器。它把 DNS 查詢自動化了,只要向它查詢就可以了。
它內部有緩存,可以保存以前查詢的結果,下次再有人查詢,就直接返回緩存裡面的結果。所以它能加快查詢,減輕源頭 DNS 服務器的負擔。
8.2 權威 DNS 服務器
一級域名服務器的正式名稱叫做權威域名服務器(Authoritative Name Server)。
"權威"的意思是域名的 IP 地址由它給定,不像遞歸服務器自己做不了主。我們購買域名後,設置 DNS 服務器就是在設置該域名的權威服務器。
8.3 四種 DNS 服務器
綜上所述,DNS 服務器可以分成四種:
- 根域名服務器
- TLD 服務器
- 權威域名服務器
- 遞歸域名服務器
它們的關係如下圖。

知道了 DNS 查詢的原理,完全可以自己寫一個 DNS 的遞歸服務器,這是不難的。網上有很多參考資料,有興趣的話,大家可以試試看。

九、參考網址
- Building a Recursive DNS Resolver, Timothy Andrew
- Authoritative Vs Recursive DNS: What You Need To Know, Serena Raymond
- DNS 服務器類型,Cloudflare
(完)












