天天看點

dns封包格式

轉載:http://blog.chinaunix.net/uid-24875436-id-3088461.html

DNS封包格式(借個圖貼過來):

dns封包格式
dns封包格式

       說明一下:并不是所有DNS封包都有以上各個部分的。圖中标示的“12位元組”為DNS首部,這部分肯定都會有,首部下面的是正文部分,其中查詢問題部分也都會有。除此之外,回答、授權和額外資訊部分是隻出現在DNS應答封包中的,而這三部分又都采用資源記錄(Recource Record)的相同格式,這個稍後會提到。下面逐個字段地分析DNS封包。

       辨別(2位元組):這個字段網上的解釋有點不清楚:“由客戶程式設定并有伺服器傳回結果。”看了下實驗室的程式和文檔,原來這個字段可以看作是DNS封包的ID,對于相關聯的請求封包和應答封包,這個字段是相同的,由此可以區分DNS應答封包是哪個請求封包的響應。

       标志(2位元組):這部分非常重要,需要逐比特分析。再借個圖:

dns封包格式
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 保留

       标志段說完了,下面是問題數、資源記錄數、授權資源記錄數和額外資源記錄數,這四個字段都是兩位元組,分别對應下面的查詢問題、回答、授權和額外資訊部分的數量。一般問題數都為1,DNS查詢封包中,資源記錄數、授權資源記錄數和額外資源記錄數都為0.

       該說正文部分了。查詢問題部分格式如下:

dns封包格式
dns封包格式

       查詢名部分長度不定,一般為要查詢的域名(也會有IP的時候,即反向查詢)。此部分由一個或者多個标示符序列組成,每個标示符以首位元組數的計數值來說明該标示符長度,每個名字以0結束。計數位元組數必須是0~63之間。該字段無需填充位元組。還是借個例子來說明更直覺些,查詢名為gemini.tuc.noao.edu的話,查詢名字段如下:

dns封包格式
dns封包格式

       查詢類型(2位元組):通常查詢類型為A(由名字獲得IP位址)或者PTR(獲得IP位址對應的域名),類型清單如下:

        類型 助記符說明

        1 AIPv4位址。

        2 NS名字伺服器。

        5 CNAME規範名稱。定義主機的正式名字的别名。

        6 SOA開始授權。标記一個區的開始。

       11 WKS熟知服務。定義主機提供的網絡服務。

       12 PTR指針。把IP位址轉化為域名。

       13 HINFO主機資訊。給出主機使用的硬體和作業系統的表述。

       15 MX郵件交換。把郵件改變路由送到郵件伺服器。

       28 AAAAIPv6位址。

       252 AXFR傳送整個區的請求。

       255 ANY對所有記錄的請求。

      查詢類(2位元組):通常為1,指Internet資料。

      前面說過,回答字段,授權字段和附加資訊字段均采用資源記錄RR(Resource Record)的相同格式。該格式如下:

dns封包格式
dns封包格式

       域名字段(不定長或2位元組):記錄中資源資料對應的名字,它的格式和查詢名字段格式相同。當封包中域名重複出現時,就需要使用2位元組的偏移指針來替換。例如,在資源記錄中,域名通常是查詢問題部分的域名的重複,就需要用指針指向查詢問題部分的域名。關于指針怎麼用,TCP/IP詳解裡面有,即2位元組的指針,最簽名的兩個高位是11,用于識别指針。其他14位從封包開始處計數(從0開始),指出該封包中的相應位元組數。注意,DNS封包的第一個位元組是位元組0,第二個封包是位元組1。一般響應封包中,資源部分的域名都是指針C00C(1100000000001100),剛好指向請求部分的域名。

       類型(2位元組)、類(2位元組):含義與查詢問題部分的類型和類相同。

       生存時間(4位元組):該字段表示資源記錄的生命周期(以秒為機關),一般用于當位址解析程式取出資源記錄後決定儲存及使用緩存資料的時間。

       資源資料長度(2位元組):表示資源資料的長度(以位元組為機關,如果資源資料為IP則為0004)

       資源資料:該字段是可變長字段,表示按查詢段要求傳回的相關資源記錄的資料。

       基本上對DNS封包格式的分析就是這些了。貼個封包執行個體,用wireshark抓的:

dns封包格式
dns封包格式

    對應的封包:

dns封包格式

    就不再分析了,對比wireshark的分析應該能找到各個字段。

繼續閱讀