dns 报文格式
最近學(xué)習(xí)了下DNS的格式,發(fā)現(xiàn)很多內(nèi)容都是轉(zhuǎn)載自同一個(gè)而且說的不是很清楚,特再整理下
具體可以查看RFC1035 http://www.ietf.org/rfc/rfc1035.txt有詳細(xì)的解釋
對于英語理解不是很好和懶得看這么長的可以看下本文
首先是DNS數(shù)據(jù)幀的格式
+---------------------+ |????????Header???????|?報(bào)文頭 +---------------------+ |???????Question??????|?查詢的問題 +---------------------+ |????????Answer???????|?應(yīng)答 +---------------------+ |??????Authority??????|?授權(quán)應(yīng)答 +---------------------+ |??????Additional?????|?附加信息 +---------------------+其中header報(bào)文頭是必須有的,其他的有沒有在報(bào)文頭里有定義,報(bào)文頭格式:
??0??1??2??3??4??5??6??7??8??9??0??1??2??3??4??5 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |?ID????????????????????????????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |QR|?Opcode????|AA|TC|RD|RA|?Z??????|?RCODE?????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |?QDCOUNT???????????????????????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |?ANCOUNT???????????????????????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |?NSCOUNT???????????????????????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |?ARCOUNT???????????????????????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ID???? 請求客戶端設(shè)置的16位標(biāo)示,服務(wù)器給出應(yīng)答的時(shí)候會(huì)帶相同的標(biāo)示字段回來,這樣請求客戶端就可以區(qū)分不同的請求應(yīng)答了。
QR???? 1個(gè)比特位用來區(qū)分是請求(0)還是應(yīng)答(1)。
OPCODE 4個(gè)比特位用來設(shè)置查詢的種類,應(yīng)答的時(shí)候會(huì)帶相同值,可用的值如下:
0??? 標(biāo)準(zhǔn)查詢 (QUERY)
1??? 反向查詢 (IQUERY)
2??? 服務(wù)器狀態(tài)查詢 (STATUS)
3-15 保留值,暫時(shí)未使用
AA???? 授權(quán)應(yīng)答(Authoritative Answer) - 這個(gè)比特位在應(yīng)答的時(shí)候才有意義,指出給出應(yīng)答的服務(wù)器是查詢域名的授權(quán)解析服務(wù)器。
注意因?yàn)閯e名的存在,應(yīng)答可能存在多個(gè)主域名,這個(gè)AA位對應(yīng)請求名,或者應(yīng)答中的第一個(gè)主域名。
TC???? 截?cái)?TrunCation) - 用來指出報(bào)文比允許的長度還要長,導(dǎo)致被截?cái)唷?/p>
RD???? 期望遞歸(Recursion Desired) - 這個(gè)比特位被請求設(shè)置,應(yīng)答的時(shí)候使用的相同的值返回。如果設(shè)置了RD,就建議域名服務(wù)器進(jìn)行遞歸解析,遞歸查詢的支持是可選的。
RA???? 支持遞歸(Recursion Available) - 這個(gè)比特位在應(yīng)答中設(shè)置或取消,用來代表服務(wù)器是否支持遞歸查詢。
Z????? 保留值,暫時(shí)未使用。在所有的請求和應(yīng)答報(bào)文中必須置為0。
RCODE? 應(yīng)答碼(Response code) - 這4個(gè)比特位在應(yīng)答報(bào)文中設(shè)置,代表的含義如下:
0??? 沒有錯(cuò)誤。
1??? 報(bào)文格式錯(cuò)誤(Format error) - 服務(wù)器不能理解請求的報(bào)文。
2??? 服務(wù)器失敗(Server failure) - 因?yàn)榉?wù)器的原因?qū)е聸]辦法處理這個(gè)請求。
3??? 名字錯(cuò)誤(Name Error) - 只有對授權(quán)域名解析服務(wù)器有意義,指出解析的域名不存在。
4??? 沒有實(shí)現(xiàn)(Not Implemented) - 域名服務(wù)器不支持查詢類型。
5??? 拒絕(Refused) - 服務(wù)器由于設(shè)置的策略拒絕給出應(yīng)答。比如,服務(wù)器不希望對某些請求者給出應(yīng)答,或者服務(wù)器不希望進(jìn)行某些操作(比如區(qū)域傳送zone transfer)。
6-15 保留值,暫時(shí)未使用。
QDCOUNT 無符號16位整數(shù)表示報(bào)文請求段中的問題記錄數(shù)。
ANCOUNT 無符號16位整數(shù)表示報(bào)文回答段中的回答記錄數(shù)。
NSCOUNT 無符號16位整數(shù)表示報(bào)文授權(quán)段中的授權(quán)記錄數(shù)。
ARCOUNT 無符號16位整數(shù)表示報(bào)文附加段中的附加記錄數(shù)。
然后是question的格式:
??0??1??2??3??4??5??6??7??8??9??0??1??2??3??4??5 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |???????????????????????????????????????????????| |?????????????????????QNAME?????????????????????| |???????????????????????????????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |?????????????????????QTYPE?????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |?????????????????????QCLASS????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+QNAME?? 域名被編碼為一些labels序列,每個(gè)labels包含一個(gè)字節(jié)表示后續(xù)字符串長度,以及這個(gè)字符串,以0長度和空字符串來表示域名結(jié)束。注意這個(gè)字段 可能為奇數(shù)字節(jié),不需要進(jìn)行邊界填充對齊。比如www.isnowfy.com表示為03www07isnowfy03com00
QTYPE?? 2個(gè)字節(jié)表示查詢類型,取值可以為任何可用的類型值,以及通配碼來表示所有的資源記錄。
QCLASS? 2個(gè)字節(jié)表示查詢的協(xié)議類。
?
其中QTYPE類型有
A?????????????? 1 a host address
NS????????????? 2 an authoritative name server
MD????????????? 3 a mail destination (Obsolete - use MX)
MF????????????? 4 a mail forwarder (Obsolete - use MX)
CNAME?????????? 5 the canonical name for an alias
SOA???????????? 6 marks the start of a zone of authority
MB????????????? 7 a mailbox domain name (EXPERIMENTAL)
MG????????????? 8 a mail group member (EXPERIMENTAL)
MR????????????? 9 a mail rename domain name (EXPERIMENTAL)
NULL??????????? 10 a null RR (EXPERIMENTAL)
WKS???????????? 11 a well known service description
PTR???????????? 12 a domain name pointer
HINFO?????????? 13 host information
MINFO?????????? 14 mailbox or mail list information
MX????????????? 15 mail exchange
TXT???????????? 16 text strings
查詢類型出現(xiàn)在問題字段中,查詢類型是類型的一個(gè)超集,所有的類型都是可用的查詢類型,其他查詢類型如下:
AXFR??????????? 252 A request for a transfer of an entire zone
MAILB?????????? 253 A request for mailbox-related records (MB, MG or MR)
MAILA?????????? 254 A request for mail agent RRs (Obsolete - see MX)
*?????????????? 255 A request for all records
?
其中QCLASS類型有
IN????????????? 1 the Internet
CS????????????? 2 the CSNET class (Obsolete - used only for examples in some obsolete RFCs)
CH????????????? 3 the CHAOS class
HS????????????? 4 Hesiod [Dyer 87]
查詢類是類的一個(gè)超集
*?????????????? 255 any class
?
應(yīng)答格式:
??0??1??2??3??4??5??6??7??8??9??0??1??2??3??4??5 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |???????????????????????????????????????????????| |???????????????????????????????????????????????| |??????????????????????NAME?????????????????????| |???????????????????????????????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |??????????????????????TYPE?????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |?????????????????????CLASS?????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |??????????????????????TTL??????????????????????| |???????????????????????????????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |???????????????????RDLENGTH????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--| |?????????????????????RDATA?????????????????????| |???????????????????????????????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+NAME??? 資源記錄包含的域名
TYPE??? 2個(gè)字節(jié)表示資源記錄的類型,指出RDATA數(shù)據(jù)的含義
CLASS?? 2個(gè)字節(jié)表示RDATA的類
TTL???? 4字節(jié)無符號整數(shù)表示資源記錄可以緩存的時(shí)間。0代表只能被傳輸,但是不能被緩存。
RDLENGTH??????? 2個(gè)字節(jié)無符號整數(shù)表示RDATA的長度
RDATA?? 不定長字符串來表示記錄,格式根TYPE和CLASS有關(guān)。比如,TYPE是A,CLASS 是 IN,那么RDATA就是一個(gè)4個(gè)字節(jié)的ARPA網(wǎng)絡(luò)地址。
?
報(bào)文壓縮:
為了減小報(bào)文,域名系統(tǒng)使用一種壓縮方法來消除報(bào)文中域名的重復(fù)。使用這種方法,后面重復(fù)出現(xiàn)的域名或者labels被替換為指向之前出現(xiàn)位置的指針。
??0??1??2??3??4??5??6??7??8??9??0??1??2??3??4??5 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |?1?1?|????????????????OFFSET???????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+前兩個(gè)比特位都為1。因?yàn)閘ablels限制為不多于63個(gè)字節(jié),所以label的前兩位一定為0,這樣就可以讓指針與label進(jìn)行區(qū)分。(10 和 01 組合保留,以便日后使用) 。偏移值(OFFSET)表示從報(bào)文開始的字節(jié)指針。偏移量為0表示ID字段的第一個(gè)字節(jié)。
壓縮方法讓報(bào)文中的域名成為:
- 以0結(jié)尾的labels序列
- 一個(gè)指針
- 指針結(jié)尾的labels序列
指針只能在域名不是特殊格式的時(shí)候使用,否則域名服務(wù)器或解析器需要知道資源記錄的格式。目前還沒有這種情況,但是以后可能會(huì)出現(xiàn)。
如果報(bào)文中的域名需要計(jì)算長度,并且使用了壓縮算法,那么應(yīng)該使用壓縮后的長度,而不是壓縮前的長度。
程序可以自由選擇是否使用指針,雖然這回降低報(bào)文的容量,而且很容易產(chǎn)生截?cái)唷2贿^所有的程序都應(yīng)該能夠理解收到的報(bào)文中包含的指針。
比如,一個(gè)報(bào)文需要使用域名F.ISI.ARPA,FOO.F.ISI.ARPA,ARPA,以及根。忽略報(bào)文中的其他字段,應(yīng)該編碼為:
??+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 20|???????????1???????????|???????????F???????????|+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 22|???????????3???????????|???????????I???????????|+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 24|???????????S???????????|???????????I???????????|+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 26|???????????4???????????|???????????A???????????|+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 28|???????????R???????????|???????????P???????????|+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 30|???????????A???????????|???????????0???????????|+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 40|???????????3???????????|???????????F???????????|+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 42|???????????O???????????|???????????O???????????|+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 44|?1?1?|????????????????20???????????????????????|+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 64|?1?1?|????????????????26???????????????????????|+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 92|???????????0???????????|???????????????????????|+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+偏移20的是域名F.ISI.ARPA。域名FOO.F.ISI.ARPA偏移40; 這樣表示FOO的label后面跟著一個(gè)指向之前F.ISI.ARPA的指針。域名ARPA偏移64,使用一個(gè)指針指向F.ISI.ARPA的ARPA。 注意可以用這個(gè)指針是因?yàn)锳RPA是從偏移位置20開始的labels序列中的最后一個(gè)label。 根域名在位置92定義為一個(gè)0,沒有l(wèi)abels。
一個(gè)應(yīng)答幀的例子:
0000 ?00 24 8c 87 39 7e 74 ea ?3a 5b fe a4 08 00 45 00 ? .$..9~t. :[....E.
0010 ?00 91 55 bd 00 00 30 11 ?62 82 08 08 08 08 c0 a8 ? ..U...0. b.......
0020 ?01 65 00 35 ee c4 00 7d ?78 64 3a 8b 81 80 00 01 ? .e.5...} xd:.....
0030 ?00 01 00 00 00 00 03 77 77 77 07 69 73 6e 6f 77 ? .......w ww.isnow
0040 ?66 79 03 63 6f 6d 00 00 ?1c 00 01 c0 0c 00 05 00 ? fy.com.. ........
0050 ?01 00 00 12 ab 00 02 c0 10 ? ? ? ? ? ? ? ? ? ? ? ?........ .
其中DNS幀從3a8b開始,3a8b是ID,flag8180,問題數(shù)1,回答數(shù)1,然后綠色部分是域名,回答是棕色部分,域名是c00c用的前面說的壓縮方式
轉(zhuǎn)載于:https://blog.51cto.com/maorui2005/1741031
總結(jié)