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

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

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

 

  截圖的第一部分是返回信息的統計,代表這個返回的包數據包含一個問題,5個權威應答,5個附加信息。第二部分是問題的內容,第三部分是權威應答的內容,第四部分是附加信息的內容。再往下面就是接收到的原始數據的展現,這裏須要說起的一點就是爲了減少報文,域名系統使用一種壓縮方法來消除報文中域名的重複。使用這種方法,後面重複出現的域名或者labels被替換爲指向以前出現位置的指針。        spa

  指針佔用2個字節,格式以下:      翻譯

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5    3d

+--+--+--+--+--+--+--+--+--+--+--+--+--    指針

| 1 1|                OFFSET                   |    blog

+--+--+--+--+--+--+--+--+--+--+--+--+--        dns

  前兩個比特位都爲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。後面的相似,就很少說了。

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

相關文章
相關標籤/搜索