DNS 靈魂三問:why,when,how

沒故事的卓同學發表於2018-01-15

本文將討論三個問題:

  • 為什麼要有 DNS
  • 什麼時候進行 DNS 查詢
  • DNS 如何工作

DNS 是 Domain Name System 的縮寫,作用很簡單,根據域名查詢對應的 IP 地址。

為什麼要有 DNS

TCP/IP 約定每個網路請求包根據 IP 地址確認接收方。這和你打電話需要知道對方電話號碼一樣。

因為 IP 地址不好記憶,所以有了一層域名對映。

為什麼不設計成直接根據域名確認接收方呢?

在 iPv4 裡,IP 地址是 4 個 0-255 的數,2 的 8 次方,8 bit,1 byte。只要 4 個位元組的大小。 如果是支援字串,就算用最簡單的 ASCII 編碼,一個字元就要 1 個位元組。一個常見的域名通常十幾個字元,最長可以支援 255 個字元,比用 IP 表示大了很多倍。

有的人可能覺得雖然大了很多倍,但是如果只是一個請求大了幾個位元組效能影響也不大。這裡面還有一個誤區,TCP/IP 只是一個協議,網路中和通訊有關裝置是多種多樣的。比如我傳送一個 5 KB 的字串,中間有可能通過光纖傳遞傳遞,也有可能通過早期的銅纜。不同的連線材料的頻寬區別很大。有可能一個包的 maxSize 只能是 1 KB(IP 層的 MTU)。應用層的資料在通訊過程中會根據通訊裝置的頻寬分成很多個包。一個 http 請求並不是只發了一個包,可能一次請求被拆成了很多個包。所以如果用域名,網路請求的資料量會增加很多。

什麼時候進行 DNS 查詢

現在我們知道最後通訊的時候我們通過 DNS 獲得了一個 IP 地址。當我們在瀏覽器輸入一個 URL 後,是在什麼時候、誰進行的查詢?

瀏覽器獲得這個請求後,甩給了作業系統,作業系統甩給了網路卡,網路卡作為真正幹活的人把包按照鏈路層協議送了出去。

DNS 發生在 TCP/IP 之前。前面已經提過,到 TCP/IP 協議棧的時候已經是有 IP 地址了。為什麼不把 DNS 定義在 TCP/IP 裡呢?反正網路請求都是 TCP/IP 負責,如果發現是域名就順便解析一下唄。 這就是架構設計的美妙。聯想一下我們實際生活的場景,你要寄一個禮物給遠方的朋友,收件員來了,他會關心收件人的地址你是怎麼查到的嗎?他有提供根據收件人姓名提供地址的服務嗎?他順便做了也很好啊。沒做是因為這不是他們的核心業務。同樣,TCP/IP 只負責通訊,不負責 IP 地址的查詢

真相就是作業系統進行的 DNS 查詢。所以在作業系統的網路設定中,可以進行 DNS 伺服器的配置。作業系統也同時管理了 DNS 的快取。《iOS網路請求優化之DNS對映》中提到:

像 iOS 系統一般是 24 小時之後會過期,還有進入飛航模式再切回來,開關機,重置網路設定等也會導致 DNS cache 的清除。所以一般情況下使用者在第二天開啟你的 app 都會經歷一次完整的 DNS 解析請求。

DNS 如何工作

一個簡單的版本,在世界的中心有一臺伺服器,伺服器裡有一個資料庫,資料庫裡有一張表,這張表裡存著域名和 IP 地址的記錄。你想要查什麼伺服器都給你。

如果產品經理描述應該就是這樣的,接著會說這是一個小需求,什麼時候可以上線。

DNS 靈魂三問:why,when,how

DNS 不僅只是查詢 IP

除了域名解析的 A 記錄。還包括了 MX(Mail eXchange)郵件伺服器地址,還有別名 CNAME 記錄。 實際上還有很多其他功能,比如根據 IP 地址反查域名(PTR),查詢域名 DNS 伺服器 IP 地址(NS)。

不是一臺伺服器,是分散式伺服器

網際網路中有那麼多的域名,全部都存在一臺伺服器中顯然是不可能的。全世界每天有那麼多的域名新增、修改,如果全往一臺伺服器做 IO ,效能多強也扛不住。

DNS 是分層的資料庫結構。

比如一個域名 live.apple.com, 分成了4層:根域名、com、apple、live。根域名是用.表示,因為域名的最後的.可以被忽略,所有常常被人遺忘,完整的域名錶示是live.apple.com.

DNS 靈魂三問:why,when,how
假設我們要解析這個域名的 IP ,會去系統配置的 DNS 伺服器查,如果 DNS 伺服器沒有這個域名的快取,則會去根域名的伺服器查出負責 com 域名的伺服器,接著再從 com 找到 apple 的域名。

如果我們就持有 apple 域名,apple 下的子域名我們可以自己控制。有兩種控制方式,一種是直接把子域名一起註冊到 apple 域名裡,記錄在 com 域名伺服器下。一種是自建 name server,就是前面提到的 NS 記錄。此時向 com 域名查詢 apple,會返回你自己配置的 name server 伺服器地址,解析就由你自己控制了。

自建 name server 通常是對域名商的 ns 效能不滿意。《DNS 基礎知識》裡提到:

雖然頂級域名註冊商都有自己的 nameserver, 但註冊商提供的 nameserver 並不專業,在效能和穩定性上無法滿足企業需求,這時就需要企業搭建自己的高效能 nameserver ,比如增加智慧解析功能,讓不同地域的使用者訪問最近的 IP,以此來提高服務質量。

根域名伺服器

為什麼 DNS 伺服器知道根域名伺服器的地址呢?根域名伺服器的地址是固定的,目前全球有 13 個根域名解析伺服器,這 13 條記錄持久化在每臺 DNS 伺服器中。

為什麼是 13 條?因為 DNS 使用 UDP 查詢,UDP 在 IPv4 內的最大有效大小為 512 位元組。要讓所有的根域名包含在一個報文裡,只能把數量限制在 13 個。根域名伺服器用單個字母表示,中國大陸境內共有 F、I、J、L 這 4 個根域的 6 臺DNS映象(L 有三臺映象)在提供服務。

幸運的是,採用 anyCast 技術架設映象伺服器可解決該問題,並使得實際執行的根域名伺服器數量大大增加。截至 2017 年 11 月,全球共有 800 臺根域名伺服器在執行。

智慧解析

智慧解析,就是當一個域名對應多個 IP 時,當你查詢這個域名的 IP,會返回離你最近的 IP。 由於國內不同運營商之間的頻寬很低,所以電信使用者訪問聯通的 IP 就是一個災難,而智慧 DNS 解析就能解決這個問題。

智慧解析依賴 EDNS 協議,這是 google 起草的 DNS 擴充套件協議, 修改比較簡單,就是在 DNS 包裡面新增 origin client IP, 這樣 nameserver 就能根據 client IP 返回距離client 比較近的 server IP 了。

國內最新支援 EDNS 的就是 DNSPod 了,DNSPod 是國內比較流行的域名解析廠商,很多公司會把域名利用DNSPod 加速, 它已經被鵝廠收購。

負載均衡、CDN 的實現也利用了 DNS 智慧解析。


參考:


歡迎關注我的微博:@沒故事的卓同學

掘金部落格地址:juejin.im/user/5624c8…

如果想與我有更密切的交流也可以加入我的小密圈:程式設計師生存指南

相關文章