1. 程式人生 > >應用層之DNS域名系統

應用層之DNS域名系統

1.概述

在因特網中,識別一臺主機有兩種方式,通過主機名或者IP地址。人們喜歡便於記憶的主機名標識方式,而路由器則喜歡定長的、有著層次結構的IP地址。為了折衷這些不同的偏好,我們需要一種能進行主機名到IP地址轉換的目錄服務,這就是DNS域名系統的主要任務。

DNS是:

1.一個由分層的DNS伺服器實現的分散式資料庫
2.一個使得主機能夠查詢分散式資料庫的應用層協議。

DNS協議執行在UDP之上,使用53號埠

DNS不是一個直接和使用者打交道的應用,它是為因特網的使用者應用程式以及其他軟體提供一種核心功能。DNS通常是由其他應用層協議使用的,包括HTTP、SMTP和FTP等,將使用者提供的主機名解析為IP地址。

除了進行主機名到IP地址的轉換外,DNS還提供了一些重要的服務:

(1)主機別名
有著複雜主機名的主機能夠擁有一個或者多個別名。例如,一臺名為relay1.west-coast.enterprise.com的主機,可能還有兩個別名為enterprise.com和www.enterprise.com。這種情況下,relay1.west-coast.enterprise.com稱為規範主機名,而主機別名比規範主機名更加容易記憶。

應用程式可以呼叫DNS來獲得主機別名對應的規範主機名以及主機的IP地址。

(2)郵件伺服器別名
我們通常也希望電子郵件的地址比較容易記憶。比如我的郵箱地址可能是

[email protected],然而Hotmail郵件伺服器的主機名可能更加複雜,比如類似於relay1.west-coast.hotmail.com這樣,所以也需要DNS對其進行解析。

當然,電子郵件應用程式也可以呼叫DNS,對提供的郵件伺服器別名進行解析,以獲得該主機的規範主機名及其IP地址。

實際上,MX記錄允許一個公司的郵件伺服器和Web伺服器使用相同的別名。比如一個公司的Web伺服器和郵件伺服器都能叫做enterprise.com。

(3)負載分配
DNS也用於在冗餘的伺服器之間進行負載分配。一些繁忙的站點被冗餘分佈在多臺伺服器上,每臺伺服器均執行在不同的端系統上,有著不同的IP地址。所以在這種情況下,一個IP地址集合與一個規範主機名關聯。DNS資料庫儲存著這些IP地址集合。當客戶對該主機名進行DNS請求時,伺服器用IP地址的整個集合進行響應,但在每個回答中迴圈這些地址次序

因為客戶通常總是與IP地址排在最前面的伺服器建立連線,所以DNS就在所有這些冗餘伺服器之間迴圈分配了負載。

2.工作原理

DNS採用了分散式的設計方案。DNS是一個在因特網上實現分散式資料庫的精彩範例。

2.1 分散式、層次資料庫

DNS使用了大量的DNS伺服器,它們以層次方式組織,並分佈在全世界範圍內。大致來說,有3中型別的DNS伺服器:根DNS伺服器、頂級域(Top-Level Domain,TLD)DNS伺服器和權威DNS伺服器。它們以下圖的層次結構組織:

DNS伺服器層次結構

  • 根DNS伺服器。在因特網上有13個根DNS伺服器,它們中的大部分位於北美洲。每臺“伺服器”實際上是一個冗餘伺服器的網路,以提供安全性和可靠性。根DNS伺服器用來返回TLD伺服器的IP地址。
  • TLD伺服器。這些伺服器負責頂級域名如com、org、net、edu和gov,以及所有國家的頂級域名如uk、fr等。TLD伺服器返回權威伺服器的IP地址。
  • 權威DNS伺服器。權威DNS伺服器也即相關組織機構的DNS伺服器,它用來返回主機的IP地址。

假定一個DNS客戶想要確定www.amazon.com的IP地址,將發生下列事件:
1. 客戶事先與根伺服器之一聯絡,它將返回頂級域名.com的TLD伺服器的IP地址。
2. 該客戶則與這些TLD伺服器之一聯絡,它將為amazon.com返回權威伺服器的IP地址。
3. 最後該客戶與amazon.com權威伺服器之一聯絡,它為主機名www.amazon.com返回其IP地址。

根、TLD和權威DNS伺服器都處在DNS伺服器的層次結構中,還有一類重要的DNS,稱為本地DNS伺服器。一個本地DNS伺服器嚴格來說不屬於該層次結構,但它卻是很重要的。每個ISP都有一臺本地DNS伺服器。

本地DNS伺服器起著代理的作用,本地主機將DNS請求發向本地DNS伺服器,本地DNS伺服器將該請求轉發到DNS伺服器層次結構中。

2.2 迭代查詢和遞迴查詢

下圖例子假設主機cs.ustc.edu想知道主機cs.csu.edu的IP地址,假設USTC大學的本地DNS伺服器為dns.ustc.edu,同時假設CSU大學的權威DNS伺服器為dns.csu.edu。

這裡寫圖片描述

