域名系統DNS簡述
命名層次結構
DNS通過允許一個名稱伺服器把他的一部分名稱服務(眾所周知的zone)“委託”給子伺服器而實現了一種層次結構的名稱空間。此外,DNS還提供了一些額外的資訊,例如系統別名、聯絡資訊以及哪一個主機正在充當系統組或域的郵件樞紐。
任何一個使用IP的計算機網路可以使用DNS來實現他自己的私有名稱系統。儘管如此,當提到在公共的Internet DNS系統上實現的域名時,
這是基於504個全球範圍的“根域名伺服器”(分成13組,分別編號為A至M)。從這504個根伺服器開始,餘下的Internet DNS名字空間被委託給其他的DNS伺服器,這些伺服器提供DNS名稱空間中的特定部分。
記錄型別
DNS系統中,常見的資源記錄型別有:
- 主機記錄(A記錄):RFC 1035定義,A記錄是用於名稱解析的重要記錄,它將特定的主機名對映到對應主機的IP地址上。
- 別名記錄(CNAME記錄): RFC 1035定義,CNAME記錄用於將某個別名指向到某個A記錄上,這樣就不需要再為某個新名字另外建立一條新的A記錄。
- IPv6主機記錄(AAAA記錄): RFC 3596定義,與A記錄對應,用於將特定的主機名對映到一個主機的IPv6地址。
- 服務位置記錄(SRV記錄): RFC 2782定義,用於定義提供特定服務的伺服器的位置,如主機(hostname),埠(port number)等。
- NAPTR記錄:RFC 3403定義,它提供了正則表示式方式去對映一個域名。NAPTR記錄非常著名的一個應用是用於ENUM查詢。
域名伺服器
根域名伺服器:最高層次的域名伺服器,也是最重要的域名伺服器。所有的根域名伺服器都知道所有的頂級域名伺服器的域名和IP地址。不管是哪一個本地域名伺服器,若要對因特網上任何一個域名進行解析,只要自己無法解析,就首先求助根域名伺服器。所以根域名伺服器是最重要的域名伺服器。假定所有的根域名伺服器都癱瘓了,那麼整個DNS系統就無法工作。需要注意的是,在很多情況下,根域名伺服器並不直接把待查詢的域名直接解析出IP地址,而是告訴本地域名伺服器下一步應當找哪一個頂級域名伺服器進行查詢。
頂級域名伺服器:負責管理在該頂級域名伺服器註冊的二級域名。
許可權域名伺服器:負責一個“區”的域名伺服器。
本地域名伺服器:本地伺服器不屬於下圖的域名伺服器的層次結構,但是它對域名系統非常重要。當一個主機發出DNS查詢請求時,這個查詢請求報文就傳送給本地域名伺服器。
域名解析方式
DNS查詢有兩種方式:遞迴和迭代。
遞迴查詢時,返回的結果只有兩種:查詢成功或查詢失敗.
迭代查詢,又稱作重指引,返回的是最佳的查詢點或者主機地址.
(1)遞迴查詢
遞迴查詢是一種DNS伺服器的查詢模式,在該模式下DNS 伺服器接收到客戶機請求,必須使用一個準確的查詢結果回覆客戶機。如果DNS 伺服器本地沒有儲存查詢DNS資訊,那麼該伺服器會詢問其他伺服器,並將返回的查詢結果提交給客戶機。
(2)迭代查詢
DNS 伺服器另外一種查詢方式為迭代查詢,DNS 伺服器會向客戶機提供其他能夠解析查詢請求的DNS 伺服器地址,當客戶機發送查詢請求時,DNS 伺服器並不直接回複查詢結果,而是告訴客戶機另一臺DNS 伺服器地址,客戶機再向這臺DNS 伺服器提交請求,依次迴圈直到返回查詢的結果為止。
下圖給出了這兩種查詢的差別:
DNS客戶端設定使用的DNS伺服器一般都是遞迴伺服器,它負責全權處理客戶端的DNS查詢請求,直到返回最終結果。而DNS伺服器之間一般採用迭代查詢方式。
一、主機向本地域名伺服器的查詢一般都是採用遞迴查詢。所謂遞迴查詢就是:如果主機所詢問的本地域名伺服器不知道被查詢的域名的IP地址,那麼本地域名伺服器就以DNS客戶的身份,向其它根域名伺服器繼續發出查詢請求報文(即替主機繼續查詢),而不是讓主機自己進行下一步查詢。因此,遞迴查詢返回的查詢結果或者是所要查詢的IP地址,或者是報錯,表示無法查詢到所需的IP地址。
二、本地域名伺服器向根域名伺服器的查詢的迭代查詢。迭代查詢的特點:當根域名伺服器收到本地域名伺服器發出的迭代查詢請求報文時,要麼給出所要查詢的IP地址,要麼告訴本地伺服器:“你下一步應當向哪一個域名伺服器進行查詢”。然後讓本地伺服器進行後續的查詢。根域名伺服器通常是把自己知道的頂級域名伺服器的IP地址告訴本地域名伺服器,讓本地域名伺服器再向頂級域名伺服器查詢。頂級域名伺服器在收到本地域名伺服器的查詢請求後,要麼給出所要查詢的IP地址,要麼告訴本地伺服器下一步應當向哪一個許可權域名伺服器進行查詢。最後,知道了所要解析的IP地址或報錯,然後把這個結果返回給發起查詢的主機。
以查詢 zh.wikipedia.org 為例:
- 客戶端傳送查詢報文"query zh.wikipedia.org"至本地DNS伺服器,DNS伺服器首先檢查自身快取,如果存在記錄則直接返回結果。
- 如果記錄老化或不存在,則:
- 本地DNS伺服器器向根域名伺服器傳送查詢報文"query zh.wikipedia.org",根域名伺服器返回頂級域 .org 的權威域名伺服器地址。本地DNS伺服器向 .org 域的權威域名伺服器傳送查詢報文"query zh.wikipedia.org",得到二級域 .wikipedia.org 的權威域名伺服器地址。
- 本地DNS伺服器向 .wikipedia.org 域的權威域名伺服器傳送查詢報文"query zh.wikipedia.org",得到主機 zh 的A記錄,存入自身快取並返回給客戶端。
下面舉一個例子演示整個查詢過程:
假定域名為m.xyz.com的主機想知道另一個主機y.abc.com的IP地址。例如,主機m.xyz.com打算髮送郵件給y.abc.com。這時就必須知道主機y.abc.com的IP地址。下面是上圖a的幾個查詢步驟:
1、主機m.abc.com先向本地伺服器dns.xyz.com進行遞迴查詢。
2、本地伺服器採用迭代查詢。它先向一個根域名伺服器查詢。
3、根域名伺服器告訴本地伺服器,下一次應查詢的頂級域名伺服器dns.com的IP地址。
4、本地域名伺服器向頂級域名伺服器dns.com進行查詢。
5、頂級域名伺服器dns.com告訴本地域名伺服器,下一步應查詢的許可權伺服器dns.abc.com的IP地址。
6、本地域名伺服器向許可權域名伺服器dns.abc.com進行查詢。
7、許可權域名伺服器dns.abc.com告訴本地域名伺服器,所查詢的主機的IP地址。
8、本地域名伺服器最後把查詢結果告訴m.xyz.com。
整個查詢過程共用到了8個UDP報文。
為了提高DNS查詢效率,並減輕伺服器的負荷和減少因特網上的DNS查詢報文數量,在域名伺服器中廣泛使用了快取記憶體,用來存放最近查詢過的域名以及從何處獲得域名對映資訊的記錄。
例如,在上面的查詢過程中,如果在m.xyz.com的主機上不久前已經有使用者查詢過y.abc.com的IP地址,那麼本地域名伺服器就不必向根域名伺服器重新查詢y.abc.com的IP地址,而是直接把告訴快取中存放的上次查詢結果(即y.abc.com的IP地址)告訴使用者。
由於名字到地址的繫結並不經常改變,為保持告訴快取中的內容正確,域名伺服器應為每項內容設定計時器並處理超過合理時間的項(例如每個專案兩天)老化時間。當域名伺服器已從快取中刪去某項資訊後又被請求查詢該項資訊,就必須重新到授權管理該項的域名伺服器繫結資訊。當權限伺服器回答一個查詢請求時,在響應中都指明繫結有效存在的時間值。增加此時間值可減少網路開銷,而減少此時間值可提高域名解析的正確性。
不僅在本地域名伺服器中需要快取記憶體,在主機中也需要。許多主機在啟動時從本地伺服器下載名字和地址的全部資料庫,維護存放自己最近使用的域名的快取記憶體,並且只在從快取中找不到名字時才使用域名伺服器。維護本地域名伺服器資料庫的主機應當定期地檢查域名伺服器以獲取新的對映資訊,而且主機必須從快取中刪除無效的項。由於域名改動並不頻繁,大多數網點不需花精力就能維護資料庫的一致性。
查詢本地DNS伺服器之前,首先是瀏覽器DNS快取和OS DNS快取。