DNS協議分析

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

一直有一個願望,能把知道的東西的原理搞明白:電腦網路、作業系統等等等等。今天好好研究了研究DNS協議。

DNS協議是應用程式層協議,一般是基於UDP協議,不過我看了Golangnet 包裡相關源碼用的是TCP協議傳輸。連接埠是53,這次寫代碼實現了一邊DNS用戶端,估計短時間內忘不了這個連接埠號碼了。

瞭解DNS這個協議,從書本上我基本沒看懂過,書裡我基本就記著DNS是遞迴查詢的,如果查詢服務器上沒有找到相應的記錄,則遞迴得去查詢上一級伺服器。還有就是根網域名稱伺服器在美國這些,反正我就是從來沒搞懂過。

昨天在網上找到一篇文章[2],上面提到說學習協議還是藉助WireShark比較好,Linux之下就是通過tcpdump和WireShark結合進行抓取資料包。具體的方法可以參考我之前的文章。而類比DNS請求,Linux下是host www.cyeam.com,Windows下是nslookup www.cyeam.com

10.00000010.0.1.2310.0.1.1DNS73Standard query 0x11ac  A www.cyeam.com20.06171410.0.1.110.0.1.23DNS123Standard query response 0x11ac  CNAME vm68h.x.incapdns.net A 149.126.77.152

我的電腦IP是10.0.1.23,路由器IP是10.0.1.1,查詢網站www.cyeam.com的DNS記錄。

抓到的請求內容如下:

Domain Name System (query)    [Response In: 2]    Transaction ID: 0x11ac    Flags: 0x0100 Standard query0... .... .... .... = Response: Message is a query.000 0... .... .... = Opcode: Standard query (0).... ..0. .... .... = Truncated: Message is not truncated.... ...1 .... .... = Recursion desired: Do query recursively.... .... .0.. .... = Z: reserved (0).... .... ...0 .... = Non-authenticated data: Unacceptable    Questions: 1    Answer RRs: 0    Authority RRs: 0    Additional RRs: 0    Querieswww.cyeam.com: type A, class IN    Name: www.cyeam.com    Type: A (Host address)    Class: IN (0x0001)

DNS協議頭是12個位元組,共兩項內容,每個都是兩個位元組。

  • Transaction ID。是用戶端隨機產生的一個不帶正負號的整數,範圍是0~2^16。在回應標頭裡面會返回這個值用於校正。如果值不相等,丟棄響應內容。
  • Flags。具體每個位的含義這裡就不複述了,上面抓到請來看,是標記了遞迴調用這一項。
  • 查詢數Questions。一次DNS請求能查詢多個網域名稱,這裡只查了一個網域名稱,所以是1。
  • Answer是響應數,請求裡面響應數肯定是0。剩下兩個目前沒有用到,還沒有研究具體含義。

協議頭之後,就是訊息體了。在請求裡面,訊息體是請求查詢的內容,而在響應裡面,則是查詢到的內容。訊息體由三方面組成:網域名稱、類別、分類:

  • Name。我們要查詢www.cyeam.com這個網域名稱,分別用.將網域名稱進行了切割,而DNS協議設計的時候,用了一個巧妙的方法,將點去掉,而是在每一部分之前加上這個部分佔的位元。還有,就是在最後補上一個位元組的0,表示Name的結束。那麼網域名稱就會變成3www5cyeam3com0這樣。
  • Type。查詢類型,有A、CNAME等。
  • 查詢分類,好像見到的都是IN。這兩個值都是兩個位元組。

頭是12個位元組,訊息體用了15+2+2=19個位元組,一個是31位元組。下面的表格是16進位計數的,一行是16個,一共也是15個。大家也可以根據協議頭和訊息體的內容計算看看。

0000   11 ac 01 00 00 01 00 00 00 00 00 00 03 77 77 770010   05 63 79 65 61 6d 03 63 6f 6d 00 00 01 00 01

響應的頭如下:

Domain Name System (response)    [Request In: 1]    [Time: 0.061714000 seconds]    Transaction ID: 0x11ac    Flags: 0x8180 Standard query response, No error1... .... .... .... = Response: Message is a response.000 0... .... .... = Opcode: Standard query (0).... .0.. .... .... = Authoritative: Server is not an authority for domain.... ..0. .... .... = Truncated: Message is not truncated.... ...1 .... .... = Recursion desired: Do query recursively.... .... 1... .... = Recursion available: Server can do recursive queries.... .... .0.. .... = Z: reserved (0).... .... ..0. .... = Answer authenticated: Answer/authority portion was not authenticated by the server.... .... ...0 .... = Non-authenticated data: Unacceptable.... .... .... 0000 = Reply code: No error (0)    Questions: 1    Answer RRs: 2    Authority RRs: 0    Additional RRs: 0    Querieswww.cyeam.com: type A, class IN    Name: www.cyeam.com    Type: A (Host address)    Class: IN (0x0001)    Answerswww.cyeam.com: type CNAME, class IN, cname vm68h.x.incapdns.net    Name: www.cyeam.com    Type: CNAME (Canonical name for an alias)    Class: IN (0x0001)    Time to live: 10 seconds    Data length: 22    Primaryname: vm68h.x.incapdns.netvm68h.x.incapdns.net: type A, class IN, addr 149.126.77.152    Name: vm68h.x.incapdns.net    Type: A (Host address)    Class: IN (0x0001)    Time to live: 3 minutes, 47 seconds    Data length: 4    Addr: 149.126.77.152 (149.126.77.152)

協議頭的含義和請求的一致。需要注意的是,Answer變成了2,因為找到了兩條記錄。訊息體內也包含了請求的Queries的內容,含義和請求裡的是一樣的。多出來的就是響應的內容。

查詢的結果由5部分組成:

  • Name,也就是查詢的網域名稱,兩個位元組。
  • Type,記錄類型,第一條是CNAME類型。對應的值是5。兩個位元組。
  • Class,分類,兩個位元組,值是1(IN)。
  • Data length,資料長度。兩個位元組。
  • Primaryname,這是重點,主要就是在查這個東西。如果上面Type是CNAME類型,那麼解析的方式要按照網域名稱的方式解析,編碼方式和上面請求裡發送網域名稱的方式一樣。如果是A,那麼解要按照IP解析,Data length也對應的是4(IPv4)。一個位元組是一個IP裡的塊,然後用點連起來。16進位分別是95、7e、4d、98,那麼換成能看懂的就是149.126.77.152。

    0000 11 ac 81 80 00 01 00 02 00 00 00 00 03 77 77 770010 05 63 79 65 61 6d 03 63 6f 6d 00 00 01 00 01 c00020 0c 00 05 00 01 00 00 00 0a 00 16 05 76 6d 36 380030 68 01 78 08 69 6e 63 61 70 64 6e 73 03 6e 65 740040 00 c0 2b 00 01 00 01 00 00 00 e3 00 04 95 7e 4d0050 98

上面抓到的資料包,可以從這裡訪問到。本來是想寫Golang語言實現的,太晚了,明天再寫。

參考文獻
  1. 《電腦網路(第五版)》謝希仁
  2. What does a DNS request look like? - serverfault

原文連結:DNS協議分析,轉載請註明來源!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.