1. 程式人生 > 實用技巧 >DNS協議詳解

DNS協議詳解

1、URL構成和域名體系

URL構成

URL:(Uniform Resource Locator)統一資源定位符。一條符合規範的URL對應的是伺服器的一個特定的資源(如HTML頁面,一張圖片等)。

結構如下:

scheme://hostname[:port]/path/[;parameters][?query]#fragment

  scheme:通訊協議,常用的有http、https、ftp、mailto等。
  hostname:主機域名或IP地址。
  port:埠號,可選。省略時使用協議的預設埠,如http預設埠為80。
  path:路徑由零或多個"/"符號隔開的字串組成,一般用來表示主機上的一個目錄或檔案地址。

  query:查詢,可選。用於傳遞引數,可有多個引數,用"&"符號隔開,每個引數的名和值用"="符號隔開。
  fragment:資訊片斷字串,也稱為錨點。用於指定網路資源中的片斷。

比如:

https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9230366566950910677%22%7D&n_type=0&p_from=1

其中mbd.baidu.com為主機域名。

域名體系

  域名(Domain Name)通常是使用者所在的主機名。域名格式是由若干部分組成,每個部分又稱子域名,它們之間用“.”分開,每個部分最少由兩個字母或數字組成。城名通常按分層結構來構造,每個子域名都有其特定的含義。從右到左,子域名分別表示不同的國家或地區的名稱(只有美國可以省略表示國家的頂級域名)、組織型別、組織名稱、分組織名稱和計算機名稱等。

2、DNS伺服器體系

域名伺服器實際上就是裝有域名系統的主機。由高向低進行層次劃分,可分為以下幾大類:

  • 根域名伺服器:最高層次的域名伺服器,也是最重要的域名伺服器,本地域名伺服器如果解析不了域名就會向根域名伺服器求助。全球共有13個不同IP地址的根域名伺服器,它們的名稱用一個英文字母命名,從a一直到m。這些伺服器由各種組織控制,並由 ICANN(網際網路名稱和數字地址分配公司)授權,每個根伺服器都有映象伺服器,每個根伺服器與它的映象伺服器共享同一個 IP 地址,中國大陸地區內只有6組根伺服器映象(F,I(3臺),J,L)。當你對某個根伺服器發出請求時,請求會被路由到該根伺服器離你最近的映象伺服器。所有的根域名伺服器都知道所有的頂級域名伺服器的域名和地址,如果向根伺服器發出對“jocent.me”
    的請求,則根伺服器是不能在它的記錄檔案中找到與“jocent.me”匹配的記錄。但是它會找到“me”的頂級域名記錄,並把負責“me”地址的頂級域名伺服器的地址發回給請求者。
    • 為什麼根域名伺服器只能有13個?

      通過UDP協議傳輸的DNS訊息最大長度需要限制在512位元組(不包括IP頭部、UDP頭部),超出部分要被截斷。有了最大長度限制後,一個UDP協議傳輸的DNS響應能夠返回的資源記錄數量就是有限的。512位元組的限制是在RFC 1035中規定的,為了更好的效能我們需要將響應限制在一個響應報文中完成,也就是隻有512位元組可以用了。當我們查詢根域的NS記錄時,512位元組只夠返回包含13個由A-M命名的根域名伺服器的NS記錄和A記錄的響應。NS記錄在回答區段中,A記錄在額外資訊區段中,A記錄用於幫助你接下來向根域名伺服器進一步查詢。

  • 頂級域名伺服器:負責管理在該頂級域名伺服器下注冊的二級域名。當根域名伺服器告訴查詢者頂級域名伺服器地址時,查詢者緊接著就會到頂級域名伺服器進行查詢。比如還是查詢"jocent.me",根域名伺服器已經告訴了查詢者“me”頂級域名伺服器的地址,“me”頂級域名伺服器會找到“jocent.me”的域名伺服器的記錄,域名伺服器檢查其區域檔案,並發現它有與“jocent.me”相關聯的區域檔案。在此檔案的內部,有該主機的記錄。此記錄說明此主機所在的 IP 地址,並向請求者返回最終答案。
  • 許可權域名伺服器:負責一個區的域名解析工作
  • 本地域名伺服器:當一個主機發出DNS查詢請求的時候,這個查詢請求首先就是發給本地域名伺服器的。

3、域名解析過程

域名解析總體可分為兩大步驟,第一個步驟是本機向本地域名伺服器發出一個DNS請求報文,報文裡攜帶需要查詢的域名;第二個步驟是本地域名伺服器向本機迴應一個DNS響應報文,裡面包含域名對應的IP地址。從下面對jocent.me進行域名解析的報文中可明顯看出這兩大步驟。注意:第二大步驟中採用的是迭代查詢,其實是包含了很多小步驟的,詳情見下面的流程分析。

其具體的流程可描述如下:

  1. 主機10.74.36.90先向本地域名伺服器10.74.1.11進行遞迴查詢
  2. 本地域名伺服器採用迭代查詢,向一個根域名伺服器進行查詢
  3. 根域名伺服器告訴本地域名伺服器,下一次應該查詢的頂級域名伺服器dns.me的IP地址
  4. 本地域名伺服器向頂級域名伺服器dns.me進行查詢
  5. 頂級域名伺服器me告訴本地域名伺服器,下一步查詢許可權伺服器dns.jocent.me的IP地址
  6. 本地域名伺服器向許可權伺服器dns.jocent.me進行查詢
  7. 許可權伺服器dns.jocent.me告訴本地域名伺服器所查詢的主機的IP地址
  8. 本地域名伺服器最後把查詢結果告訴 10.74.36.90

其中有兩個概念遞迴查詢和迭代查詢,其實在整個描述的過程中已經體現的很明顯,這裡再說明一下:

  • 遞迴查詢:本機向本地域名伺服器發出一次查詢請求,就靜待最終的結果。如果本地域名伺服器無法解析,自己會以DNS客戶機的身份向其它域名伺服器查詢,直到得到最終的IP地址告訴本機
  • 迭代查詢:本地域名伺服器向根域名伺服器查詢,根域名伺服器告訴它下一步到哪裡去查詢,然後它再去查,每次它都是以客戶機的身份去各個伺服器查詢

4、DNS報文結構

5、Wireshark抓包分析