1. 程式人生 > >計算機網路應用層之域名系統DNS

計算機網路應用層之域名系統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是分散式、層次式的了吧,也明白為什麼它能解決集中式帶來的問題了吧!