計算機網絡應用層之域名系統DNS

一、爲什麼存在DNS
就像我們寄信需要一個地址一樣,我們需要向網絡上的某臺主機通信,也要知道我們的主機的地址。我們知道,這個地址就是IP地址,它是一個可以在因特網上唯一標識一臺主機的地址。然而就如我們知道的那樣,IP地址只是4個十進制數字,並不符合人們的記憶和使用,而人們希望使用有意義的易於記憶的主機名作爲地址。而且這也更適合我們的生活習慣。舉個例子吧,就像我們身份證號一樣,每個人都有一個身份證號,但是我們平時與人交流(通信)時,並不會叫人們的身份證號,而是叫他的名字。然而通過這個名字(假設沒有重名),去查身份證的話,我們就可以找到一個對應的身份證號。

然而,從平時使用因特網來看,我們可以通過兩種方式來識別主機,一種是主機名,一種是IP地址,例如,可以使用www.baidu.com來訪問百度的網站,當然也可以通過IP地址115.239.210.27來訪問百度的網站。就好像我們能用名字和身份證號來確定一個人一樣。爲什麼用主機名也能與指定的主機通信呢?其實這就是DNS的功能了。

因爲DNS提供的就是主機名到IP地址轉換的目錄服務,即我們上面說到的,它會把www.baidu.com轉換成IP地址115.239.210.27。

二、什麼是DNS
知道了DNS存在的意義後,讓我們更加詳細地看看,什麼是DNS吧。DNS是一個由分層的DNS服務器實現的分佈式數據庫,它是一個允許主機查詢分佈式數據庫的應用層協議,DNS協議運行在UDP之上,使用53號端口。

DNS通常由其他應用層協議使用,用於將用戶提供的主機名解析爲IP地址。下面以客戶機A用瀏覽器通過主機名www.baidu.com訪問百度網站作爲例子,簡單地介紹一個DNS是如何把這個主機名轉化爲IP地址的。其做法如下:
1)同一臺用戶主機上運行着DNS應用的客戶機端
2)該瀏覽器從輸入的網址中取得主機名,並將這個主機名傳給DNS應用的客戶機端
3)該DNS客戶機向DNS服務器發送一個包含主機名的請求
4)該DNS客戶機最終收到一份回答報文,其中包含對應於主機名的IP地址,在這個例子中爲115.239.210.27
5)一旦該瀏覽器接收到來自DNS的IP地址,它就可以向由該IP地址定位的HTTP服務器發起一個TCP連接。

看到這裏,大家應該就能明白爲什麼我們能以主機名來代替IP地址,與特定的主機進行通信了吧!

三、DNS的工作原理
上面已經簡單地跟大家介紹過DNS的工作方式了,但是對於一個這麼好的服務、一個這麼好用的協議,這點知識並不能滿足我們的求知慾,反而讓我們更加渴望瞭解它。

1、分佈式、層次數據庫
爲了處理規模問題,DNS使用了大量的DNS服務器,它們以層次方式組織,並且分佈在世界各地。注意,沒有一臺DNS服務器具有所有主機的映射,相反,該映射分佈在所有的DNS服務器上。大致來說,有3種類型的DNS服務器:根DNS服務器,頂級域DNS服務器(如com DNS服務器、org DNS服務器、edu DNS服務器等)和權威DNS服務器(如yahoo.com DNS服務器,qt-project.org DNS服務器、umass.edu DNS服務器等),它以爲根DNS服務器爲樹根,按樹形層次結構組織起來。

爲什麼DNS服務器不是集中式而是分佈式的呢?試想一下,假如因特網使用集中式的DNS服務器,也就是說,因特網上的所有主機要使用DNS服務,都要向該集中的DNS服務器發送請求,則當DNS服務器發生故障時,因特網上的所有的主機都將不能使用DNS服務。同時,所有的主機都向該DNS服務器發送請求,單個的DNS服務器不得不處理所有的DNS服務請求,然而DNS服務器能接收到的數據卻受到通信容量(帶寬)的限制。此外,可能該DNS服務器集合可能離請求主機非常遠,則如果使用集中式的DNS服務器,則請求主機必須把請求傳輸非常遠的距離。看完下面的DNS緩存後,我們就可以更加清楚地看到分佈式、層次的DNS服務器的好處。

PS:至於負責把主機名對應的IP地址的記錄放入根DNS服務器的數據庫的,是一個全球唯一的機構——註冊登陸機構,就是它把記錄插入數據庫的。

