golang實現dns域名解析(三):響應報文分析


前面說了構造請求發送報文,接下來我們好好研究下如何解析服務器端發回來的應答信息。

首先還是用前面的程序代碼發一個請求,用抓包工具看看應答的內容有哪些:

 

  截圖的第一部分是返回信息的統計,表明這個返回的包數據包含一個問題,5個權威應答,5個附加信息。第二部分是問題的內容,第三部分是權威應答的內容,第四部分是附加信息的內容。再往下面就是接收到的原始數據的展示,這里需要提及的一點就是為了減小報文,域名系統使用一種壓縮方法來消除報文中域名的重復。使用這種方法,后面重復出現的域名或者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序列        

  不理解的往下面看,我選中的這部分是權威記錄中的一條信息,對應的是下面的選中部分:

 

  前兩個字節’c0 0c’就是之前出現baidu.com位置的指針,’00 02’表明返回的類型是NS’00 01’表明是Internet協議,’00 03 a3 00’TTL,’00 06’是后面跟着的內容的長度,告訴你后面的6個字節是返回給你的ns信息,你往后讀6個字節第一條返回的權威記錄就結束了,看看后面6個字節都是什么:’03 64 6e 73 c0 c0’這個的意思翻譯過來就是:3dns+一個指針(指向的內容是baidu.com),所以我們就可以解析出baidu.com的一條ns記錄是dns.baidu.com。后面的類似,就不多說了。

原理性的東西分析透徹了,下一節再來聊聊怎樣用代碼去實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM