DNS_協(xié)議報文格式

一、Header
(1)會話標(biāo)識(2字節(jié))
是DNS報文的ID標(biāo)識,對于請求報文和其對應(yīng)的應(yīng)答報文,這個字段是相同的,通過它可以區(qū)分DNS應(yīng)答報文是哪個請求的響應(yīng)。
長度為16位,是一個用戶發(fā)送查詢的時候定義的隨機(jī)數(shù),當(dāng)服務(wù)器返回結(jié)果的時候,返回包的ID與用戶發(fā)送的一致
(2)標(biāo)志(2字節(jié))

QR(1bit) : 查詢/響應(yīng)標(biāo)志,0 為查詢,1 為響應(yīng)
Opcode(4bit) : 0表示標(biāo)準(zhǔn)查詢,1 表示反向查詢,2 表示服務(wù)器狀態(tài)請求
AA(1bit) : 授權(quán)回答,表示是否是權(quán)威服務(wù)器 - (Answer)。
TC(1bit) : 表示響應(yīng)是否已超過512字節(jié),被截?cái)唷?br> RD(1bit) : 1表示客戶端希望得到遞歸回答。
RA(1bit) : 服務(wù)器是否能遞歸解析 - (Answer)。
Zero (3bit):保留字段。
RCode(4bit) : 表示返回碼 - (Answer)。
(0表示沒有差錯,1表示格式差錯、2表示服務(wù)器錯誤、3表示名字差錯、4表示查詢類型不支持、5表示在管理上被禁止)
二、Queries區(qū)域
長度16位,報文請求段中的問題記錄數(shù)

(1)查詢名
長度不固定,且不使用填充字節(jié),一般該字段表示的就是需要查詢的域名(如果是反向查詢,則為IP,反向查詢即由IP地址反查域名),一般的格式如下圖所示。

(2)查詢類型
enum QueryType //查詢的資源記錄類型。
{
A=0x01, //指定計(jì)算機(jī) IP 地址。
NS=0x02, //指定用于命名區(qū)域的 DNS 名稱服務(wù)器。
MD=0x03, //指定郵件接收站(此類型已經(jīng)過時了,使用MX代替)
MF=0x04, //指定郵件中轉(zhuǎn)站(此類型已經(jīng)過時了,使用MX代替)
CNAME=0x05, //指定用于別名的規(guī)范名稱。
SOA=0x06, //指定用于 DNS 區(qū)域的“起始授權(quán)機(jī)構(gòu)”。
MB=0x07, //指定郵箱域名。
MG=0x08, //指定郵件組成員。
MR=0x09, //指定郵件重命名域名。
NULL=0x0A, //指定空的資源記錄
WKS=0x0B, //描述已知服務(wù)。
PTR=0x0C, //如果查詢是 IP 地址,則指定計(jì)算機(jī)名;否則指定指向其它信息的指針。
HINFO=0x0D, //指定計(jì)算機(jī) CPU 以及操作系統(tǒng)類型。
MINFO=0x0E, //指定郵箱或郵件列表信息。
MX=0x0F, //指定郵件交換器。
TXT=0x10, //指定文本信息。
UINFO=0x64, //指定用戶信息。
UID=0x65, //指定用戶標(biāo)識符。
GID=0x66, //指定組名的組標(biāo)識符。
ANY=0xFF //指定所有數(shù)據(jù)類型。
};
(3)指定信息的協(xié)議組
Question class:長度為16位,表示分類。
enum QueryClass //指定信息的協(xié)議組。
{
IN=0x01, //指定 Internet 類別。
CSNET=0x02, //指定 CSNET 類別。(已過時)
CHAOS=0x03, //指定 Chaos 類別。
HESIOD=0x04,//指定 MIT Athena Hesiod 類別。
ANY=0xFF //指定任何以前列出的通配符。
};
一個實(shí)際查詢www.ifeng.com的請求包:

三、資源記錄(RR)區(qū)域
(包括回答區(qū)域,授權(quán)區(qū)域和附加區(qū)域)

三個區(qū)域分別是:回答區(qū)域,授權(quán)區(qū)域和附加區(qū)域
域名(2字節(jié)或不定長):
它的格式和Queries區(qū)域的查詢名字字段是一樣的。有一點(diǎn)不同就是,當(dāng)報文中域名重復(fù)出現(xiàn)的時候,該字段使用2個字節(jié)的偏移指針來表示。
比如,在資源記錄中,域名通常是查詢問題部分的域名的重復(fù),因此用2字節(jié)的指針來表示,具體格式是最前面的兩個高位是 11,用于識別指針。
其余的14位從DNS報文的開始處計(jì)數(shù)(從0開始),指出該報文中的相應(yīng)字節(jié)數(shù)。一個典型的例子,C00C(1100000000001100,12正好是頭部的長度,其正好指向Queries區(qū)域的查詢名字字段)。
查詢類:
- 對于Internet信息,總是IN
生存時間(TTL):
- 以秒為單位,表示的是資源記錄的生命周期,一般用于當(dāng)?shù)刂方馕龀绦蛉〕鲑Y源記錄后決定保存及使用緩存數(shù)據(jù)的時間,它同時也可以表明該資源記錄的穩(wěn)定程度,極為穩(wěn)定的信息會被分配一個很大的值(比如86400,這是一天的秒數(shù))。
資源數(shù)據(jù)(RD):
- 該字段是一個可變長字段,表示按照查詢段的要求返回的相關(guān)資源記錄的數(shù)據(jù)??梢允茿ddress(表明查詢報文想要的回應(yīng)是一個IP地址)或者CNAME(表明查詢報文想要的回應(yīng)是一個規(guī)范主機(jī)名)等。
四、DNS響應(yīng)包
響應(yīng)包也有一個與請求包相同格式,都是固定12字節(jié)的頭部。
每個answer的結(jié)構(gòu)包括:name, type, class, TTL, data length, data
其余部分包括
**Queries: ** 查詢的問題(與請求包中的一樣)
Answers:查詢的問題的回答
Authoritative nameservers: 一些域名服務(wù)器(應(yīng)該是與該本次查詢有關(guān)的吧)

name (2字節(jié)) :
c0 0c , c0表示后面的一個字節(jié)是一個偏移地址,該偏移地址中存儲了一個名字,這樣表示是為了節(jié)約空間,不過也增加了 復(fù)雜性。
type, class(各兩字節(jié)):與前面描述相同
TTL(4字節(jié)):表示查詢的地址的有效時間
data length(2字節(jié)):后面數(shù)據(jù)部分的長度
data:一個域名(查詢域名的一個別名)或一個IP地址
DNS總數(shù)據(jù)包
DNS查詢包

DNS響應(yīng)包

