超詳細 DNS 協議解析

🔊 本文收納於 ⭐ CS-Wiki(Gitee 推薦項目,0.9k star), 歡迎 star ~ 😊git


0. 前言

爲了保證網址的正常訪問,域名解析協議(DNS)其實在背後作出了不少努力,本文將透徹講解 DNS 協議的原理,瞭解咱們天天都在接觸的網址究竟是怎麼工做的。面試

1. 什麼是 DNS 協議

在學習 DNS 協議以前,咱們先區分一下域名和 IP 地址這個兩個概念:算法

  • IP 地址:一長串可以惟一地標記網絡上的計算機的數字
  • 域名:又稱網域,是由一串用點分隔的名字組成的 Internet 上某一臺計算機或計算機組的名稱,用於在數據傳輸時對計算機的定位標識(有時也指地理位置)好比 www.baidu.com
不知道有沒有同窗會混淆域名和 網址的概念,能夠這樣理解,網址裏面含有域名。舉個例子: www.gitee.com/veal98 就是一個網址,而 www.gitee.com 就是域名

<u>因爲 IP 地址具備不方便記憶而且不能顯示地址組織的名稱和性質等缺點</u>,人們設計出了域名,並經過域名解析協議(DNS,Domain Name System)來將域名和 IP 地址相互映射,令人更方便地訪問互聯網,而不用去記住可以被機器直接讀取的 IP 地址數串。將域名映射成 IP 地址稱爲正向解析,將 IP 地址映射成域名稱爲反向解析。數據庫

💡 DNS 協議可使用 UDP 或者 TCP 進行傳輸,使用的端口號都爲 53。但 大多數狀況下 DNS 都使用 UDP 進行傳輸

2. 域名詳解

❓ 那麼域名由誰來規定和管理呢?不能是隨便寫吧?瀏覽器

全世界域名的最高管理機構,是一個叫作 ICANN (Internet Corporation for Assigned Names and Numbers)的組織,總部在美國加州。ICANN 負責管理全世界域名系統的運做緩存

域名實際上是具備必定的層次結構的,從上到下依次爲:根域名頂級域名(top level domain,TLD)、二級域名、(三級域名)服務器

① 頂級域名

先來說講頂級域名(TLD),即最高層級的域名。簡單說,就是網址的最後一個部分。好比,網址www.baidu.com 的頂級域名就是 .com。ICANN 的一項主要工做,就是規定哪些字符串能夠看成頂級域名。截至 2015 年 7 月,頂級域名共有 1058 個,它們大體能夠分紅兩類:網絡

  • 一類是通用頂級域名(gTLD),好比.com.net.edu.org.xxx等等,共有 700 多個。
  • 另外一類是國家頂級域名(ccTLD),表明不一樣的國家和地區,好比.cn(中國)、.io(英屬印度洋領地)、.cc( 科科斯羣島)、.tv(圖瓦盧)等,共有 300 多個。

固然,ICANN 本身不會去管理這些頂級域名,由於根本管不過來。想一想看,頂級域名有1000多個,每一個頂級域名下面都有許多批發商,若是每一個都要管,就太麻煩了。ICANN 的政策是,每一個頂級域名都找一個託管商,該域名的全部事項都由託管商負責。ICANN 只與託管商聯繫,這樣管理起來就容易多了。舉例來講,.cn 國家頂級域名的託管商就是中國互聯網絡信息中心(CNNIC),它決定了 .cn 域名的各類政策。數據結構

② 二級域名