【1】主機cs.ustc.edu首先向它的本地DNS伺服器dns.ustc.edu傳送一個DNS查詢報文。該查詢報文含有被轉換的主機名cs.csu.edu。
【2】本地DNS伺服器將該查詢報文傳送到根DNS伺服器,根DNS伺服器注意到edu的字首,所以將負責edu的TLD的IP地址列表返回給本地DNS伺服器。
【3】本地DNS伺服器再次向這些TLD伺服器之一發送DNS查詢報文,該TLD伺服器注意到csu.edu的字首,所以將權威伺服器dns.cs.edu的IP地址返回給本地DNS伺服器。
【4】本地DNS伺服器向權威伺服器dns.cs.edu傳送查詢報文,權威伺服器用cs.csu.edu的IP地址進行響應。
【5】最後,本地DNS伺服器將查詢得到的IP地址返回給主機cs.ustc.edu

上述例子同時利用了遞迴查詢迭代查詢,cs.ustc.edu向dns.ustc.edu發出的查詢是遞迴查詢,因為該查詢請求dns.ustc.edu以自己的名義獲得該對映。而後繼的3個查詢是迭代查詢,因為所有的回答都是直接返回給dns.ustc.edu。

從理論上講,任何DNS查詢既可以是迭代的也能是遞迴的,比如,可能是下面的遞迴DNS查詢鏈:

這裡寫圖片描述

而在實際中,大多遵循第一個圖的模式。

2.3 DNS快取

如果每次DNS解析都要走完上面介紹的整個流程,就會帶來網路頻寬的消耗和時延,這對於使用者和DNS解析系統都是不友好的。

所以當本地DNS伺服器在完成一次查詢後就會將得到的主機名到IP地址的對映快取到本地,從而加快DNS的解析速度。實際上,你的訪問的解析大多數都是在本地伺服器上完成的。

由於主機名和IP地址之間的對映不是永久的,DNS伺服器在一段時間後,通常是兩天,就會丟棄快取資訊。

3.DNS記錄

共同實現DNS分散式資料庫的所有DNS伺服器儲存了資源記錄(Resource Record,RR),資源記錄是一個包含了下列欄位的四元組:

(Name,Value,Type,TTL)

TTL是該記錄的生存時間,它決定了資源記錄應當從快取中刪除的時間。如果域名解析改動較頻繁,比如使用動態IP等,就應該把TTL儘量設小; 如果域名解析不是經常改動,一般可將TTL適當設定得大一點,以加快主機的訪問速度。

Name和Value的值取決於Type。

  • 如果Type=A,則Name是主機名,Value是該主機對應的IP地址。即,一條A記錄提供了標準的主機名到IP地址的對映。
  • 如果TYpe=NS,則Name是個域,比如csu.edu,而Value是知道如何獲得該域中主機IP地址的權威DNS伺服器的主機名,比如dns.csu.edu。這個記錄用於沿著查詢鏈來路由DNS查詢。
  • 如果Type=CNAME,則Value是別名為Name的主機對應的規範主機名。
  • 如果Type=MX,則Value是個別名為Name的郵件伺服器的規範主機名。MX記錄允許郵件伺服器主機名具有簡單的別名。

4.DNS報文

DNS只有查詢報文和回答報文這兩種,並且,查詢報文和回答報文有著相同的格式。如下:

DNS報文

【1】前12個位元組是首部區域。第一個欄位是識別符號,它是一個16bit的數,用於標識該查詢。這個識別符號會被複制到對查詢的回答報文中,以便讓客戶用它來匹配發送的請求和接收到的回答。

標誌欄位有若干標誌:
- 1位元的“查詢/回答”標誌位指出報文是查詢報文(0)還是回答報文(1)。
- 當某DNS伺服器是所請求名字的權威伺服器時,1位元的“權威的”標誌被置在回答報文中。
- 如果客戶在該DNS伺服器沒有某記錄時希望它執行遞迴查詢,將設定1位元的“希望遞迴”標誌位。如果該DNS伺服器支援遞迴查詢,在它的回答報文中會對1位元的“遞迴可用”標誌位置位。

首部還有4個有關數量的欄位,指出在首部後的4類資料區域出現的數量。

【2】問題區域包含正在進行的查詢資訊。該區域包括(1)名字欄位,指出正在被查詢的主機名字;(2)型別欄位,指出有關該名字的正在被查詢的問題型別,例如是查詢A記錄還是MX記錄

【3】回答區域包含了對最初請求的名字的資源記錄。即前文所述的四元組(Name,Value,Type,TTL)。在回答報文中可以包含多條RR,因此一個主機能夠有多個IP地址。

【4】權威區域包含了其他權威伺服器的記錄。

【5】附加區域包含了其他有幫助的記錄。例如,對於一個MX請求的回答報文的回答區域包含了一條RR,該記錄提供了郵件伺服器的規範主機名。該附加區域包含一個型別A記錄,該記錄提供了郵件伺服器的規範主機名的IP地址。

下圖是一個DNS查詢報文和回答報文的實際例子,通過wireshark抓包:

查詢報文:

這裡寫圖片描述

回答報文:

這裡寫圖片描述