DNS自述:我是如何為域名找到家的
- 2020 年 2 月 26 日
- 筆記
www.baidu.com
的時候,百度的首頁就出現在面前。但你可曾想過,為什麼我們輸入www.baidu.com
就可以彈出百度首頁?在這彈指一揮間,到底發生了什麼?今天就讓我帶你來揭開這背後發生的一切。
當我們開始之前,我們需要明白:雖然我們每次訪問網頁,都是使用域名的方式(例如:www.baidu.com)。但對於計算機來說,它最終訪問的是域名對應的IP(例如:10.102.201.253)。所以今天我們要講的這一切,其實就為了說清楚一件事情:DNS是如何為域名找到對應的 IP 地址的。
瀏覽器DNS緩存
當我們在瀏覽器地址欄輸入域名後,瀏覽器首先會去其本身的 DNS 緩存中查找是否有對應域名的記錄。如果有,那麼直接訪問對應的服務器。

不同瀏覽器會設置不同的 DNS 緩存時間,一般來說是 2-30 分鐘之間。如果當你修改了系統 DNS 緩存後,發現訪問還是沒生效,你可以嘗試清除下瀏覽器的 DNS 緩存。
系統DNS緩存
當瀏覽器在其自身的緩存中找不到對應域名的記錄時,其將會去系統的 DNS 緩存中尋找記錄。在 Windows 系統中,DNS 緩存信息存儲在 C:/windows/system32/drivers/etc/hosts
中。而在 Mac OSX 系統中,DNS 緩存信息存儲在 /etc/hosts
文件中。
但無論在哪個系統,該文件的格式都是域名的 IP 地址的映射。每一行是一個映射,前面是域名對應的 IP 地址,後面是對應的域名。
127.0.0.1 www.baidu.com 192.168.1.1 www.google.com
如上面的範例所示,其設置了當我們訪問 www.baidu.com
時,我們直接訪問 127.0.0.1
這台機器。而當我們訪問 www.google.com
時,我們直接訪問 192.168.1.1
這台機器。
所以很多時候,當我們在本地調試時我們可以設置任意的域名,只要該域名對應的 IP 存在對應的服務即可。例如像我這樣喜愛寫文章的程序員,我可以寫這樣設置一個域名的映射:
127.0.0.1 top-writer.google.com
當你的機子上訪問 top-writer.google.com
的時候,請求自然就會轉發到本機上,即使你並不是這個域名的所有者。
本地DNS服務器
如果在系統 DNS 也找不到域名的記錄,那麼瀏覽器就會去本地的 DNS 服務器(LDNS)上尋找該域名的記錄。在這裡的 LDNS 一般是指本機所設置的 DNS 服務器地址。例如在我的電腦上,其對應的 DNS 地址為:10.xxx.xxx.253。那麼瀏覽器就會去這個 DNS 服務器上尋找域名對應的記錄。

如果在 LDNS 服務器上找到了記錄,那麼就直接返回就可以。但如果還是沒找到記錄,那麼就得進一步深入查找了。
根DNS服務器
當 LDNS 服務器還是招不到域名對應的記錄時,那麼其就會去根 DNS 服務器去尋找域名對應的記錄。根 DNS 服務器全球只有 13 台,所以在 LDNS 服務器建立的時候,其會寫死一個根 DNS 服務器的 IP 地址列表。
但實際上根 DNS 服務器並不存儲所有域名的信息,其只存儲頂級域名的解析記錄。即對於我們訪問的域名 www.baidu.com
來說,根 DNS 服務器並不能告訴我們 www.baidu.com
這個域名對應的 IP 是多少,它只能告訴我們 .com
這個頂級域名應該找哪個 DNS 服務器解析,然後把對應頂級 DNS 服務器的 IP 地址告訴我們。
頂級DNS服務器
我們訪問域名 www.baidu.com
後,根 DNS 服務器告訴我們可以找對應的 .com
頂級 DNS 服務器解析。但實際上頂級 DNS 服務器只能解析二級域名的地址,即它只能告訴你:baidu.com
這個域名應該找哪台 DNS 服務器去解析。
這裡我們從頂級 DNS 服務器解析 baidu.com
這個域名得到的 DNS 服務器,其實就是你買域名時用於管理解析的服務器。而且也是你設置域名 NS 記錄時,設置的 DNS 服務器的地址。
趣談編程註:NS記錄就是域名服務器記錄(Name Server),返回下一級域名信息的服務器地址,該記錄只能設置域名,不能設置為IP地址。
次級域名服務器
上一步我們知道 baidu.com
這個頂級域名應該找哪台 DNS 服務器去解析(這台服務器我們稱為次級域名服務器),其實這台 DNS 服務器就是我們購買域名時設置的用於解析的 DNS 服務器。在這台 DNS 服務器上,我們通過設置一條 A 記錄(A 記錄就是域名到 IP 地址的映射)就可以讓某個域名與 IP 聯繫起來。
趣談編程註:A記錄就是地址記錄(Address),返回域名指向的IP地址。
當瀏覽器去請求 baidu.com
返回的 DNS 服務器(次級域名服務器)時,就會去這台DNS服務器(次級域名服務器)上找www.baidu.com對應的IP地址。
總結
看到這裡,相信大家都清楚了 DNS 尋址的整個流程了。總的來說,DNS 尋址的順序為:
- 瀏覽器 DNS 緩存
- 系統 DNS 緩存
- 本地 DNS 服務器
- 根 DNS 服務器
- 頂級 DNS 服務器
- 次級域名服務器
如果到最後還是找不到解析記錄,那麼就直接報域名解析錯誤。在這個過程中,我們還可以學到兩個重要的知識點,即:
第一,域名最終得到的 IP 地址,是通過類型為A的記錄來得到的。 通過上面的解釋,你會發現無論怎樣設置,最終都會有一台 DNS 服務器去解析該域名。而在該 DNS 服務器上,必然存在一條解析類型為 A 的解析記錄。如下圖所示,我設置的是一條針對 hello.csyimg.com 域名的 A 記錄,其指向了 192.168.1.1 這個 IP。如果最終找不到 A 記錄,那瀏覽器就會報 DNS 解析錯誤。

第二,域名是由:主機名.二級域名.頂級域名.根域名組成的。 例如:www.baidu.com 中,www
就是主機名,.baidu
就是二級域名,.com
就是頂級域名。而在 .com
後面省略的 .
就是根域名。
想了解更多關於DNS的知識,後台回復DNS即可獲得。