【計算機網路】 一個小白的DNS學習筆記

之前一直在博客園寫作,最近幾天才開的知乎專欄,這段時間我會每天從博客園搬運一篇博客到知乎上來。才疏學淺, 謬誤之處請不吝於評論區指教,謝謝大家。我的博客園博客地址: 外婆的彭湖灣 - 博客園

參考書籍

《計算機網路-自頂向下》 作者 James F. Kurose

DNS的作用

DNS是網際網路的目錄服務

DNS是網際網路的目錄服務,它提供了主機名到IP地址映射的查詢服務。這種服務的起源之一是人和路由器的需求之間的矛盾,主機可以用主機名或IP地址標識,對我們人來說,我們很喜歡像taobao.com或者是baidu.com之類的由便於記憶的單片語成的主機名, 但對於路由器來說,它難以處理這種字母數字組成的主機名,而更能接受IP地址。所以DNS就是根據主機名查詢對應的IP地址的服務。

當然,DNS的作用不止於此,下面是DNS的提供具體服務列表:

DNS提供的具體服務列表

  • 提供了主機名到IP地址映射的查詢服務
  • 提供主機別名(host aliasing)服務,有著複雜主機名的主機可以有一個或者多個別名,例如aaa.xxx.com的主機可能還會有aaa.comaaa.com兩個別名,在這種情況下,aaa.xxx.com叫做規範主機名(canonical hostname)。主機別名的特徵是比規範主機名更容易記憶,DNS可以提供根據主機別名獲取規範主機名的服務
  • 提供負載分配服務(load distribution) 一般來說,被繁忙訪問的大型站點是分布在多台伺服器上的, 這個時候,主機名和IP地址就不是一一對應的關係,而是一個主機名對應一個IP地址的集合。 在大量的,連續的多次訪問中,DNS通過旋轉IP地址達到負載均衡的目的:在向這個主機名發出DNS請求的時候,伺服器會用包含全部這些IP地址的報文進行回答,但在每個不同的回答中會旋轉這些IP地址的擺放順序,而客戶機總向報文中排在最前的IP地址發出請求

DNS的性質

我們可以從兩個層面上來理解DNS:

第一,從協議的層面看,它是一種應用層協議

第二,從實體的層面看,它是一個由分層的DNS伺服器實現的分散式資料庫

DNS的的工作過程

當我們在一台客戶端上通過瀏覽器訪問someschool.edu/index.ht的時候,DNS的工作過程是這樣的:

  1. 在這台用戶主機上運行有DNS的客戶機
  2. 該瀏覽器從上述URL中抽取someschool.edu,發給本主機的DNS客戶機
  3. DNS客戶機向DNS伺服器發送一個包含主機名someschool.edu的請求
  4. 返回的響應報文里包含有目的IP地址,由瀏覽器獲取並對該IP地址對應的HTTP伺服器發起一個TCP連接。

DNS伺服器的層次和類別

DNS伺服器是有層次的,它可以分為三種類型:根DNS伺服器, 頂級域(Top-Level Domain, TLD )DNS伺服器和權威DNS伺服器,分別對應下面三個層次(從上至下)

根DNS伺服器

網際網路上有13個根DNS伺服器, 其中大部分分布在北美洲,下面顯示的是2012年的根DNS伺服器分布圖

頂級域DNS伺服器

頂級域伺服器負責頂級域名,如com,org,net,edu和gov和所有國家的頂級域名如cn,uk,jp

(edu 教育機構域名, gov 政府部門域名 , org 非盈利性的組織 ,com 企業域名 )

權威DNS伺服器

在網際網路上具有公共可訪問的主機的每個組織機構必須提供公共可訪問的DNS記錄,這些記錄將這些主機的名字映射為IP地址。

由組織機構的權威DNS伺服器保存這些DNS記錄,組織機構可以選擇實現它自己的權威DNS伺服器來保持這些記錄,或者通過支付費用將這些記錄存儲在某個服務提供商的DNS伺服器中。多數大學和大公司實現和維護它們自己基本的權威DNS伺服器

本地DNS伺服器

(不在上面的三層DNS結構中)

還有一類比較重要的DNS伺服器,叫做本地DNS伺服器(local DNS server),它並不在我們上面所說的DNS層次結構中。

本地DNS伺服器的作用

  • 主機和本地DNS伺服器一般是相鄰的,當主機發出DNS請求的時候,該請求會被發往本地DNS伺服器,它起著代理的作用,並將該請求轉發到DNS伺服器層次結構中
  • 本地DNS伺服器可以通過緩存主機名/IP地址,減少對相同主機名的查詢而消耗的時間,改善時延和性能

DNS的工作機理

我們上面說到,DNS從實體的角度上看,就是一個分散式的資料庫,那麼它是如何實現關鍵數據的查詢和插入的呢?

在DNS中查詢記錄

實際上,在DNS服務中, 並不能通過對某個DNS伺服器,通過僅僅一次的「請求/響應」就取得主機名/IP地址的查詢結果。相反,需要多個不同的DNS伺服器之間進行多次交互才能獲取最終的查詢結果

如下圖所示:

例如上圖所示的例子中,主機cis.poly.edu想知道主機gaia.cs.umass.edu的IP地址,並且

主機gaia.cs.umass.edu的權威DNS伺服器為dns.umass.edu

則DNS查詢過程如下:

  1. 主機cis.poly.edu首先向它的本地DNS伺服器dns.poly.edu發送一個DNS查詢報文,該查詢報文包含有要求轉換的主機名gaia.cs.umass.edu
  2. 本地DNS伺服器dns.poly.edu將該報文轉發至根DNS伺服器。
  3. 該根DNS伺服器注意到DNS伺服器的edu前綴並向本地DNS伺服器dns.poly.edu返回負責edu的頂級域DNS伺服器的IP地址列表
  4. 本地DNS伺服器接收到了返回的報文,根據報文中的IP地址,向該頂級域DNS伺服器發送查詢報文
  5. 頂級域DNS伺服器注意到了umass.edu前綴,用包含權威DNS伺服器的IP地址進行響應,該權威DNS伺服器是負責馬薩諸塞大學的dns.umass.edu
  6. 本地DNS伺服器直接向主機dns.umass.edu重發查詢報文
  7. 主機dns.umass.edu使用gaia.cs.umass.edu的IP地址作為響應,傳回給本地DNS伺服器
  8. 最終,本地DNS伺服器將包含最終結果的查詢報文轉發給請求主機cis.poly.edu

總共8份報文

可以看到,這8份報文由以下兩部分組成:

  • 請求主機和本地DNS伺服器的請求/響應,共兩份報文
  • 本地DNS伺服器和根DNS伺服器,頂級域DNS伺服器,權威DNS伺服器的請求響應,共6份報文

DNS記錄的格式

DNS伺服器上存儲著資源記錄(Resource Record, RR), 資源記錄是一個包含了下列欄位的四元組:

(Name, Value, Type, TTL)

TTL是該記錄的生存時間,它決定了該記錄應當從緩存中刪除的時間

忽略TTL,Name和Value的的具體含義取決於Type:

  • Type = A,則Name是主機名,Value是該主機名對應的IP地址。 例如: (relay1.bar.foo.com, 145.37.93.126, A)
  • Type = NS,則Name是域(如foo.com),而Value是知道如何獲取該域中主機IP地址的權威DNS伺服器的主機名,如(foo.com, dns.foo.com, NS)
  • Type = CNAME, 則Value是別名為Name的主機對應的規範主機名,如(foo.com, relay1.bar.foo.com

以上面那幅DNS請求的圖示為例

1.如果一台DNS伺服器是某個特定主機名的權威DNS伺服器,那麼該DNS伺服器一定會有一條包含該主機名的類型A記錄,因為主機dns.umass.edu是主機gaia.cs.umass.edu的權威DNS伺服器,所以dns.umass.edu中可能包含這樣一條記錄:

(gaia.cs.umass.edu, 145.33.76.751, A)

2. 如果一台DNS伺服器是某個特定主機名的權威DNS伺服器,那麼該伺服器將包含一條A記錄和一條類型NS記錄,例如edu頂級域DNS伺服器並不是機gaia.cs.umass.edu的權威DNS伺服器,那麼它將包含

  • 一條指向權威DNS伺服器主機名的NS記錄(umass.edudns.umass.edu,NS)
  • 一條解釋該權威DNS伺服器IP地址的A記錄(dns.umass.edu, 128.119.40.111, A)

在DNS中插入記錄

我們上面介紹了DNS中查詢記錄的過程,那麼這些記錄是如何被插入的呢?

假設你剛剛創建了一個網路烏托邦(Network Utopia)公司, 要做的第一件事情就是到註冊登記機構註冊域名networkutopia.com), 註冊的時候,需要向該機構提供你的權威DNS伺服器的名字和IP地址,該註冊機構將確保將一個NS記錄和A記錄被插入com頂級域DNS伺服器中。

例如,假設我們的網路烏托邦(Network Utopia)公司的權威伺服器的主機名和IP地址為dns1.networkutopia.com 和 128.119.40.111,則該註冊機構將以下記錄插入com頂級域DNS伺服器

  • (networkutopia.com, dns1.networkutopia.com,NS)
  • (dns1.networkutopia.com, 128.119.40.111,A)

DNS報文格式

DNS報文格式圖示如下:


推薦閱讀:

從 0 開始學習 GitHub 系列之【向 GitHub 提交代碼】
你們是怎麼自學一門新技術的(僅限編程)?
極樂技術周報(第十七期)
分散式計算框架MapReduce

TAG:计算机网络 | 编程 |