DNS報文格式(借個圖貼過來):
?
??? 說明一下:并不是所有DNS報文都有以上各個部分的。圖中標(biāo)示的“12字節(jié)”為DNS首部,這部分肯定都會有,首部下面的是正文部分,其中查詢問題部分也都會有。除此之外,回答、授權(quán)和額外信息部分是只出現(xiàn)在DNS應(yīng)答報文中的,而這三部分又都采用資源記錄(Recource Record)的相同格式,這個稍后會提到。下面逐個字段地分析DNS報文。
??? 標(biāo)識(2字節(jié)):這個字段網(wǎng)上的解釋有點不清楚:“由客戶程序設(shè)置并有服務(wù)器返回結(jié)果。”看了下實驗室的程序和文檔,原來這個字段可以看作是DNS報文的ID,對于相關(guān)聯(lián)的請求報文和應(yīng)答報文,這個字段是相同的,由此可以區(qū)分DNS應(yīng)答報文是哪個請求報文的響應(yīng)。
??? 標(biāo)志(2字節(jié)):這部分非常重要,需要逐比特分析。再借個圖:
?
??? QR(1比特):查詢/響應(yīng)的標(biāo)志位,1為響應(yīng),0為查詢。
??? opcode(4比特):定義查詢或響應(yīng)的類型(若為0則表示是標(biāo)準的,若為1則是反向的,若為2則是服務(wù)器狀態(tài)請求)。
??? AA(1比特):授權(quán)回答的標(biāo)志位。該位在響應(yīng)報文中有效,1表示名字服務(wù)器是權(quán)限服務(wù)器(關(guān)于權(quán)限服務(wù)器以后再討論)
??? TC(1比特):截斷標(biāo)志位。1表示響應(yīng)已超過512字節(jié)并已被截斷(依稀好像記得哪里提過這個截斷和UDP有關(guān),先記著)
??? RD(1比特):該位為1表示客戶端希望得到遞歸回答(遞歸以后再討論)
??? RA(1比特):只能在響應(yīng)報文中置為1,表示可以得到遞歸響應(yīng)。
??? zero(3比特):不說也知道都是0了,保留字段。
?? rcode(4比特):返回碼,表示響應(yīng)的差錯狀態(tài),通常為0(沒有差錯)和3(名字差錯)
??? 標(biāo)志段說完了,下面是問題數(shù)、資源記錄數(shù)、授權(quán)資源記錄數(shù)和額外資源記錄數(shù),這四個字段都是兩字節(jié),分別對應(yīng)下面的查詢問題、回答、授權(quán)和額外信息部分的數(shù)量。一般問題數(shù)都為1,DNS查詢報文中,資源記錄數(shù)、授權(quán)資源記錄數(shù)和額外資源記錄數(shù)都為0.
??? 該說正文部分了。查詢問題部分格式如下:
?
??? 查詢名部分長度不定,一般為要查詢的域名(也會有IP的時候,即反向查詢)。此部分由一個或者多個標(biāo)示符序列組成,每個標(biāo)示符以首字節(jié)數(shù)的計數(shù)值來說明該標(biāo)示符長度,每個名字以0結(jié)束。計數(shù)字節(jié)數(shù)必須是0~63之間。該字段無需填充字節(jié)。還是借個例子來說明更直觀些,查詢名為gemini.tuc.noao.edu的話,查詢名字段如下:
?
??? 查詢類型(2字節(jié)):通常查詢類型為A(由名字獲得IP地址)或者PTR(獲得IP地址對應(yīng)的域名),類型列表如下:
??? 類型
?助記符
?說明
?
1
?A
?IPv4地址。
?
2
?NS
?名字服務(wù)器。
?
5
?CNAME
?規(guī)范名稱。定義主機的正式名字的別名。
?
6
?SOA
?開始授權(quán)。標(biāo)記一個區(qū)的開始。
?
11
?WKS
?熟知服務(wù)。定義主機提供的網(wǎng)絡(luò)服務(wù)。
?
12
?PTR
?指針。把IP地址轉(zhuǎn)化為域名。
?
13
?HINFO
?主機信息。給出主機使用的硬件和操作系統(tǒng)的表述。
?
15
?MX
?郵件交換。把郵件改變路由送到郵件服務(wù)器。
?
28
?AAAA
?IPv6地址。
?
252
?AXFR
?傳送整個區(qū)的請求。
?
255
?ANY
?對所有記錄的請求。
?
?
?
?? 查詢類(2字節(jié)):通常為1,指Internet數(shù)據(jù)。
前面說過,回答字段,授權(quán)字段和附加信息字段均采用資源記錄RR(Resource Record)的相同格式。該格式如下:
?
??? 域名字段(不定長或2字節(jié)):記錄中資源數(shù)據(jù)對應(yīng)的名字,它的格式和查詢名字段格式相同。但是看報文實例還有分析程序,我發(fā)現(xiàn)很多DNS響應(yīng)報文中,此字段由于和查詢問題部分的域名相同,改為使用2字節(jié)指針,指向查詢問題部分的域名。關(guān)于指針怎么計算,TCP/IP詳解里面有,不過這本書昨天剛被師兄拿回去,所以現(xiàn)在寫不了了。
??? 類型(2字節(jié))、類(2字節(jié)):含義與查詢問題部分的類型和類相同。
??? 生存時間(4字節(jié)):該字段表示資源記錄的生命周期(以秒為單位),一般用于當(dāng)?shù)刂方馕龀绦蛉〕鲑Y源記錄后決定保存及使用緩存數(shù)據(jù)的時間。
??? 資源數(shù)據(jù)長度(2字節(jié)):表示資源數(shù)據(jù)的長度(以字節(jié)為單位,如果資源數(shù)據(jù)為IP則為0004)
??? 資源數(shù)據(jù):該字段是可變長字段,表示按查詢段要求返回的相關(guān)資源記錄的數(shù)據(jù)。
??? 基本上對DNS報文格式的分析就是這些了。貼個報文實例,用wireshark抓的:
?
??? 對應(yīng)的報文:
?
??? 就不再分析了,對比wireshark的分析應(yīng)該能找到各個字段。
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/jianghui3132749/archive/2010/03/03/5343420.aspx