結合Wireshark捕獲分組深入理解TCP/IP協議棧之DNS協議
摘要:
本文簡單介紹了DNS協議理論知識,給出URL解析步驟,詳細講述了DNS報文各個字段含義,并從Wireshark俘獲分組中選取DNS相關報文進行分析。
一、概述
1.1 DNS
識別主機有兩種方式:主機名、IP地址。前者便于記憶(如www.yahoo.com),但路由器很難處理(主機名長度不定);后者定長、有層次結構,便于路由器處理,但難以記憶。折中的辦法就是建立IP地址與主機名間的映射,這就是域名系統DNS做的工作。DNS通常由其他應用層協議使用(如HTTP、SMTP、FTP),將主機名解析為IP地址,其運行在UDP之上,使用53號端口。
注:DNS除了提供主機名到IP地址轉換外,還提供如下服務:主機別名、郵件服務器別名、負載分配。
1.2 HTTP使用DNS情形
考慮這樣的操作,在瀏覽器輸入http://www.baidu.com/index.html并回車,首先需要將URL(存放對象的服務器主機名和對象的路徑名)解析成IP地址,具體步驟為:
(1)同一臺用戶主機上運行著DNS應用的客戶機端(如瀏覽器)
(2)從上述URL抽取主機名www.baidu.com,傳給DNS應用的客戶機端(瀏覽器)
(3)該DNS客戶機向DNS服務器發送一個包含主機名的請求(DNS查詢報文)
(4)該DNS客戶機收到一份回答報文(即DNS回答報文),該報文包含該主機名對應的IP地址119.75.218.70
(5)瀏覽器由該IP地址定位的HTTP服務器發送一個TCP鏈接
用Wireshark捕獲的DNS報文如下圖,顯然第一行是DNS查詢報文,第二行是DNS回答報文。
圖1 Wireshark捕獲的DNS報文
二、DNS報文
2.1 DNS報文格式
DNS只有兩種報文:查詢報文、回答報文,兩者有著相同格式,如下:
圖2 DNS報文格式
2.1.1 首部區域
標識數
對該查詢進行標識,該標識會被復制到對應的回答報文中,客戶機用它來匹配發送的請求與接收到的回答。
標志[1]
圖3 DNS報文首部區域的標志
QR(1比特):查詢/響應的標志位,1為響應,0為查詢。
opcode(4比特):定義查詢或響應的類型(若為0則表示是標準的,若為1則是反向的,若為2則是服務器狀態請求)。
AA(1比特):授權回答的標志位。該位在響應報文中有效,1表示名字服務器是權限服務器(關于權限服務器以后再討論)
TC(1比特):截斷標志位。1表示響應已超過512字節并已被截斷(依稀好像記得哪里提過這個截斷和UDP有關,先記著)
RD(1比特):該位為1表示客戶端希望得到遞歸回答(遞歸以后再討論)
RA(1比特):只能在響應報文中置為1,表示可以得到遞歸響應。
zero(3比特):不說也知道都是0了,保留字段。
rcode(4比特):返回碼,表示響應的差錯狀態,通常為0和3,各取值含義如下:
0 無差錯
1 格式差錯
2 問題在域名服務器上
3 域參照問題
4 查詢類型不支持
5 在管理上被禁止
6 -- 15 保留
問題數、回答RR數、權威RR數、附加RR數
這四個字段都是兩字節,分別對應下面的查詢問題、回答、授權和附加信息部分的數量。一般問題數都為1,DNS查詢報文中,資源記錄數、授權資源記錄數和附加資源記錄數都為0[1]。
2.1.2 區域
(1)問題區域
包含正在進行的查詢信息。包含查詢名(被查詢主機名字的名字字段)、查詢類型、查詢類。
圖4 DNS報文的問題區域
查詢名
查詢名部分長度不定,一般為要查詢的域名(也會有IP的時候,即反向查詢)。此部分由一個或者多個標示符序列組成,每個標示符以首字節數的計數值來說明該標示符長度,每個名字以0結束。計數字節數必須是0~63之間。該字段無需填充字節。還是借個例子來說明更直觀些,查詢名為gemini.tuc.noao.edu的話,查詢名字段如下[1]:
圖5 DNS報文問題區別的查詢名
查詢類型
通常查詢類型為A(由名字獲得IP地址)或者PTR(獲得IP地址對應的域名),類型列表如下:
表1 DNS報文查詢類型
類型
助記符
說明
1
A
IPv4地址
2
NS
名字服務器
5
CNAME
規范名稱定義主機的正式名字的別名
6
SOA
開始授權標記一個區的開始
11
WKS
熟知服務定義主機提供的網絡服務
12
PTR
指針把IP地址轉化為域名
13
HINFO
主機信息給出主機使用的硬件和操作系統的表述
15
MX
郵件交換把郵件改變路由送到郵件服務器
28
AAAA
IPv6地址
252
AXFR
傳送整個區的請求
255
ANY
對所有記錄的請求
NS記錄指定了名字服務器。一般情況,每個DNS數據庫中,針對每個頂級域都會有一條NS記錄,這樣一來,電子郵件就可以被發送到域名樹中遠處的部分。
查詢類
通常為1,指Internet數據。
(2)回答、權威、附加區域
回答區域包含了最初請求名字的資源記錄,一個回答報文的回答區域可以包含多條資料記錄RR(因為一個主機名可以對應多個IP地址,冗余Web服務器)。權威區域包含了其他權威DNS服務器的記錄。附加區域包含其他一些"有幫助"的記錄,例如,對于一個MX(郵件交換)請求的回答報文中,回答區域包含一條資料記錄(該記錄提供郵件服務器的規范主機名),附加區域可以包含一條類型A記錄(該記錄提供了該郵件服務器的規范主機名的IP地址)。
每條資料記錄是一個五元組,如下:
(域名,生存期,類別,類型,值)
直接表示如下[1]:
圖6 DNS報文的資源記錄
域名(2字節或不定長)
記錄中資源數據對應的名字,它的格式和查詢名字段格式相同。當報文中域名重復出現時,就需要使用2字節的偏移指針來替換。例如,在資源記錄中,域名通常是查詢問題部分的域名的重復,就需要用指針指向查詢問題部分的域名。關于指針怎么用,TCP/IP詳解里面有,即2字節的指針,最前面的兩個高位是11,用于識別指針。其他14位從報文開始處計數(從0開始),指出該報文中的相應字節數。注意,DNS報文的第一個字節是字節0,第二個報文是字節1。一般響應報文中,資源部分的域名都是指針C00C(1100000000001100,12正好是首部區域的長度),剛好指向請求部分的域名[1]。
類型(記錄的類型,見表1)
A記錄,Name是主機名,Value是該主機名的IP地址,因此,一條類型為A的資源記錄提供了標準的主機名到IP地址的映射。
NS記錄,Name是域(如foo.com),Value是知道如何獲得該域中主機IP地址的權威DNS服務器的主機名(如dns.foo.com),這個記錄常用于沿著查詢鏈進一步路由DNS查詢。
CNAME記錄,Name是主機別名,Value是主機別名對應的規范主機名,該記錄能夠向請求主機提供一個主機名對應的規范主機名。
MX記錄,Name是郵件服務器別名,Value是郵件服務器別名的規范主機名。通過MX記錄,一個公司的郵件服務器和其他服務器可以使用相同的別名。
注:有著復雜主機名的主機能擁有多個別名,前者稱為規范主機名,后者稱為主機別名(便于記憶)。
類
對于Internet信息,它總是IN。
生存時間
用于指示該記錄的穩定程度,極為穩定的信息會被分配一個很大的值(如86400,一天的秒數)。該字段表示資源記錄的生命周期(以秒為單位),一般用于當地址解析程序取出資源記錄后決定保存及使用緩存數據的時間[1]。
資源數據長度(2字節)
表示資源數據的長度(以字節為單位,如果資源數據為IP則為0004)。
資源數據
該字段是可變長字段,表示按查詢段要求返回的相關資源記錄的數據。
2.2 DNS查詢報文實例
以www.baidu.com為例,用Wireshark俘獲分組,結合2.1的理論內容,很容易看明白的,DNS請求報文如下:
圖7 DNS請求報文示例
2.3 DNS回答報文實例
圖8 DNS回答報文示例
PS:本文大量參考、摘抄[1],對原作者表示感謝。
參考資料:
[1] 博文《總結:DNS報文格式》
[2] Andrew S.Tanenbaum.計算機網絡[M].
[3] 《計算機網絡--自頂向下方法與Internet特色》[M].
from:http://blog.chinaunix.net/uid-9112803-id-3212065.html
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成