優質資料:
https://www.ruanyifeng.com/blog/2016/06/dns.html dig命令
https://www.cnblogs.com/yingsong/p/4429637.html DNS與NS、NS記錄
https://imlonghao.com/41.html DNSSEC
1、URL構成和域名體系
URL構成
URL:(Uniform Resource Locator)統一資源定位符。一條符合規范的URL對應的是服務器的一個特定的資源(如HTML頁面,一張圖片等)。
結構如下:
scheme://hostname[:port]/path/[;parameters][?query]#fragment
scheme:通信協議,常用的有http、https、ftp、mailto等。
hostname:主機域名或IP地址。
port:端口號,可選。省略時使用協議的默認端口,如http默認端口為80。
path:路徑由零或多個"/"符號隔開的字符串組成,一般用來表示主機上的一個目錄或文件地址。
query:查詢,可選。用於傳遞參數,可有多個參數,用"&"符號隔開,每個參數的名和值用"="符號隔開。
fragment:信息片斷字符串,也稱為錨點。用於指定網絡資源中的片斷。
比如:
https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9230366566950910677%22%7D&n_type=0&p_from=1
其中mbd.baidu.com為主機域名。
域名體系
域名(Domain Name)通常是用戶所在的主機名。域名格式是由若干部分組成,每個部分又稱子域名,它們之間用“.”分開,每個部分最少由兩個字母或數字組成。城名通常按分層結構來構造,每個子域名都有其特定的含義。從右到左,子域名分別表示不同的國家或地區的名稱(只有美國可以省略表示國家的頂級域名)、組織類型、組織名稱、分組織名稱和計算機名稱等。
2、DNS服務器體系
域名服務器實際上就是裝有域名系統的主機。由高向低進行層次划分,可分為以下幾大類:
- 根域名服務器:最高層次的域名服務器,也是最重要的域名服務器,本地域名服務器如果解析不了域名就會向根域名服務器求助。全球共有13個不同IP地址的根域名服務器,它們的名稱用一個英文字母命名,從a一直到m。這些服務器由各種組織控制,並由 ICANN(互聯網名稱和數字地址分配公司)授權,每個根服務器都有鏡像服務器,每個根服務器與它的鏡像服務器共享同一個 IP 地址,中國大陸地區內只有6組根服務器鏡像(F,I(3台),J,L)。當你對某個根服務器發出請求時,請求會被路由到該根服務器離你最近的鏡像服務器。所有的根域名服務器都知道所有的頂級域名服務器的域名和地址,如果向根服務器發出對
“jocent.me”
的請求,則根服務器是不能在它的記錄文件中找到與“jocent.me”
匹配的記錄。但是它會找到“me”
的頂級域名記錄,並把負責“me”
地址的頂級域名服務器的地址發回給請求者。- 為什么根域名服務器只能有13個?
通過UDP協議傳輸的DNS消息最大長度需要限制在512字節(不包括IP頭部、UDP頭部),超出部分要被截斷。有了最大長度限制后,一個UDP協議傳輸的DNS響應能夠返回的資源記錄數量就是有限的。512字節的限制是在RFC 1035中規定的,為了更好的性能我們需要將響應限制在一個響應報文中完成,也就是只有512字節可以用了。當我們查詢根域的NS記錄時,512字節只夠返回包含13個由A-M命名的根域名服務器的NS記錄和A記錄的響應。NS記錄在回答區段中,A記錄在額外信息區段中,A記錄用於幫助你接下來向根域名服務器進一步查詢。
- 為什么根域名服務器只能有13個?
- 頂級域名服務器:負責管理在該頂級域名服務器下注冊的二級域名。當根域名服務器告訴查詢者頂級域名服務器地址時,查詢者緊接着就會到頂級域名服務器進行查詢。比如還是查詢
"jocent.me"
,根域名服務器已經告訴了查詢者“me”
頂級域名服務器的地址,“me”
頂級域名服務器會找到“jocent.me”
的域名服務器的記錄,域名服務器檢查其區域文件,並發現它有與“jocent.me”
相關聯的區域文件。在此文件的內部,有該主機的記錄。此記錄說明此主機所在的 IP 地址,並向請求者返回最終答案。 - 權限域名服務器:負責一個區的域名解析工作
- 本地域名服務器:當一個主機發出DNS查詢請求的時候,這個查詢請求首先就是發給本地域名服務器的。
3、域名解析過程
域名解析總體可分為兩大步驟,第一個步驟是本機向本地域名服務器發出一個DNS請求報文,報文里攜帶需要查詢的域名;第二個步驟是本地域名服務器向本機回應一個DNS響應報文,里面包含域名對應的IP地址。
其具體的流程可描述如下:
1.現在我有一台計算機,通過ISP接入了互聯網,那么ISP就會給我分配一個DNS服務器,這個DNS服務器不是權威服務器,而是相當於一個代理的dns解析服務器,他會幫你迭代權威服務器返回的應答,然后把最終查到IP返回給你。
2.現在的我計算機要向這台ISPDNS發起請求查詢www.baidu.com這個域名了,(經網友提醒:這里其實准確來說不是ISPDNS,而應該是用戶自己電腦網絡設置里的DNS,並不一定是ISPDNS。比如也有可能你手工設置了8.8.8.8)
3.ISPDNS拿到請求后,先檢查一下自己的緩存中有沒有這個地址,有的話就直接返回。這個時候拿到的ip地址,會被標記為非權威服務器的應答。
4.如果緩存中沒有的話,ISPDNS會從配置文件里面讀取13個根域名服務器的地址(這些地址是不變的,直接在BIND的配置文件中),
5.然后像其中一台發起請求。
6.根服務器拿到這個請求后,知道他是com.這個頂級域名下的,所以就會返回com域中的NS記錄,一般來說是13台主機名和IP。
7.然后ISPDNS向其中一台再次發起請求,com域的服務器發現你這請求是baidu.com這個域的,我一查發現了這個域的NS,那我就返回給你,你再去查。
(目前百度有4台baidu.com的頂級域名服務器)。
8.ISPDNS不厭其煩的再次向baidu.com這個域的權威服務器發起請求,baidu.com收到之后,查了下有www的這台主機,就把這個IP返回給你了,
9.然后ISPDNS拿到了之后,將其返回給了客戶端,並且把這個保存在高速緩存中。
其中有兩個概念遞歸查詢和迭代查詢,其實在整個描述的過程中已經體現的很明顯,這里再說明一下:
- 遞歸查詢:本機向本地域名服務器發出一次查詢請求,就靜待最終的結果。如果本地域名服務器無法解析,自己會以DNS客戶機的身份向其它域名服務器查詢,直到得到最終的IP地址告訴本機
- 迭代查詢:本地域名服務器向根域名服務器查詢,根域名服務器告訴它下一步到哪里去查詢,然后它再去查,每次它都是以客戶機的身份去各個服務器查詢
DNS 的三種查詢方式:
參考:https://juejin.im/post/6844903900982558734
-
遞歸查詢 (Recursive query)
遞歸查詢是這么一種查詢方式,一般發生在 Client 請求 DNS Server。Client 發出一個域名解析的請求,DNS Server 必須返回對應的 IP 地址,或者返回找不到的錯誤。
-
迭代查詢 (Iterative query)
迭代查詢一般發生在 DNS Server 之間,當 Client 發出域名解析的請求后,DNS Server 需要給予最佳答案,這個最佳答案可能是"距離最近"的頂級域名服務器,也能是權威域名服務器。無論如何,Client 需要對返回結果再次發起請求,知道獲得最終結果。
-
非遞歸查詢 (Non-recursive query)
非遞歸查詢發生在 Client 和 DNS Server 之間,指的是,請求的 DNS Server 已經知道答案,直接返回。這里可能有兩種情況,一種是 DNS Server 本機緩存了對應的 IP,或者是緩存了對應的域名的權威服務器。第二種情況只需要再發一次請求,即可拿到結果返回。
【TODO:DNS緩存機制】
4、DNS報文結構
參考:http://c.biancheng.net/view/6457.html
DNS報文分為查詢請求報文和查詢相應報文,兩類報文結構基本相同,結構如下:
報文每行為4個字節,其中前12個字節節(前三行)為基礎部分,后四行為可變長度的區段,包括問題部分(即查詢問題區域,存在於查詢請求報文)和響應資源記錄(后三行,存在於響應報文中)。
基礎部分
該部分中每個字段含義如下。
- 事務 ID:DNS 報文的 ID 標識。對於請求報文和其對應的應答報文,該字段的值是相同的。通過它可以區分 DNS 應答報文是對哪個請求進行響應的。
- 標志:DNS 報文中的標志字段。
- QR(Query/Response Flag) 是 1 bit 字段:0 表示查詢報文,1 表示響應報文。
- opcode 是一個 4 bit 字段:通常值為 0(標准查詢),其他值為 1(反向查詢)和 2(服務器狀態請求)。
- AA 是 1 bit 標志,表示 “授權回答(Authoritative Answer)” 。該名字服務器是授權於該域的。
- TC 是 1 bit字段,表示 “可截斷的(Truncated)”。使用 UDP 時,它表示當應答的總長度超過 512 字節時,只返回前 512 個字節。
- RD 是 1 bit字段 表示 “期望遞歸(Recursion Desired)”。 該比特能在一個查詢中設置,並在響應中返回。 這個標志告訴名字服務器必須處理這個查詢,也稱為一個遞歸查詢。 如果該位為 0,且被請求的名字服務器沒有一個授權回答,它就返回一個能解答該查詢的其他名字服務器列表,這稱為迭代查詢。
- RA 是 1 bit 字段,表示 “可用遞歸(Recursion Available)”。 如果名字服務器支持遞歸查詢,則在響應中將該比特設置為 1。 在后面的例子中可看到大多數名字服務器都提供遞歸查詢,除了某些根服務器。
- 隨后的 3 bit 字段必須為 0。
- rcode(Response Code) 是一個 4 bit 的返回碼字段。通常的值為 0(沒有差錯)和 3(名字差錯)。 名字差錯只能從一個授權名字服務器上返回,它表示在查詢中指定的域名不存在。
- 計數/記錄數:隨后的 4 個 16 bit 字段說明最后 4 個變長字段中包含的條目數。對於查詢報文,問題(question)數通常是 1,而其他 3 項則均為 0。類似地,對於應答報文,回答數至少是 1,剩下的兩項可以是 0 或非 0
問題部分
問題部分的格式如下,該部分是用來顯示 DNS 查詢請求的問題,通常只有一個問題。該部分包含正在進行的查詢信息,包含查詢名(被查詢主機名字)、查詢類型、查詢類。
- 查詢名(QName)是要查找的名字,它是一個或多個標識符的序列。每個標識符以首字節的計數值來說明隨后標識符的字節長度, 每個名字以最后字節為 0 結束,長度為 0 的標識符是根標識符。 計數字節的值必須是 0 ~ 63 的數,因為標識符的最大長度僅為 63 (在本節的后面我們將看到計數字節的最高兩比特為 1,即值 192 ~ 255,將用於壓縮格式)。 不像我們已經看到的許多其他報文格式,該字段無需以整 32 bit 邊界結束,即無需填充字節。圖 14-6 顯示了如何存儲域名 gemini.tuc.noao.edu。
- 每個問題有一個查詢類型(QType),而每個響應(也稱一個資源記錄,我們下面將談到)也有一個類型。 大約有 20 個不同的類型值,其中的一些目前已經過時。 圖 14-7 顯示了其中的一些值。 查詢類型是類型的一個超集( superset ):圖中顯示的類型值中只有兩個能用於查詢類型。最常用的查詢類型是 A 類型,表示期望獲得查詢名的 IP 地址。域名服務器是能提供域名解析的服務器,上面的記錄類型可以是A(address)記錄,NS記錄(name server),MX(mail),CNAME等。
- 查詢類(QClass)通常是 1,指互聯網地址(某些站點也支持其他非 IP 地址)。
響應資源記錄
資源記錄部分是指 DNS 報文格式中的最后三個字段,包括回答問題區域字段、權威名稱服務器區域字段、附加信息區域字段。這三個字段均采用一種稱為資源記錄的格式,格式如圖所示。

資源記錄格式中每個字段含義如下:
- 域名:DNS 請求的域名。
- 類型:資源記錄的類型,與問題部分中的查詢類型值是一樣的。
- 類:地址類型,與問題部分中的查詢類值是一樣的。
- 生存時間:以秒為單位,表示資源記錄的生命周期,一般用於當地址解析程序取出資源記錄后決定保存及使用緩存數據的時間。它同時也可以表明該資源記錄的穩定程度,穩定的信息會被分配一個很大的值。
- 資源數據長度:資源數據的長度。
- 資源數據:表示按查詢段要求返回的相關資源記錄的數據。
資源記錄部分只有在 DNS 響應包中才會出現。
5、Wireshark抓包分析
請求報
響應報文
如果收到的域名是本地dns緩存中的數據,則授權部分和附加部分為空。