1. 程式人生 > >TCP/IP學習筆記(12)——DNS:域名系統

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

1、引言

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

2、DNS基礎

DNS的名字空間和Unix的檔案系統相似,也具有層次結構。下圖顯示了這種層次的組織形式。
每個結點(圖中的圓圈)有一個至多63個字元長的標識。這顆樹的樹根是沒有任何標識的特殊結點。命名標識中一律不區分大寫和小寫。命名樹上任何一個結點的域名就是將從該結點到最高層的域名串連起來,中間使用一個點“.”分隔這些域名(注意這和 U n i x檔案系統路徑的形成不同,檔案路徑是由樹根依次向下的形成的)。域名樹中的每個結點必須有一個唯一的域名,但域名樹中的不同結點可使用相同的標識。
這裡寫圖片描述


以點“.”結尾的域名稱為絕對域名或完全合格的域名 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定義了一個用於查詢和響應的報文格式。下圖顯示這個報文的總體格式。
這裡寫圖片描述
這個報文由12位元組長的首部和4個長度可變的欄位組成。
標識欄位由客戶程式設定並由伺服器返回結果。客戶程式通過它來確定響應與查詢是否匹配。
16 bit的標誌欄位被劃分為若干子欄位,如下圖。
這裡寫圖片描述
各子欄位含義如下:
• 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客戶程式,一個好的重傳和超時程式就顯得更重要了。