1)根DNS服務器,在因特網上有13個根DNS服務器(標號從A到M),儘管我們將這13個根DNS服務器中的每一個都視爲單個的服務器,但實際上,根DNS服務器並不只有13臺主機,每臺“服務器”實際上是冗餘服務器的羣集,以提供安全性和可靠性。

2)頂級服務器,負責頂級域名(如,com、org、net)和所有國家的頂級域名(如uk,fr,cn)。

3)權威DNS服務器,在因特網上具有公共可訪問主機的每個組織機構必須提供公共可訪問的DNS記錄,這些記錄將這些主機映射爲IP地址。

4)本地DNS服務器,在上面的介紹中,沒有介紹本地DNS服務器,嚴格點來說本地DNS服務器並不屬於DNS服務器的層次結構,但是它對DNS層次結構是非常重要的,在此不得不提。因爲主機的本地DNS服務器通常“鄰近”本主機,所以當主機發出DNS請求時,該請求被髮往本地DNS服務器,它起着代理的作用,並將該請求轉發到DNS服務器層次結構中。

知道了這些內容之後,我們再來看看,上面所說的DNS服務是如何進行的。
1)首先客戶機向其本地DNS服務器發送DNS一個DNS查詢報文,該報文含有要被轉換的主機名www.baidu.com
2)本地服務器向根DNS服務器轉發該查詢報文
3)根DNS服務器注意到其com前綴並向本地DNS服務器返回負責com的頂級DNS服務器的IP地址列表
4)本地DNS服務器再次向這些頂級DNS服務器發送查詢報文
5)頂級DNS服務器注意到baidu.com前綴,並返回權威DNS服務器的IP地址列表進行響應
6)最後本地DNS服務器直接向ww.baidu.com重發查詢報文,該服務用其IP地址進行響應
其查詢過程如下圖所示:

其實在現實中,還有一種查詢方式,如下:
1)首先,同樣地,首先客戶機向其本地DNS服務器發送DNS一個DNS查詢報文,該報文含有要被轉換的主機名www.baidu.com
2)本地服務器向根DNS服務器轉發該查詢報文
3)根DNS服務器注意到其com前綴,並向com頂級DNS服務器轉發該查詢
4)頂級DNS服務器注意到baidu.com前綴,並向ww.baidu.com轉發該查詢報文
5)最後獲得IP地址後,沿着4、3、2、1發送響應報文返回到客戶機。

其過程如下圖所示:


第二個方法使用的是遞歸查詢,而第一種方式使用的則包括遞歸查詢和迭代查詢。

2、DNS緩存
其實前面所描述的過程,並不完全是現實中的查詢過程,至少在大多數情況下不是。爲什麼?然而我們說DNS是分層的、分佈式的,但是,在前面的描述中,我們看到無論是第一種還是第二種查詢方式,都總要訪問那13個根DNS服務器,這就跟集中式沒有什麼區別了,它同樣有着集中式DNS的所有缺點!這是因爲我們還沒有討論DNS系統中的一個重要特徵——DNS緩存。

實際上,爲了改善時延性能並減少在因特網上到處傳輸的DNS報文數量,DNS廣泛使用了緩存技術。它的原理非常簡單,在請求鏈中,當一個DNS服務器接收到一個DNS回答(即包含主到名到IP的映射)時,DNS服務器能將回答中的信息緩存在本地存儲器。

例如,每當本地DNS服務器從某個DNS服務器收到一個回答時,它就緩存包含在該回答中的任何信息。如果在DNS服務器中緩存了一個主機名/IP地址對,另一個對相同主機名的查詢到達該DNS服務器時,該服務器就能夠直接提供所要求的IP地址,即使它不是該主機名的權威DNS服務器。由於主機和主機名與IP地址間的信息不是永久的,所以DNS服務器在一段時間後,將丟棄緩存的信息。

然而,所有的DNS服務器都採用這種機制——DNS緩存,也就是說,我們的請求將很少會要去到根DNS服務器才能被查詢出來,可能在本地DNS服務器就已經存在要要求的主機名的緩存,也可能是在通向根DNS服務器的途中的某臺DNS服務器上找到了。

看到這裏,你應該明白,爲什麼DNS是分佈式、層次式的了吧,也明白爲什麼它能解決集中式帶來的問題了吧!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章