透過 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
(完)