DNS消息相對簡單:瀏覽器查詢一個域名并獲取一個IP地址。
如果DNS服務器無法識別域名,它會將查詢傳遞給下一個DNS服務器。然后,在收到響應后,將響應傳遞給瀏覽器。
有興趣了解DNS解析工作原理嗎?希望這篇文章可以幫助。
查詢消息
這是查詢消息的結構。
- 事務ID:用于將響應與查詢匹配
- 標志:指定所請求的操作和響應代碼
- 問題數:查詢部分中的條目數
- 答案RR數:答案部分中的條目數(RR代表“資源記錄”)
- 授權RR數:授權部分中的條目數
- 附加RR數:附加部分中的條目數
- 查詢:查詢數據
需要關注的是問題數,答案RR和查詢。
以下是針對image.google.com的查詢消息的示例。
- 問題數:1表示此消息在查詢部分中有一個條目。•
- 答案RR數:0表示沒有答案。這是因為查詢消息只包含問題,沒有答案。
接下來,讓我們深入查詢的條目結構,僅包括3個部分。
- 名稱:域名
- 類型:DNS記錄類型(例如A,CNAME和MX)
- 類:允許域名用于任意對象
通過查看示例,更容易理解結構。
- 名稱是請求的域名image.google.com。
- 類型:A表示它是一個A記錄。A記錄是最基本和最常用的DNS記錄類型。
- 類:IN是“互聯網”的縮寫。在瀏覽器上下文中沒有太大意義。
有趣的部分是消息如何編碼名稱字段。
使用.作為分隔符,示例域名可以分為3個組。
- image
- com
在藍色標記的示例中,第一個字節是05,表示接下來的5個字節是域名的第1組。
在屏幕截圖中,字節以ASCII碼呈現。我們可以輕松將其解碼為字符。
- 69 → i
- 6d → m
- 61 → a
- 67 → g
- 65 → e
我們得到了image。
按照相同的規則,我們可以找到域名的其余部分——google和com。
最后,在域名的末尾,00標志著該部分的結束。
這就是查詢的全部內容。通過查詢提供的所有必要信息,DNS服務器將發送一個響應消息。
響應消息
響應消息與查詢消息共享相同的標題和查詢部分,另外還有一個額外的答案部分。
為什么響應消息包括原始的查詢部分?這是供參考的。我們將很快了解它。
以下是查詢image.google.com的響應示例。
在消息中,我們在答案部分收到3個條目。因此,答案RRs設置為3。
- 在第一個條目中,DNS服務器為初始查詢返回了一個CNAME images.google.com。
- 然后,發送了一個新的查詢以獲取images.google.com,在第二個條目中返回了另一個CNAME images.1.google.com。
- 最后,通過查詢images.1.google.com,客戶端在最后一個條目中收到了IP地址172.217.1.14。
除了查詢條目中找到的相同的3個部分外,答案條目還有3個額外的部分。
- 存活時間(TTL):記錄可以存在的秒數
- 數據長度:數據的長度
- 數據:返回的數據,例如IP地址或CNAME
讓我們來看看名稱部分,它只有兩個字節:c0 0c。
域名如何在兩個字節中編碼?
原來,這些字節是偏移量,指向查詢部分中編碼的域名。
c0是一個開始標記,而0c是實際的偏移量,為12。
我們從消息的開始字節17(在屏幕截圖中以紅色標記)開始數12個字節。最后,我們到達第13個字節05,這是image.google.com的開頭,用黃色標記。
不復雜,對吧?接下來是一個復雜的例子。
在答案的第二個條目中,名稱偏移量為2e,即46個字節。
通過計算46個字節,我們找到了前一個條目的CNAME中編碼的images。
- 06 → 接下來的6個字節屬于同一組
- 69 → i
- 6d → m
- 61 → a
- 67 → g
- 65 → e
- 73 → s
在images的末尾,我們看到另一個偏移量引用c0 12。這是18個字節。
同樣,通過計算18個字節,我們到達了綠色標記的引用部分——在前一個條目的名稱中的google.com。
偏移量的想法是一個令人鼓舞的設計。有了它,消息可以節省大量空間。
最后,我們可以解碼最后一個答案條目中的地址。
- ac → 172
- d9 → 217
- 01 → 1
- 0e → 14
要點
- DNS消息中需要注意的是問題數、答案RR數、查詢和答案。前兩者是計數,而其他兩者是實際數據。
- 通過理解名稱的編碼方式,您可以輕松地讀取消息的字節。