1. 程式人生 > >DNS自述:我是如何為域名找到家的

DNS自述:我是如何為域名找到家的

對於網際網路一代的我們,一出生就學會使用電腦。當我們對著瀏覽器位址列輸入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 記錄,可以在公眾號後臺回覆「域名解析型別」,檢視我寫的另一篇文章。

域名DNS伺服器

上一步我們知道 baidu.com 這個頂級域名應該找哪臺 DNS 伺服器去解析,其實這臺 DNS 伺服器就是我們購買域名時設定的用於解析的 DNS 伺服器。在這臺 DNS 伺服器上,我們通過設定一條 A 記錄(A 記錄就是域名到 IP 地址的對映)就可以讓某個域名與 IP 聯絡起來。

當瀏覽器去請求 baidu.com 對應的 DNS 伺服器時,其會嘗試尋找解析型別為 A ,並且主機名為 www 的解析記錄。如果找到了,那麼就返回對應的 IP 地址。否則就報告 DNS 解析錯誤,其不會再去其他 DNS 伺服器上尋找了。

總結

看到這裡,相信大家都清楚了 DNS 定址的整個流程了。總的來說,DNS 定址的順序為:

  • 瀏覽器 DNS 快取
  • 系統 DNS 快取
  • 本地 DNS 伺服器
  • 根 DNS 伺服器
  • 頂級 DNS 伺服器
  • 域名 DNS 伺服器

如果到最後還是找不到解析記錄,那麼就直接報域名解析錯誤。在這個過程中,我們還可以學到兩個重要的知識點,即:

第一,域名 DNS 伺服器就是 NS 記錄設定的地址。 我們在域名服務商可以設定 NS 記錄,將域名託管給另外一臺 DNS 伺服器進行解析,這個時候頂級 DNS 伺服器註冊的域名 DNS 伺服器,就是我們 NS 記錄配置的值。

上圖我為 doc.csyimg.com 子域名設定了一條 NS 解析記錄。那麼當我訪問 doc.csyimg.com 的時候,當解析到頂級 DNS 伺服器時,頂級 DNS 伺服器應該是返回 csyimg.com 對應的域名 DNS 伺服器地址。接著瀏覽器訪問 csyimg.com 對應的域名 DNS 伺服器時,發現是要訪問 doc.csyimg.com 域名,因為設定了 NS 記錄,於是告訴它去 ns.baidu.com DNS 伺服器上去尋找對應的解析記錄。

注:這裡說的找 ns.baidu.com 解析,其實應該是該域名對應的 IP,這裡為了表述方便,沒有做過多解釋。

第二,域名最終得到的 IP 地址,是通過域名的 A 解析型別。 通過上面的解釋,你會發現無論怎樣設定,最終都會有一臺 DNS 伺服器去解析該域名。而在該 DNS 伺服器上,必然存在一條解析型別為 A 的解析記錄。如下圖所示,我設定的是一條針對 hello.csyimg.com 域名的 A 記錄,其指向了 192.168.1.1 這個 IP。如果最終找不到 A 記錄,那瀏覽器就會報 DNS 解析錯誤。

第三,域名是由:主機名.二級域名.頂級域名.根域名組成的。 例如:www.baidu.com 中,www 就是主機名,.baidu 就是二級域名,.com 就是頂級域名。而在 .com 後面省略的 . 就是根域名。

通過這兩個知識點,你會發現域名的解析型別與 DNS 的解析原理息息相關的。如果你感興趣可以在公眾號後臺回覆「域名解析型別」,檢視我寫的另一篇文章。