一、域名和資源記錄的定義
1、Name space definitions
2、資源記錄定義(RR definitions)
2.1 格式
后面分析報(bào)文的時(shí)候詳細(xì)解釋。
2.2 類型值(TYPE values)
類型主要用在資源記錄中,注意下面的值是QTYPE的一個(gè)子集。
類型 值和含義
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
2.3 查詢類型(QTYPE values)
查詢類型出現(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
2.4 類(CLASS values)
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]
2.5 查詢類(QCLASS values)
查詢類是類的一個(gè)超集
* 255 any class
3、Standard RRs
3.1 CNAME RDATA format
3.2 HINFO RDATA format
3.3 MB RDATA format (EXPERIMENTAL)
3.4 MD RDATA format (Obsolete)
3.5 MF RDATA format (Obsolete)
3.6 MG RDATA format (EXPERIMENTAL)
3.7 MINFO RDATA format (EXPERIMENTAL)
3.8 MR RDATA format (EXPERIMENTAL)
3.9 MX RDATA format
3.10 NULL RDATA format (EXPERIMENTAL)
3.11 NS RDATA format
3.12 PTR RDATA format
3.13 SOA RDATA format
3.14 TXT RDATA format
4、ARPA Internet specific RRs
4.1 A RDATA format
4.2 WKS RDATA format
5、IN-ADDR.ARPA domain
6、Defining new types, classes, and special namespaces
二、報(bào)文
1、報(bào)文格式(Format)
dns請(qǐng)求和應(yīng)答都是用相同的報(bào)文格式,分成5個(gè)段(有的報(bào)文段在不同的情況下可能為空),如下:
+---------------------+
| Header | 報(bào)文頭
+---------------------+
| Question | 查詢的問題
+---------------------+
| Answer | 應(yīng)答
+---------------------+
| Authority | 授權(quán)應(yīng)答
+---------------------+
| Additional | 附加信息
+---------------------+
Header段是必須存在的,它定義了報(bào)文是請(qǐng)求還是應(yīng)答,也定義了其他段是否需要存在,以及是標(biāo)準(zhǔn)查詢還是其他。
Question段描述了查詢的問題,包括查詢類型(QTYPE),查詢類(QCLASS),以及查詢的域名(QNAME)。剩下的3個(gè)段包含相同的格式:一系列可能為空的資源記錄(RRs)。Answer段包含回答問題的RRs;授權(quán)段包含授權(quán)域名服務(wù)器的RRs;附加段包含和請(qǐng)求相關(guān)的,但是不是必須回答的RRs。
1.1 Header的格式
報(bào)文頭包含如下字段:
1 1 1 1 1 1
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 請(qǐng)求客戶端設(shè)置的16位標(biāo)示,服務(wù)器給出應(yīng)答的時(shí)候會(huì)帶相同的標(biāo)示字段回來,這樣請(qǐng)求客戶端就可以區(qū)分不同的請(qǐng)求應(yīng)答了。
QR 1個(gè)比特位用來區(qū)分是請(qǐng)求(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位對(duì)應(yīng)請(qǐng)求名,或者應(yīng)答中的第一個(gè)主域名。
TC 截?cái)?TrunCation) - 用來指出報(bào)文比允許的長度還要長,導(dǎo)致被截?cái)唷?BR> RD 期望遞歸(Recursion Desired) - 這個(gè)比特位被請(qǐng)求設(shè)置,應(yīng)答的時(shí)候使用的相同的值返回。如果設(shè)置了RD,就建議域名服務(wù)器進(jìn)行遞歸解析,遞歸查詢的支持是可選的。
RA 支持遞歸(Recursion Available) - 這個(gè)比特位在應(yīng)答中設(shè)置或取消,用來代表服務(wù)器是否支持遞歸查詢。
Z 保留值,暫時(shí)未使用。在所有的請(qǐng)求和應(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ù)器不能理解請(qǐng)求的報(bào)文。
2 服務(wù)器失敗(Server failure) - 因?yàn)榉⻊?wù)器的原因?qū)е聸]辦法處理這個(gè)請(qǐng)求。
3 名字錯(cuò)誤(Name Error) - 只有對(duì)授權(quán)域名解析服務(wù)器有意義,指出解析的域名不存在。
4 沒有實(shí)現(xiàn)(Not Implemented) - 域名服務(wù)器不支持查詢類型。
5 拒絕(Refused) - 服務(wù)器由于設(shè)置的策略拒絕給出應(yīng)答。比如,服務(wù)器不希望對(duì)某些請(qǐng)求者給出應(yīng)答,或者服務(wù)器不希望進(jìn)行某些操作(比如區(qū)域傳送zone transfer)。
6-15 保留值,暫時(shí)未使用。
QDCOUNT 無符號(hào)16位整數(shù)表示報(bào)文請(qǐng)求段中的問題記錄數(shù)。
ANCOUNT 無符號(hào)16位整數(shù)表示報(bào)文回答段中的回答記錄數(shù)。
NSCOUNT 無符號(hào)16位整數(shù)表示報(bào)文授權(quán)段中的授權(quán)記錄數(shù)。
ARCOUNT 無符號(hào)16位整數(shù)表示報(bào)文附加段中的附加記錄數(shù)。
1.2 Question的格式
在大多數(shù)查詢中,Question段包含著問題(question),比如,指定問什么。這個(gè)段包含QDCOUNT(usually 1)個(gè)問題,每個(gè)問題為下面的格式:
1 1 1 1 1 1
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)行邊界填充對(duì)齊。
QTYPE 2個(gè)字節(jié)表示查詢類型,.取值可以為任何可用的類型值,以及通配碼來表示所有的資源記錄。
QCLASS 2個(gè)字節(jié)表示查詢的協(xié)議類,比如,IN代表Internet。
1.3 資源記錄格式(Resource record)
應(yīng)答,授權(quán),附加段都共用相同的格式:多個(gè)資源記錄,資源記錄的個(gè)數(shù)由報(bào)文頭段中對(duì)應(yīng)的幾個(gè)數(shù)值確定,每個(gè)資源記錄格式如下:
1 1 1 1 1 1
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é)無符號(hào)整數(shù)表示資源記錄可以緩存的時(shí)間。0代表只能被傳輸,但是不能被緩存。
RDLENGTH 2個(gè)字節(jié)無符號(hào)整數(shù)表示RDATA的長度
RDATA 不定長字符串來表示記錄,格式根TYPE和CLASS有關(guān)。比如,TYPE是A,CLASS 是 IN,那么RDATA就是一個(gè)4個(gè)字節(jié)的ARPA網(wǎng)絡(luò)地址。
1.4 報(bào)文壓縮
為了減小報(bào)文,域名系統(tǒng)使用一種壓縮方法來消除報(bào)文中域名的重復(fù)。使用這種方法,后面重復(fù)出現(xiàn)的域名或者labels被替換為指向之前出現(xiàn)位置的指針。
指針占用2個(gè)字節(jié),格式如下:
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)。不過所有的程序都應(yīng)該能夠理解收到的報(bào)文中包含的指針。
比如,一個(gè)報(bào)文需要使用域名F.ISI.ARPA,F(xiàn)OO.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。
2、傳輸(Transport)
DNS假設(shè)報(bào)文以數(shù)據(jù)報(bào),或者從虛鏈路上以字節(jié)流進(jìn)行傳輸。虛鏈路可以用來任何的DNS的傳輸,數(shù)據(jù)報(bào)可以減少代價(jià)提高傳輸性能。區(qū)域刷新必須使用虛鏈路,因?yàn)樾枰粋(gè)可靠的傳輸。
因特網(wǎng)中DNS支持端口53的TCP[RFC-793]和端口53的UDP [RFC-768]傳輸。
2.1 使用UDP
消息通過UDP的53端口進(jìn)行傳輸。
UDP傳輸?shù)南?yán)格要求限制在512字節(jié)內(nèi)(不包括IP和UDP頭)。長報(bào)文被截?cái)啵瑫r(shí)置報(bào)文頭的TC標(biāo)志位。
UDP不能用于區(qū)域傳輸,主要用在標(biāo)準(zhǔn)的域名查詢。報(bào)文通過UDP可能會(huì)丟失,所以重傳機(jī)制是需要的,請(qǐng)求和應(yīng)答可能在網(wǎng)絡(luò)中或者服務(wù)器處理的時(shí)候被重新排序,所以解析客戶端不能依賴請(qǐng)求的發(fā)送順序。
UDP的最優(yōu)重傳策略會(huì)因?yàn)榫W(wǎng)絡(luò)的性能,客戶的需要而不同,但是下面是推薦的:
- 客戶端在對(duì)一臺(tái)固定的服務(wù)器重試之前,嘗試一下其他的服務(wù)器。
- 如果可能的話,重傳的時(shí)間間隔需要建立在統(tǒng)計(jì)分析數(shù)據(jù)的基礎(chǔ)上,太快的重試可能因?yàn)榱刻髮?dǎo)致服務(wù)器響應(yīng)慢。建議的重試時(shí)間為2-5秒。
2.2 使用TCP
通過TCP發(fā)送的報(bào)文使用53端口,報(bào)文的前面有個(gè)字節(jié)表示后面報(bào)文的長度,長度不包括自己占用的2個(gè)字節(jié),這個(gè)長度使得底層收取完整的報(bào)文后在交給上層處理。
很多連接管理策略如下:
- 服務(wù)器不能阻塞其他傳輸TCP數(shù)據(jù)的請(qǐng)求。
- 服務(wù)器需要支持多連接
- 服務(wù)器要等客戶端主動(dòng)關(guān)閉連接,除非所有的數(shù)據(jù)都已經(jīng)傳輸完了。
- 如果服務(wù)器想關(guān)閉沒有通訊的連接來釋放資源,那么需要等待大約2分鐘的時(shí)間。特別是要等SOA和AXFR(刷新操作中)在一個(gè)連接上傳輸完。服務(wù)器關(guān)閉連接的時(shí)候可以單方面的關(guān)閉,或者直接reset掉連接。
三、實(shí)例
1、請(qǐng)求解析www.baidu.com.
在linux下使用tcpdump port 53抓包,同時(shí)使用dig進(jìn)行解析測(cè)試,得到結(jié)果如下:
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1169
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 4, ADDITIONAL: 0
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 1200 IN CNAME www.a.shifen.com.
www.a.shifen.com. 600 IN A 121.14.88.76
www.a.shifen.com. 600 IN A 121.14.89.10
;; AUTHORITY SECTION:
a.shifen.com. 86411 IN NS ns5.a.shifen.com.
a.shifen.com. 86411 IN NS ns6.a.shifen.com.
a.shifen.com. 86411 IN NS ns1.a.shifen.com.
a.shifen.com. 86411 IN NS ns3.a.shifen.com.
1.1 請(qǐng)求報(bào)文
0x0000: 4500 003b f8cf 0000 4011 f9ae xxxx xxxx E..;....@......r
0x0010: xxxx xxxx 92b8 0035 0027 23ed 0491 0100 ...q...5.'#.....
0x0020: 0001 0000 0000 0000 0377 7777 0562 6169 .........www.bai
0x0030: 6475 0363 6f6d 0000 0100 01 du.com.....
0491:報(bào)文ID,也就是十進(jìn)制的1169
0100:標(biāo)志,置了RD字段,也就是期望遞歸的請(qǐng)求
0001 0000 0000 0000:分別為問題數(shù),應(yīng)答數(shù),授權(quán)記錄數(shù),附加記錄數(shù),也就是1個(gè)問題
0377 7777 0562 6169 6475 0363 6f6d 00:也就是www.baidu.com的編碼
00 0100 01:查詢類型和查詢類都為1,也就是internet的A記錄查詢
1.2 應(yīng)答報(bào)文
0x0000: 4500 00be 0016 4000 4011 b1e5 xxxx xxxx E.....@.@......q
0x0010: xxxx xxxx 0035 92b8 00aa 33e1 0491 8180 ...r.5....3.....
0x0020: 0001 0003 0004 0000 0377 7777 0562 6169 .........www.bai
0x0030: 6475 0363 6f6d 0000 0100 01c0 0c00 0500 du.com..........
0x0040: 0100 0004 b000 0f03 7777 7701 6106 7368 ........www.a.sh
0x0050: 6966 656e c016 c02b 0001 0001 0000 0258 ifen...+.......X
0x0060: 0004 790e 584c c02b 0001 0001 0000 0258 ..y.XL.+.......X
0x0070: 0004 790e 590a c02f 0002 0001 0001 518b ..y.Y../......Q.
0x0080: 0006 036e 7335 c02f c02f 0002 0001 0001 ...ns5././......
0x0090: 518b 0006 036e 7336 c02f c02f 0002 0001 Q....ns6././....
0x00a0: 0001 518b 0006 036e 7331 c02f c02f 0002 ..Q....ns1././..
0x00b0: 0001 0001 518b 0006 036e 7333 c02f ....Q....ns3./
注意8180,也就是二進(jìn)制的 1 0000 0 0 1 1 000 0000 ,說明是應(yīng)答,置了RD和RA位
黃色背景為壓縮編碼,比如c016就代表第22個(gè)字節(jié),也就是com。