原文鏈接地址:http://blog.chinaunix.net/uid-24875436-id-3088461.html
DNS報文格式(借個圖貼過來):
說明一下:並不是所有DNS報文都有以上各個部分的。圖中標示的“12字節”為DNS首部,這部分肯定都會有,首部下面的是正文部分,其中查詢問題部分也都會有。除此之外,回答、授權和額外信息部分是只出現在DNS應答報文中的,而這三部分又都采用資源記錄(Recource Record)的相同格式,這個稍后會提到。下面逐個字段地分析DNS報文。
標識(2字節):這個字段網上的解釋有點不清楚:“由客戶程序設置並有服務器返回結果。”看了下實驗室的程序和文檔,原來這個字段可以看作是DNS報文的ID,對於相關聯的請求報文和應答報文,這個字段是相同的,由此可以區分DNS應答報文是哪個請求報文的響應。
標志(2字節):這部分非常重要,需要逐比特分析。再借個圖:
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 保留
標志段說完了,下面是問題數、資源記錄數、授權資源記錄數和額外資源記錄數,這四個字段都是兩字節,分別對應下面的查詢問題、回答、授權和額外信息部分的數量。一般問題數都為1,DNS查詢報文中,資源記錄數、授權資源記錄數和額外資源記錄數都為0.
該說正文部分了。查詢問題部分格式如下:
查詢名部分長度不定,一般為要查詢的域名(也會有IP的時候,即反向查詢)。此部分由一個或者多個標示符序列組成,每個標示符以首字節數的計數值來說明該標示符長度,每個名字以0結束。計數字節數必須是0~63之間。該字段無需填充字節。還是借個例子來說明更直觀些,查詢名為gemini.tuc.noao.edu的話,查詢名字段如下:
查詢類型(2字節):通常查詢類型為A(由名字獲得IP地址)或者PTR(獲得IP地址對應的域名),類型列表如下:
類型 助記符 說明
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 對所有記錄的請求。
查詢類(2字節):通常為1,指Internet數據。
前面說過,回答字段,授權字段和附加信息字段均采用資源記錄RR(Resource Record)的相同格式。該格式如下:
域名字段(不定長或2字節):記錄中資源數據對應的名字,它的格式和查詢名字段格式相同。當報文中域名重復出現時,就需要使用2字節的偏移指針來替換。例如,在資源記錄中,域名通常是查詢問題部分的域名的重復,就需要用指針指向查詢問題部分的域名。關於指針怎么用,TCP/IP詳解里面有,即2字節的指針,最簽名的兩個高位是11,用於識別指針。其他14位從報文開始處計數(從0開始),指出該報文中的相應字節數。注意,DNS報文的第一個字節是字節0,第二個報文是字節1。一般響應報文中,資源部分的域名都是指針C00C(1100000000001100),剛好指向請求部分的域名。
類型(2字節)、類(2字節):含義與查詢問題部分的類型和類相同。
生存時間(4字節):該字段表示資源記錄的生命周期(以秒為單位),一般用於當地址解析程序取出資源記錄后決定保存及使用緩存數據的時間。
資源數據長度(2字節):表示資源數據的長度(以字節為單位,如果資源數據為IP則為0004)
資源數據:該字段是可變長字段,表示按查詢段要求返回的相關資源記錄的數據。
基本上對DNS報文格式的分析就是這些了。貼個報文實例,用wireshark抓的:
對應的報文:
就不再分析了,對比wireshark的分析應該能找到各個字段。







