前面說了構造請求發送報文,接下來我們好好研究下如何解析服務器端發回來的應答信息。
首先還是用前面的程序代碼發一個請求,用抓包工具看看應答的內容有哪些:
截圖的第一部分是返回信息的統計,表明這個返回的包數據包含一個問題,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。后面的類似,就不多說了。
原理性的東西分析透徹了,下一節再來聊聊怎樣用代碼去實現。