在網際網路中,識別一台主機有兩種方式,通過主機名或者ip位址。人們喜歡便於記憶的主機名標識方式,而路由器則喜歡定長的、有著層次結構的ip位址。為了折衷這些不同的偏好,我們需要一種能進行主機名到ip位址轉換的目錄服務,這就是dns網域名稱系統的主要任務。
dns是:
1.乙個由分層的dns伺服器實現的分布式資料庫dns協議執行在udp之上,使用53號埠。2.乙個使得主機能夠查詢分布式資料庫的應用層協議。
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就在所有這些冗餘伺服器之間迴圈分配了負載。
dns採用了分布式的設計方案。dns是乙個在網際網路上實現分布式資料庫的精彩範例。
dns使用了大量的dns伺服器,它們以層次方式組織,並分布在全世界範圍內。大致來說,有3中型別的dns伺服器:根dns伺服器、頂級域(top-level domain,tld)dns伺服器和權威dns伺服器。它們以下圖的層次結構組織:
假定乙個dns客戶想要確定根、tld和權威dns伺服器都處在dns伺服器的層次結構中,還有一類重要的dns,稱為本地dns伺服器。乙個本地dns伺服器嚴格來說不屬於該層次結構,但它卻是很重要的。每個isp都有一台本地dns伺服器。www.amazon.com
的ip位址,將發生下列事件:1. 客戶事先與根伺服器之一聯絡,它將返回頂級網域名稱
.com
的tld伺服器的ip位址。2. 該客戶則與這些tld伺服器之一聯絡,它將為
amazon.com
返回權威伺服器的ip位址。3. 最後該客戶與
amazon.com
權威伺服器之一聯絡,它為主機名www.amazon.com
返回其ip位址。
本地dns伺服器起著**的作用,本地主機將dns請求發向本地dns伺服器,本地dns伺服器將該請求**到dns伺服器層次結構中。
下圖例子假設主機cs.ustc.edu想知道主機cs.csu.edu的ip位址,假設ustc大學的本地dns伺服器為dns.ustc.edu,同時假設csu大學的權威dns伺服器為dns.csu.edu。
主機cs.ustc.edu首先向它的本地dns伺服器dns.ustc.edu傳送乙個dns查詢報文。該查詢報文含有被轉換的主機名cs.csu.edu。
本地dns伺服器將該查詢報文傳送到根dns伺服器,根dns伺服器注意到edu的字首,所以將負責edu的tld的ip位址列表返回給本地dns伺服器。
本地dns伺服器再次向這些tld伺服器之一傳送dns查詢報文,該tld伺服器注意到csu.edu的字首,所以將權威伺服器dns.cs.edu的ip位址返回給本地dns伺服器。
本地dns伺服器向權威伺服器dns.cs.edu傳送查詢報文,權威伺服器用cs.csu.edu的ip位址進行響應。
最後,本地dns伺服器將查詢得到的ip位址返回給主機cs.ustc.edu
上述例子同時利用了遞迴查詢和迭代查詢,cs.ustc.edu向dns.ustc.edu發出的查詢是遞迴查詢,因為該查詢請求dns.ustc.edu以自己的名義獲得該對映。而後繼的3個查詢是迭代查詢,因為所有的回答都是直接返回給dns.ustc.edu。
從理論上講,任何dns查詢既可以是迭代的也能是遞迴的,比如,可能是下面的遞迴dns查詢鏈:
而在實際中,大多遵循第乙個圖的模式。
如果每次dns解析都要走完上面介紹的整個流程,就會帶來網路頻寬的消耗和時延,這對於使用者和dns解析系統都是不友好的。
所以當本地dns伺服器在完成一次查詢後就會將得到的主機名到ip位址的對映快取到本地,從而加快dns的解析速度。實際上,你的訪問的解析大多數都是在本地伺服器上完成的。
由於主機名和ip位址之間的對映不是永久的,dns伺服器在一段時間後,通常是兩天,就會丟棄快取資訊。
共同實現dns分布式資料庫的所有dns伺服器儲存了資源記錄(resource record,rr),資源記錄是乙個包含了下列欄位的四元組:
(name,value,type,ttl)
ttl是該記錄的生存時間,它決定了資源記錄應當從快取中刪除的時間。如果網域名稱解析改動較頻繁,比如使用動態ip等,就應該把ttl盡量設小; 如果網域名稱解析不是經常改動,一般可將ttl適當設定得大一點,以加快主機的訪問速度。
name和value的值取決於type。
dns只有查詢報文和回答報文這兩種,並且,查詢報文和回答報文有著相同的格式。如下:
前12個位元組是首部區域。第乙個欄位是識別符號,它是乙個16bit的數,用於標識該查詢。這個識別符號會被複製到對查詢的回答報文中,以便讓客戶用它來匹配傳送的請求和接收到的回答。
標誌欄位有若干標誌:
- 1位元的「查詢/回答」標誌位指出報文是查詢報文(0)還是回答報文(1)。
- 當某dns伺服器是所請求名字的權威伺服器時,1位元的「權威的」標誌被置在回答報文中。
- 如果客戶在該dns伺服器沒有某記錄時希望它執行遞迴查詢,將設定1位元的「希望遞迴」標誌位。如果該dns伺服器支援遞迴查詢,在它的回答報文中會對1位元的「遞迴可用」標誌位置位。
首部還有4個有關數量的字段,指出在首部後的4類資料區域出現的數量。
問題區域包含正在進行的查詢資訊。該區域包括(1)名字字段,指出正在被查詢的主機名字;(2)型別字段,指出有關該名字的正在被查詢的問題型別,例如是查詢a記錄還是mx記錄
回答區域包含了對最初請求的名字的資源記錄。即前文所述的四元組(name,value,type,ttl)。在回答報文中可以包含多條rr,因此乙個主機能夠有多個ip位址。
權威區域包含了其他權威伺服器的記錄。
附加區域包含了其他有幫助的記錄。例如,對於乙個mx請求的回答報文的回答區域包含了一條rr,該記錄提供了郵件伺服器的規範主機名。該附加區域包含乙個型別a記錄,該記錄提供了郵件伺服器的規範主機名的ip位址。
下圖是乙個dns查詢報文和回答報文的實際例子,通過wireshark抓包:
查詢報文:
回答報文:
應用層 網域名稱系統DNS
dns是分布式的系統,所以即使單個計算機出現問題,也不會影響到整個dns系統的正常執行。網域名稱到ip位址的解析是由分布在網際網路上的許多網域名稱服務程式共同完成的,解析過程大致是這樣的 當乙個應用程序需要把主機名解析為ip位址時,該應用程序就要呼叫解析程式,然後成為dns的乙個客戶,把解析的網域名...
應用層 網域名稱系統(DNS)
網域名稱系統 dns 是網際網路使用的命名系統,用來把便於人們記憶的具有特定含義的主機名 如www.cskaoyan.com 轉換為便於機器處理的 ip 位址。從概念上可將dns分為3部分 層次網域名稱空間 網域名稱伺服器和解析器 1 根網域名稱伺服器 根網域名稱伺服器是最高層次的網域名稱伺服器,所...
應用層 網域名稱系統DNS
類似www baidu com的 就叫網域名稱,計算機底層需要用ip位址進行包的傳輸,故需要網域名稱向ip位址的轉換,這叫做網域名稱解析,完成此任務的是網域名稱系統dns。網域名稱系統dns domain name system 是internet使用的命名系統,多個網域名稱伺服器上執行專門的網域名...