DNS協議 : RFC1035 中文

RFC1035 中文

一、域名和資源記錄的定義

1、Name space definitions

2、資源記錄定義(RR definitions)
2.1 格式
後面分析報文的時候詳細解釋。
2.2 類型值(TYPE values)
類型主要用在資源記錄中,注意下面的值是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

2.3 查詢類型(QTYPE values)
查詢類型出現在問題字段中,查詢類型是類型的一個超集,所有的類型都是可用的查詢類型,其他查詢類型如下:

  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)
查詢類是類的一個超集
* 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

二、報文

1、報文格式(Format)
dns請求和應答都是用相同的報文格式,分成5個段(有的報文段在不同的情況下可能爲空),如下:

    +---------------------+
    |        Header       | 報文頭
    +---------------------+
    |       Question      | 查詢的問題
    +---------------------+
    |        Answer       | 應答
    +---------------------+
    |      Authority      | 授權應答
    +---------------------+
    |      Additional     | 附加信息
    +---------------------+

Header段是必須存在的,它定義了報文是請求還是應答,也定義了其他段是否需要存在,以及是標準查詢還是其他。
Question段描述了查詢的問題,包括查詢類型(QTYPE),查詢類(QCLASS),以及查詢的域名(QNAME)。剩下的3個段包含相同的格 式:一系列可能爲空的資源記錄(RRs)。Answer段包含回答問題的RRs;授權段包含授權域名服務器的RRs;附加段包含和請求相關的,但是不是必 須回答的RRs。

1.1 Header的格式
報文頭包含如下字段:

                                    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      請求客戶端設置的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位整數表示報文附加段中的附加記錄數。
1.2 Question的格式
    在大多數查詢中,Question段包含着問題(question),比如,指定問什麼。這個段包含QDCOUNT(usually 1)個問題,每個問題爲下面的格式:
                                    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序列,每個labels包含一個字節表示後續字符串長度,以及這個字符串,以0長度和空字符串來表示域名結束。注意這個字段可能爲奇數字節,不需要進行邊界填充對齊。
    QTYPE   2個字節表示查詢類型,.取值可以爲任何可用的類型值,以及通配碼來表示所有的資源記錄。
    QCLASS 2個字節表示查詢的協議類,比如,IN代表Internet。
1.3 資源記錄格式(Resource record)
    應答,授權,附加段都共用相同的格式:多個資源記錄,資源記錄的個數由報文頭段中對應的幾個數值確定,每個資源記錄格式如下:
                                    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個字節表示資源記錄的類型,指出RDATA數據的含義
    CLASS   2個字節表示RDATA的類
    TTL     4字節無符號整數表示資源記錄可以緩存的時間。0代表只能被傳輸,但是不能被緩存。
    RDLENGTH        2個字節無符號整數表示RDATA的長度
    RDATA   不定長字符串來表示記錄,格式根TYPE和CLASS有關。比如,TYPE是A,CLASS 是 IN,那麼RDATA就是一個4個字節的ARPA網絡地址。
1.4 報文壓縮
    爲了減小報文,域名系統使用一種壓縮方法來消除報文中域名的重複。使用這種方法,後面重複出現的域名或者labels被替換爲指向之前出現位置的指針。
    指針佔用2個字節,格式如下:
      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。

2、傳輸(Transport)
DNS假設報文以數據報,或者從虛鏈路上以字節流進行傳輸。虛鏈路可以用來任何的DNS的傳輸,數據報可以減少代價提高傳輸性能。區域刷新必須使用虛鏈路,因爲需要一個可靠的傳輸。
因特網中DNS支持端口53的TCP[RFC-793]和端口53的UDP [RFC-768]傳輸。
2.1 使用UDP
消息通過UDP的53端口進行傳輸。
UDP傳輸的消息嚴格要求限制在512字節內(不包括IP和UDP頭)。長報文被截斷,同時置報文頭的TC標誌位。
UDP不能用於區域傳輸,主要用在標準的域名查詢。報文通過UDP可能會丟失,所以重傳機制是需要的,請求和應答可能在網絡中或者服務器處理的時候被重新排序,所以解析客戶端不能依賴請求的發送順序。
UDP的最優重傳策略會因爲網絡的性能,客戶的需要而不同,但是下面是推薦的:
- 客戶端在對一臺固定的服務器重試之前,嘗試一下其他的服務器。
- 如果可能的話,重傳的時間間隔需要建立在統計分析數據的基礎上,太快的重試可能因爲量太大導致服務器響應慢。建議的重試時間爲2-5秒。
2.2 使用TCP
通過TCP發送的報文使用53端口,報文的前面有個字節表示後面報文的長度,長度不包括自己佔用的2個字節,這個長度使得底層收取完整的報文後在交給上層處理。
很多連接管理策略如下:
- 服務器不能阻塞其他傳輸TCP數據的請求。
- 服務器需要支持多連接
- 服務器要等客戶端主動關閉連接,除非所有的數據都已經傳輸完了。
- 如果服務器想關閉沒有通訊的連接來釋放資源,那麼需要等待大約2分鐘的時間。特別是要等SOA和AXFR(刷新操作中)在一個連接上傳輸完。服務器關閉連接的時候可以單方面的關閉,或者直接reset掉連接。

三、實例
1、請求解析www.baidu.com.
在linux下使用tcpdump port 53抓包,同時使用dig進行解析測試,得到結果如下:

    ; (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 請求報文

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:報文ID,也就是十進制的1169
        0100:標誌,置了RD字段,也就是期望遞歸的請求
        0001 0000 0000 0000:分別爲問題數,應答數,授權記錄數,附加記錄數,也就是1個問題
        0377 7777 0562 6169 6475 0363 6f6d 00:也就是www.baidu.com的編碼
        00 0100 01:查詢類型和查詢類都爲1,也就是internet的A記錄查詢

1.2 應答報文

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,也就是二進制的 1 0000 0 0 1 1 000 0000 ,說明是應答,置了RD和RA位
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章