二級域名(Second Level Domain,SLD) 在通用頂級域名或國家頂級域名之下具備不一樣的意義:app

  • 通用頂級域名下的二級域名:通常是指域名註冊人選擇使用的網上名稱,如 yahoo.com(商業組織一般使用本身的商標、商號或其餘商業標誌做爲本身的網上名稱,如 baidu.com
  • 國家頂級域名下的二級域名:通常是指相似於通用頂級域名的表示註冊人類別和功能的標誌。例如,在 .com.cn 域名結構中,.com 此時是置於國家頂級域名 .cn 下的二級域名,表示中國的商業性組織,以此類推。

三級域名是形如 www.baidu.com 的域名,能夠當作是二級域名的子域名,特徵爲域名包含兩個 .。對於域名全部者/使用者而言,三級域名都是二級域名的附屬物而無需單獨費用。三級域名甚至不能稱爲域名,通常稱之爲域名下的 「二級目錄」

③ 根域名

❓ 那麼根域名在哪裏呢?在層次結構中根域名不是最頂級的嗎?域名中怎麼沒有看見它?

因爲 ICANN 管理着全部的頂級域名,因此它是最高一級的域名節點,被稱爲根域名(root domain)。在有些場合,www.xxx.com 被寫成 www.xxx.com.,即最後還會多出一個點。這個點就是根域名。

理論上,全部域名的查詢都必須先查詢根域名,由於只有根域名才能告訴你,某個頂級域名由哪臺服務器管理。事實上也確實如此,ICANN 維護着一張列表(根域名列表),裏面記載着頂級域名和對應的託管商

好比,我要訪問abc.xyz,也必須先去詢問根域名列表,它會告訴我 .xyz 域名由 CentralNic 公司託管。根域名列表還記載,.google由谷歌公司託管,.apple由蘋果公司託管等等。

因爲根域名列表不多變化,大多數 DNS 服務商都會提供它的緩存,因此根域名的查詢事實上不是那麼頻繁。

3. 域名服務器詳解

域名服務器是指管理域名的主機和相應的軟件,它能夠管理所在分層的域的相關信息。一個域名服務器所負責管裏的分層叫做 區 (ZONE)。域名的每層都設有一個域名服務器:

  • 根域名服務器
  • 頂級域名服務器
  • 權限域名服務器

下面這幅圖就很直觀了:

除了上面三種 DNS 服務器,還有一種不在 DNS 層次結構之中,可是很重要的 DNS 服務器,即本地域名服務器。下面咱們分別講解這四種服務器都是用來幹什麼的 👇

① 根域名服務器

上面咱們提到,ICANN 維護着一張根域名列表,裏面記載着頂級域名和對應的託管商,其實根域名列表的正式名稱是 DNS 根區(DNS root zone),<u>保存 DNS 根區文件的服務器</u>,就叫作 DNS 根域名服務器(root name server)。根域名服務器保存全部的頂級域名服務器的地址

因爲早期的 DNS 查詢結果是一個 512 字節的 UDP 數據包。這個包最多能夠容納 13 個服務器的地址,所以就規定全世界有 13 個根域名服務器,編號從 a.root-servers.net 一直到 m.root-servers.net。其中 10 臺設置在美國,另外各有一臺設置於荷蘭、瑞典和日本。

前面咱們說過,理論上全部域名的查詢都必須先查詢根域名,因此通常來講全部的域名服務器都會註冊一份根域名服務器的 IP 地址的緩存,用於在必要的時候向其發送請求。

② 頂級域名服務器

按照根域名服務器管理頂級域名的邏輯,頂級域名服務器顯然就是用來管理註冊在該頂級域名下的全部二級域名的,記錄這些二級域名的 IP 地址

③ 權限域名服務器

按照上面的邏輯,權限域名服務器應該是管理註冊在二級域名下的全部三/四級域名的,但其實不是這樣,若是一個二級域名或者一個三/四級域名對應一個域名服務器,則域名服務器數量會不少,咱們須要使用劃分區的辦法來解決這個問題。那麼權限域名服務器就是負責管理一個「」的域名服務器。

❓ 什麼是區?怎樣劃分區呢?

區和域實際上是不一樣的,區能夠有多種不一樣的劃分方法。以百度爲例,咱們假設有 fanyi.baidu.comai.baidu.comtieba.baidu.com 這三個三級域名。咱們能夠這樣分區,fanyi.baidu.comtieba.baidu.com 放在 baidu.com 權限域名服務器,ai.baidu.com 放在 ai.baidu.com 權限域名服務器中。而且 baidu.com 權限域名服務器和 ai.baidu.com 權限域名服務器是同等地位的,而具體怎麼分區是百度公司根據域名多少、訪問多少等狀況去本身規定的。

畫個圖直觀理解一下:

④ 本地域名服務器

除了上面三種 DNS 服務器,還有一種不在 DNS 層次結構之中,可是很重要的 DNS 服務器,就是本地域名服務器(也被稱爲權威域名服務器)。本地域名服務器是電腦解析時的默認域名服務器,即電腦中設置的首選 DNS 服務器和備選 DNS 服務器。常見的有電信、聯通、谷歌、阿里等的本地 DNS 服務。

每一個因特網服務提供者或一所大學,甚至一所大學中的各個系,均可以擁有一個本地域名服務器。當一臺主機發出 DNS 查詢請求時,這個查詢請求報文就發送給該主機的本地域名服務器本地域名服務器管理本地域名的解析和映射,而且可以向上級域名服務器進行查詢

那麼具體本地域名服務器是如何向上級域名服務器轉發查詢請求的呢?

4. DNS 查詢方式

具體 DNS 查詢的方式有兩種:

  • 遞歸查詢
  • 迭代查詢

所謂迭代就是,若是請求的接收者不知道所請求的內容,那麼接收者將扮演請求者,發出有關請求,直到得到所須要的內容,而後將內容返回給最初的請求者。

👍 通俗點來講,在遞歸查詢中,若是 A 請求 B,那麼 B 做爲請求的接收者必定要給 A 想要的答案;而迭代查詢則是指,若是接收者 B 沒有請求者 A 所須要的準確內容,接收者 B 將告訴請求者 A,如何去得到這個內容,可是本身並不去發出請求。

通常來講,域名服務器之間的查詢使用迭代查詢方式,以避免根域名服務器的壓力過大。經過下面這兩個圖就能很好的理解了 👇

1)遞歸查詢:

