天天看點

TCP/IP學習筆記(12)——DNS:域名系統

1、引言

域名系統(DNS)是一種用于TCP/IP應用程式的分布式資料庫,它提供主機名字和IP位址之間的轉換及有關電子郵件的選路資訊。這裡提到的分布式是指在Internet上的單個站點不能擁有所有的資訊。每個站點(如大學中的系、校園、公司或公司中的部門)保留它自己的資訊資料庫,并運作一個伺服器程式供Internet上的其他系統(客戶程式)查詢。DNS提供了允許伺服器和客戶程式互相通信的協定。

2、DNS基礎

DNS的名字空間和Unix的檔案系統相似,也具有層次結構。下圖顯示了這種層次的組織形式。

每個結點(圖中的圓圈)有一個至多63個字元長的辨別。這顆樹的樹根是沒有任何辨別的特殊結點。命名辨別中一律不區分大寫和小寫。命名樹上任何一個結點的域名就是将從該結點到最高層的域名串連起來,中間使用一個點“.”分隔這些域名(注意這和 U n i x檔案系統路徑的形成不同,檔案路徑是由樹根依次向下的形成的)。域名樹中的每個結點必須有一個唯一的域名,但域名樹中的不同結點可使用相同的辨別。

TCP/IP學習筆記(12)——DNS:域名系統

以點“.”結尾的域名稱為絕對域名或完全合格的域名 FQDN(Full Qualified Domain Name),例如sun.tuc.noao.edu.。如果一個域名不以點結尾,則認為該域名是不完全的。如何使域名完整依賴于使用的DNS軟體。如果不完整的域名由兩個或兩個以上的标号組成,則認為它是完整的;或者在該域名的右邊加入一個局部字尾。例如域名sun通過加上局部字尾.tuc.noao.edu.成為完整的。

頂級域名被分為三個部分:

1) arpa是一個用作位址到名字轉換的特殊域。

2) 7個3字元長的普通域。有些書也将這些域稱為組織域。

3) 所有2字元長的域均是基于ISO3166中定義的國家代碼,這些域被稱為國家域,或地理域。

3、DNS的封包格式

DNS定義了一個用于查詢和響應的封包格式。下圖顯示這個封包的總體格式。

TCP/IP學習筆記(12)——DNS:域名系統

這個封包由12位元組長的首部和4個長度可變的字段組成。

辨別字段由客戶程式設定并由伺服器傳回結果。客戶程式通過它來确定響應與查詢是否比對。

16 bit的标志字段被劃分為若幹子字段,如下圖。

TCP/IP學習筆記(12)——DNS:域名系統

各子字段含義如下:

• QR 是1 bit字段:0表示查詢封包,1表示響應封包。

• opcode是一個4 bit字段:通常值為0(标準查詢),其他值為1(反向查詢)和2(伺服器狀态請求)。

• AA是1 bit标志,表示“授權回答 (authoritative answer)”。該名字伺服器是授權于該域的。

• TC是1 bit字段,表示“可截斷的 truncated )”。使用UDP時,它表示當應答的總長度超

過512位元組時,隻傳回前512個位元組。

• RD是1 bit字段表示“期望遞歸( recursion desired)”。該比特能在一個查詢中設定,并

在響應中傳回。這個标志告訴名字伺服器必須處理這個查詢,也稱為一個遞歸查詢。如果該位為0,且被請求的名字伺服器沒有一個授權回答,它就傳回一個能解答該查詢的其他名字伺服器清單,這稱為疊代查詢。在後面的例子中,我們将看到這兩種類型查詢的例子。

• RA是1 bit字段,表示“可用遞歸”。如果名字伺服器支援遞歸查詢,則在響應中将該比特設定為1。在後面的例子中可看到大多數名字伺服器都提供遞歸查詢,除了某些根伺服器。

• 随後的3 bit字段必須為0。

• rcode是一個4 bit的傳回碼字段。通常的值為 0(沒有差錯)和3(名字差錯)。名字差錯隻有從一個授權名字伺服器上傳回,它表示在查詢中制定的域名不存在。

随後的 4個16 bit字段說明最後 4個變長字段中包含的條目數。對于查詢封包,問題(question)數通常是1,而其他3項則均為0。類似地,對于應答封包,回答數至少是 1,剩下的兩項可以是0或非0。

4、UDP OR TCP

注意到DNS名字伺服器使用的熟知端口号無論對 UDP還是TCP都是53。這意味着DNS均支援UDP和TCP通路,但我們使用tcpdump觀察的所有例子都是采用UDP。

當名字解析器發出一個查詢請求,并且傳回響應中的TC(删減标志)比特被設定為 1時,它就意味着響應的長度超過了512個位元組,而僅傳回前512個位元組。在遇到這種情況時,名字解析器通常使用TCP重發原來的查詢請求,它将允許傳回的響應超過512個位元組。既然TCP能将使用者的資料流分為一些封包段,它就能用多個封包段來傳送任意長度的使用者資料。

此外,當一個域的輔助名字伺服器在啟動時,将從該域的主名字伺服器執行區域傳送。輔助伺服器将定時(通常是 3小時)向主伺服器進行查詢以便了解主伺服器資料是否發生變動。如果有變動,将執行一次區域傳送。區域傳送将使用TCP,因為這裡傳送的資料遠比一個查詢或響應多得多。

既然DNS主要使用UDP,無論是名字解析器還是名字伺服器都必須自己處理逾時和重傳。此外,不像其他的使用UDP的Internet應用(TFTP、BOOTP和SNMP),大部分操作集中在區域網路上,DNS查詢和響應通常經過廣域網。分組丢失率和往返時間的不确定性在廣域網上比區域網路上更大。這樣對于DNS客戶程式,一個好的重傳和逾時程式就顯得更重要了。

繼續閱讀