DNS 解析的原理
提起 DNS,大家都知道是將域名對映成 IP 的一種協議。但是我花了很長時間才真正理解這個“對映”的過程。網上有很多介紹 DNS 的資料,但是遺漏了很多細節,比如都跨過了哪一些快取,誰去真正發出查詢的 packet。我們電腦要配置 DNS 伺服器,如果你有網站的話,你會發現你的網站也有一個配置項叫 DNS 解析伺服器,這兩種伺服器是一樣的嗎?還有一些圖和資料是錯誤的,比如有些圖畫的是根域名伺服器指向權威域名伺服器,給人造成一種錯覺是根伺服器去查詢了權威伺服器。
本文試圖用簡單並且準確的圖片和文字解釋 DNS 查詢的過程,以及一些我曾經有的困惑。如果有何 RFC 衝突的地方那肯定是我錯了,請指正。
首先介紹一個 DNS,說白了它就是一個名字到 IP 的對映,因為像 64.202.189.170 這樣的 IP 太難記了,所以就有了 DNS 這樣的東西,好比是一個電話本,我們打電話(訪問網頁)的時候,就查一下這個名字(網路地址)對應什麼樣的 IP,然後撥出去。
如果你有很多聯絡人的話,查號碼的時候肯定不會一個一個看,一般會在手機上下拉到這個字母姓氏的地方,然後再定位到這個人的名字。DNS 也是一樣,全球已經有上千萬個域名了,並且還在實時的變動和更新,所以DNS就採取了一種“分層”的查詢。要查詢 www.kawabangga.com 這個域名對應的 IP,實際上查詢的是 www.kawabangga.com.
最後這個 .
就是 root nameserver,平時我們都省略了,其實這個才是一切開始的地方。
Recursive resolver(下面會講到這是啥)只知道 .
的地址(一共13個IP),這就夠了。當它查詢一個域名的時候,它就去 root nameserver 查詢,大體的步驟如下:
- 向
.
root nameserver 發出查詢請求,root nameserver 說,“我也不知道 www.kawabangga.com. 這個域名的地址,但是我知道 .com nameserver 的地址。Root Name Server 是怎麼知道所有頂級域名的地址呢?因為它就是幹這個的,Root Name Server 維護了所有頂級域名對應的地址,這個檔案可以在 https://www.internic.net/domain/root.zone 這裡下載。現在是 2019 年3月,這個檔案是 2萬多行,一共2.15M 。 - .com Name Server 這種域名是最頂層的域名,所以叫做頂級域名,Top Level Domain Name Server,TLD Name Server。因為……它在最頂層。.com 域名服務商也就叫做頂級域名服務商,其他有名的頂級域名還有 .org .gov .cn 等。TLD nameserver 這裡其實也不知道 www.kawabangga.com. 的 IP 地址,但是它知道 kawabangga.com. 的 nameserver 的地址。
- kawabangga.com. 的 Name Server 也叫做 Authoritative Name Server,通常翻譯成“權威域名伺服器”,但是我更喜歡叫他“被授權的域名伺服器”,為什麼呢?因為……它是被 .com 域名伺服器授權的。上一步,TLDName Server 怎麼知道 kawabnagga.com. 的Name Server 在哪裡的呢?因為你註冊一個域名的時候,本質上是花錢購買 xxx.com. 這個權威域名伺服器的管理權益,你把錢給域名註冊商,域名註冊商告訴 .com. TLD Name Server 說,hey 以後把 xxx.com. 這個域名交給 xxx 域名伺服器來解析就好啦!於是你就獲得了這個域名的解析權利。kawabangga.com. 的 Authoritative Name Server 地址是 ns1.myhostadmin.net. 當 Recursive resolver 過來查詢 www.kawabangga.com. 的地址的時候,ns1.myhostadmin.net. 會告訴它對應的IP。到這裡,一次查詢就宣告結束了。
這三種 Name Server 的職責都很明確:Root Name Server 負責維護全球頂級域名的地址;TLD Name Server 負責維護每一個購買了域名的人提交的他們的 Name Server 地址;Authoritative Name Server 由域名的持有人自己想怎麼解析就怎麼解析。但是一般的機構和個人都不會自己假設域名伺服器,因為可能子域名的需求不多,比如本部落格,就3個子域名而已,所以會選擇使用一個公共的 DNS 解析服務,比如 DNSPod。域名註冊商現在一般也都提供域名解析服務,CDN 像 CloudFlare 也會有域名解析的服務。像大型網站自己假設解析伺服器,一般會使用 BIND 這個很流行的軟體。當然也有自己研發 DNS 解析服務的。
下面我們再解釋一下上面提到的 Recursive Resolver,有的地方叫 Resolving Name Server,意思就是解析 DNS 的 Server。以上的查詢工作都由它來完成。
為什麼呢?首先 DNS 設計的第一目的就是要快,這是非常基礎的設施,所以必須要非常快。但是再快,全世界這麼大的量也扛不住啊,併發高?加快取!DNS 是層層快取的。快取有一個經典的問題就是,貴的快取比較快。這裡的貴不一定是價格貴。你在瀏覽器訪問 www.kawabangga.com 的時候,至少經過了瀏覽器對 DNS 的快取、電腦對 DNS 的快取,路由器對 DNS 的快取…… 瀏覽器的DNS快取肯定最快,但是無法跟其他應用共享,如果每個應用都快取的話,佔用的空間就太大了。路由器上面的快取可以給多臺電腦共享,一般又是在本地,所以理所應當的做了最多的快取。
如果在終端使用 dig 命令,會發現DNS的結果都是路由器給出的。
;; ANSWER SECTION: kawabangga.com. 3600 IN NS ns1.myhostadmin.net. kawabangga.com. 3600 IN NS ns2.myhostadmin.net. kawabangga.com. 3600 IN NS ns3.myhostadmin.net. kawabangga.com. 3600 IN NS ns4.myhostadmin.net. kawabangga.com. 3600 IN NS ns5.myhostadmin.net. kawabangga.com. 3600 IN NS ns6.myhostadmin.net. ;; Query time: 271 msec ;; SERVER: 192.168.1.1#53(192.168.1.1) ;; WHEN: Sun Mar 24 23:32:25 CST 2019 ;; MSG SIZE rcvd: 166
在這裡,路由器就是開放了53埠,來提供DNS查詢服務。它就是 Resolving Name Server,每次查詢請求發過來,它檢查自己的記憶體是否有答案,如果沒有,就執行上述的查詢過程。所以當我們執行 DNS 查詢的時候,抓包會發現發出了一個包到路由器53埠,收到了一個回到,查詢就結束了,還奇怪怎麼和書上寫的查詢過程不一樣呢?其實完整的查詢過程是在 Resolving Name Server 上面做的。
當然,一個 Resolving Name Server 並不複雜。如果我們在執行 dig 命令的時候,帶上 +trace
標誌,dig 就會作為 Resolving Name Server 的角色從 .
開始查詢直到查詢到最後的答案。
CloudFlare 提供了一個很有名的 DNS 服務, 1.1.1.1
,這其實也是 Resolving Name Server,dig 命令可以使用 @1.1.1.1
的方式來指定。系統也可以設定 DNS 解析地址(現在你明白這個設定是什麼意思了吧)。基本上需要網路的裝置都可以設定這個DNS服務地址,比如 PS4,電視盒子。很多玩家知道設定成韓國的DNS服務地址玩遊戲有時候會更快一些,原理就是這樣,DNS是一個基礎的服務,你離Resolving Name Server更近了,解析的也就更快了。Resolving Name Server 快取的命中率高,也就更快,否則的話Resolving Name Server執行起來查詢的過程也是耗費時間的。
參考資料
- How the Domain Name System (DNS) Works
- https://miek.nl/2013/november/10/why-13-dns-root-servers/
- DNS explained