2)迭代查詢:

5. 域名緩存

上面講解的是域名服務器之間的 DNS 查詢請求過程,但實際上,每一個時刻都有無數網民要上網,那每次都去訪問本地域名服務器去獲取 IP 地址顯然是不實際的。解決方法就是使用緩存保存域名和 IP 地址的映射

計算機中 DNS 記錄在本地有兩種緩存方式:瀏覽器緩存和操做系統緩存。

1)瀏覽器緩存:瀏覽器在獲取網站域名的實際 IP 地址後會對其進行緩存,減小網絡請求的損耗。每種瀏覽器都有一個固定的 DNS 緩存時間,如 Chrome 的過時時間是 1 分鐘,在這個期限內不會從新請求 DNS

2)操做系統緩存:操做系統的緩存實際上是用戶本身配置的 hosts 文件。好比 Windows10 下的 hosts 文件存放在 C:WindowsSystem32driversetchosts

Windows 系統默認開啓 DNS 緩存服務,服務名是 DNSClient,能夠緩存一些經常使用的域名。

使用命令 ipconfig/displaydns 能夠查看電腦中緩存的域名。

⭐ 在瀏覽器中進行訪問的時候,會優先查詢瀏覽器緩存,若是未命中則繼續查詢操做系統緩存,最後再查詢本地域名服務器,而後本地域名服務器會遞歸的查找域名記錄,最後返回結果。主機和本地域名服務器之間的查詢方式是遞歸查詢,也就是說主機請求本地域名服務器,那麼本地域名服務器做爲請求的接收者必定要給主機想要的答案。

6. 完整域名解析過程

OK,將咱們上面所說的域名服務器之間的 DNS 查詢請求過程和域名緩存結合起來,就是一個完整的 DNS 協議進行域名解析的過程。這裏咱們以正向解析爲例(域名解析成 IP 地址):

1)首先搜索瀏覽器的 DNS 緩存,緩存中維護一張域名與 IP 地址的對應表;

2)若沒有命中,則繼續搜索操做系統的 DNS 緩存

3)若仍然沒有命中,則操做系統將域名發送至本地域名服務器,本地域名服務器查詢本身的 DNS 緩存,查找成功則返回結果(注意:主機和本地域名服務器之間的查詢方式是遞歸查詢);

4)若本地域名服務器的 DNS 緩存沒有命中,則本地域名服務器向上級域名服務器進行查詢,經過如下方式進行迭代查詢(注意:本地域名服務器和其餘域名服務器之間的查詢方式是迭代查詢,防止根域名服務器壓力過大):

  • 首先本地域名服務器向根域名服務器發起請求,根域名服務器是最高層次的,它並不會直接指明這個域名對應的 IP 地址,而是返回頂級域名服務器的地址,也就是說給本地域名服務器指明一條道路,讓他去這裏尋找答案
  • 本地域名服務器拿到這個頂級域名服務器的地址後,就向其發起請求,獲取權限域名服務器的地址
  • 本地域名服務器根據權限域名服務器的地址向其發起請求,最終獲得該域名對應的 IP 地址

4)本地域名服務器將獲得的 IP 地址返回給操做系統,同時本身將 IP 地址緩存起來

5)操做系統將 IP 地址返回給瀏覽器,同時本身也將 IP 地址緩存起來

6)至此,瀏覽器就獲得了域名對應的 IP 地址,並將 IP 地址緩存起來

配合下圖直觀理解:

🎉 關注公衆號 | 飛天小牛肉,即時獲取更新

  • 博主東南大學研一在讀,利用課餘時間運營一個公衆號『 飛天小牛肉 』,2020/12/29 日第一次開通,專一分享計算機基礎(數據結構 + 算法 + 計算機網絡 + 數據庫 + 操做系統 + Linux)、Java 基礎和麪試指南的相關原創技術好文。本公衆號的目的就是讓你們能夠快速掌握重點知識,有的放矢。但願你們多多支持哦,和小牛肉一塊兒成長 😃

在這裏插入圖片描述

相關文章
相關標籤/搜索