dns 报文格式
最近學習了下DNS的格式,發現很多內容都是轉載自同一個而且說的不是很清楚,特再整理下
具體可以查看RFC1035 http://www.ietf.org/rfc/rfc1035.txt有詳細的解釋
對于英語理解不是很好和懶得看這么長的可以看下本文
首先是DNS數據幀的格式
+---------------------+ |????????Header???????|?報文頭 +---------------------+ |???????Question??????|?查詢的問題 +---------------------+ |????????Answer???????|?應答 +---------------------+ |??????Authority??????|?授權應答 +---------------------+ |??????Additional?????|?附加信息 +---------------------+其中header報文頭是必須有的,其他的有沒有在報文頭里有定義,報文頭格式:
??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???? 請求客戶端設置的16位標示,服務器給出應答的時候會帶相同的標示字段回來,這樣請求客戶端就可以區分不同的請求應答了。
QR???? 1個比特位用來區分是請求(0)還是應答(1)。
OPCODE 4個比特位用來設置查詢的種類,應答的時候會帶相同值,可用的值如下:
0??? 標準查詢 (QUERY)
1??? 反向查詢 (IQUERY)
2??? 服務器狀態查詢 (STATUS)
3-15 保留值,暫時未使用
AA???? 授權應答(Authoritative Answer) - 這個比特位在應答的時候才有意義,指出給出應答的服務器是查詢域名的授權解析服務器。
注意因為別名的存在,應答可能存在多個主域名,這個AA位對應請求名,或者應答中的第一個主域名。
TC???? 截斷(TrunCation) - 用來指出報文比允許的長度還要長,導致被截斷。
RD???? 期望遞歸(Recursion Desired) - 這個比特位被請求設置,應答的時候使用的相同的值返回。如果設置了RD,就建議域名服務器進行遞歸解析,遞歸查詢的支持是可選的。
RA???? 支持遞歸(Recursion Available) - 這個比特位在應答中設置或取消,用來代表服務器是否支持遞歸查詢。
Z????? 保留值,暫時未使用。在所有的請求和應答報文中必須置為0。
RCODE? 應答碼(Response code) - 這4個比特位在應答報文中設置,代表的含義如下:
0??? 沒有錯誤。
1??? 報文格式錯誤(Format error) - 服務器不能理解請求的報文。
2??? 服務器失敗(Server failure) - 因為服務器的原因導致沒辦法處理這個請求。
3??? 名字錯誤(Name Error) - 只有對授權域名解析服務器有意義,指出解析的域名不存在。
4??? 沒有實現(Not Implemented) - 域名服務器不支持查詢類型。
5??? 拒絕(Refused) - 服務器由于設置的策略拒絕給出應答。比如,服務器不希望對某些請求者給出應答,或者服務器不希望進行某些操作(比如區域傳送zone transfer)。
6-15 保留值,暫時未使用。
QDCOUNT 無符號16位整數表示報文請求段中的問題記錄數。
ANCOUNT 無符號16位整數表示報文回答段中的回答記錄數。
NSCOUNT 無符號16位整數表示報文授權段中的授權記錄數。
ARCOUNT 無符號16位整數表示報文附加段中的附加記錄數。
然后是question的格式:
??0??1??2??3??4??5??6??7??8??9??0??1??2??3??4??5 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |???????????????????????????????????????????????| |?????????????????????QNAME?????????????????????| |???????????????????????????????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |?????????????????????QTYPE?????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |?????????????????????QCLASS????????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+QNAME?? 域名被編碼為一些labels序列,每個labels包含一個字節表示后續字符串長度,以及這個字符串,以0長度和空字符串來表示域名結束。注意這個字段 可能為奇數字節,不需要進行邊界填充對齊。比如www.isnowfy.com表示為03www07isnowfy03com00
QTYPE?? 2個字節表示查詢類型,取值可以為任何可用的類型值,以及通配碼來表示所有的資源記錄。
QCLASS? 2個字節表示查詢的協議類。
?
其中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
查詢類型出現在問題字段中,查詢類型是類型的一個超集,所有的類型都是可用的查詢類型,其他查詢類型如下:
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]
查詢類是類的一個超集
*?????????????? 255 any class
?
應答格式:
??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個字節表示資源記錄的類型,指出RDATA數據的含義
CLASS?? 2個字節表示RDATA的類
TTL???? 4字節無符號整數表示資源記錄可以緩存的時間。0代表只能被傳輸,但是不能被緩存。
RDLENGTH??????? 2個字節無符號整數表示RDATA的長度
RDATA?? 不定長字符串來表示記錄,格式根TYPE和CLASS有關。比如,TYPE是A,CLASS 是 IN,那么RDATA就是一個4個字節的ARPA網絡地址。
?
報文壓縮:
為了減小報文,域名系統使用一種壓縮方法來消除報文中域名的重復。使用這種方法,后面重復出現的域名或者labels被替換為指向之前出現位置的指針。
??0??1??2??3??4??5??6??7??8??9??0??1??2??3??4??5 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |?1?1?|????????????????OFFSET???????????????????| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+前兩個比特位都為1。因為lablels限制為不多于63個字節,所以label的前兩位一定為0,這樣就可以讓指針與label進行區分。(10 和 01 組合保留,以便日后使用) 。偏移值(OFFSET)表示從報文開始的字節指針。偏移量為0表示ID字段的第一個字節。
壓縮方法讓報文中的域名成為:
- 以0結尾的labels序列
- 一個指針
- 指針結尾的labels序列
指針只能在域名不是特殊格式的時候使用,否則域名服務器或解析器需要知道資源記錄的格式。目前還沒有這種情況,但是以后可能會出現。
如果報文中的域名需要計算長度,并且使用了壓縮算法,那么應該使用壓縮后的長度,而不是壓縮前的長度。
程序可以自由選擇是否使用指針,雖然這回降低報文的容量,而且很容易產生截斷。不過所有的程序都應該能夠理解收到的報文中包含的指針。
比如,一個報文需要使用域名F.ISI.ARPA,FOO.F.ISI.ARPA,ARPA,以及根。忽略報文中的其他字段,應該編碼為:
??+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 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后面跟著一個指向之前F.ISI.ARPA的指針。域名ARPA偏移64,使用一個指針指向F.ISI.ARPA的ARPA。 注意可以用這個指針是因為ARPA是從偏移位置20開始的labels序列中的最后一個label。 根域名在位置92定義為一個0,沒有labels。
一個應答幀的例子:
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,問題數1,回答數1,然后綠色部分是域名,回答是棕色部分,域名是c00c用的前面說的壓縮方式
轉載于:https://blog.51cto.com/maorui2005/1741031
總結