簡單理解DNS服務

原文鏈接 - Joker's
歡迎大家訪問我的個人博客:)

這兩天看的東西,突發奇想寫篇以“是什么-為什么-怎么用”為主線的 DNS 服務理解。
主要參考書籍為《計算機網絡:自頂向下方法》和《深入分析Java Web技術內幕》。

是什么

首先我們拋出問題:DNS 是什么?

我引用維基百科的原話:域名系統(英文:Domain Name System,縮寫:DNS)是互聯網的一項服務。它作為將域名和 IP 地址相互映射的一個分布式數據庫,能夠使人更方便地訪問互聯網。DNS 使用 TCP 和 UDP 端口53。當前,對于每一級域名長度的限制是63個字符,域名總長度則不能超過253個字符。

短短幾行,包含了不少內容,我抓重點來說,DNS 的作用就是域名和 IP 地址的相互映射。那么,為什么要讓域名和 IP 地址相互映射呢?下面讓我們從原因出發,了解 DNS 服務。

為什么

換一種說法,引用《計算機網絡:自頂向下方法》中的小節標題來定義:DNS 是互聯網的目錄服務

這個說法我是非常同意的。

我們知道,域名即主機名。主機名- IP 地址的關系可以類比為姓名-身份證號的關系。我們想要訪問一臺主機,需要知道它的主機名,就像我們在找人的時候需要知道這個人的姓名一樣,當然對于人來講,通過身份證號我們也可以找到他,但大多數人不會這么做。為什么呢?因為不好記呀。對于主機也是一樣的,因為 Web 應用的主要使用者就是我們,我們很難把 IP 地址這種一長串的數字記住,所以用主機名來標志它。而對于計算機或者路由器來說,32位的等長二進制則比不定長的字符串好處理的多(尤其是根據 IP 地址劃分子網等行為會影響路由器的轉發過程)。因此,我們需要二者之間的轉換,也就是 DNS 服務。

怎么用

知道了 DNS 是什么,以及為什么要使用 DNS 以后,我們需要來看下 DNS 具體是怎樣使用的,它的工作過程是什么。

怎么設計的

最簡單的想法:在整個因特網上只使用一個 DNS 服務器。

這樣可能會出現很多問題:

  • 單點故障。考慮下該 DNS 服務器崩潰的情況?
  • 通信容量。該 DNS 服務器需要處理所有的 DNS 查詢。
  • 遠距離的集中式數據庫。假如說該 DNS 服務器被放在北美,而我們從中國訪問?中間或許要經過許多低速和擁塞的鏈路。想想就覺得很扎心吧。
  • 維護。為所有的互聯網主機保存記錄。想下這個數據庫得有多大?而且還會頻繁發生變化。

綜合以上幾點,不可能使用集中式數據庫。所以 DNS 的設計采用了分布式的設計方案。也就是說,DNS 是一個在因特網上實現的分布式數據庫

DNS層次結構.png

DNS 的層次結構如上圖。大致把 DNS 服務器分為三種類型:

  • 根 DNS 服務器(最上面一層)
  • 頂級 DNS (General top-level domain,縮寫為 gTLD)服務器(第二層)
  • 權威 DNS 服務器(第三層)

此外,還有一類叫本地 DNS (Local DNS,縮寫為 LDNS)服務器。每個 ISP 都有一臺 LDNS。

怎么查詢(解析)的

這個問題可以轉化為:當一個用戶在瀏覽器中輸入 www.baidu.com 并按下回車時,DNS 解析過程是什么?
首先,我們考慮緩存。DNS 的結果緩存有以下幾種:

DNS結果緩存.png

緩存檢查過程:

  1. 瀏覽器會檢查緩存中有沒有域名對應的解析過的 IP 地址,如果有,解析過程結束。
  2. 如果瀏覽器緩存中沒有,瀏覽器會查找操作系統緩存中是否有對應的結果,也就是檢查 hosts 文件中是否存在該域名對應的 IP 地址。(在 Windows 中 hosts 文件路徑為 C:\Windows\System32\drivers\etc\hosts,在 Linux 中為 /etc/hosts)
  3. 如果前兩個步驟都得不到結果,那么用戶主機會向 LDNS(上面提到的 本地 DNS 服務器)發送一個 DNS 查詢報文,此時查詢 LDNS 的緩存。(在 Windows 下可以通過 ipconfig 查看 LDNS,在 Linux 中從 /etc/resolv.conf 文件中查看。

80% 的域名解析過程到上面三步就結束了。還沒有命中結果的話,需要繼續以下流程。
DNS 服務器分層查詢過程(遞歸查詢 + 迭代查詢):

  1. 如果 LDNS 服務器依然沒有命中(第三步),LDNS 服務器會把查詢報文轉發到根 DNS 服務器。
  2. 根 DNS 服務器注意到 com 前綴并向 LDNS 返回負責查詢域 com 的 gTLD 的 IP 地址列表。
  3. 該 LDNS 再向上一部返回的 gTLD 之一發送查詢報文。
  4. gTLD 服務器查找并返回此域名對應的權威 DNS 服務器(可能是某個大學/公司的域名服務器,如上圖所示,例如 dns.baidu.com),這個域名服務器通常是你注冊的域名服務器。
  5. 權威 DNS 服務器會查詢域名和 IP 地址的映射關系表,在正常情況下得到目標 IP 地址后,連同一個 TTL 值返回給 LDNS 服務器。
  6. 返回該域名對應的 IP 和 TTL 值,LDNS 會緩存這個域名和 IP 的對應關系,緩存的時間由 TTL 值控制。
  7. 把解析的結果返回給用戶,用戶根據 TTL 值緩存在本地系統緩存中,域名解析過程結束。

注:在這里我們假設了 gTLD 服務器知道用于主機的權威 DNS 服務器的 IP 地址。但在實際情況中,可能要經過若干個中間的 DNS 服務器,才能知道該權威 DNS 服務器的 IP,所以不止上述幾步。

下面我通過圖來展示 DNS 服務器分層查詢的過程:


DNS查詢過程.png

可以看到,從 1 發出的查詢為遞歸查詢,后續三個查詢(2、4、6)為迭代查詢。

小結

以上幾部分是我按照一定的邏輯思維順序,結合書籍與自己的理解給出的 DNS 服務的有關內容。圖片部分是我用 processon 和百度腦圖自己畫的。

對 DNS 服務的理解大致到此了。如果有什么疑問,歡迎大家留言。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 目錄: 一些基本概念主機名DNS名稱解析DNS 解析的后端存儲名稱解析總結 大規模域名解析的體系架構DNS 解析需...
    C86guli閱讀 12,533評論 3 34
  • DNS(Domain Name System,域名系統),因特網上作為域名和IP地址相互映射的一個分布式數據庫,能...
    一直在努力hard閱讀 4,678評論 3 19
  • 14.1 引言 域名系統(DNS)是一種用于TCP/IP應用程序的分布式數據庫,它提供主機名字和IP地址之間的轉換...
    張芳濤閱讀 1,919評論 0 8
  • 1.這篇文章不是本人原創的,只是個人為了對這部分知識做一個整理和系統的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,129評論 6 174
  • 個人認為,Goodboy1881先生的TCP /IP 協議詳解學習博客系列博客是一部非常精彩的學習筆記,這雖然只是...
    貳零壹柒_fc10閱讀 5,090評論 0 8