DNS協議(Domain Name System)就是將IPv4地址和IPv6地址一大串鬼都看不懂的數字符號,變成人能看懂的符號。DNS服務於IP地址到域名之間的映射轉換。所謂域名就是網址,比如:
致敬一下大佬的文章,也是它讓我明白了DNS是個什麼東西:《DNS協議詳解及報文格式分析》,網址:https://jocent.me/2017/06/18/dns-protocol-principle.html
DNS協議詳解
1. DNS比較直觀的感受(用wireshark進行抓包)
不扯其他亂七八糟,特別專業的東西,先搞一點比較直觀的東西先。
這裏用wireshark 進行抓包分析,具體怎麼操作可以看這個文章:CSDN博主明風的博客的《利用WireShark進行DNS協議分析》,網址:https://blog.csdn.net/tianxuhong/article/details/53811842
(文章裏面是按ping 命令行,我覺得隨便點個網站實在一點)
我這裏直接貼出抓包結果。
然後雙擊那個灰色的DNS,出來這麼一大堆東西,最下面一行就是DNS具體信息。(Domain Name System,DNS)
2. DNS名稱空間(域名空間)
DNS中使用的所有名稱集合構成了DNS名稱空間(name space)。DNS名稱空間就是域名空間。
當前的DNS名稱空間是一顆域名樹,位於頂部的樹根未命名。樹的最高層是所謂的頂級域名.(TLD),包括通用項級域名(gTLD)、國家代碼項級域名(ccTLD)、國際化國家代碼項級域名(IDNccTLD),以及由於歷史原因而存在的一類特殊的稱爲ARPA的基礎設施項級域名(infrastructure TLD)。頂級域名又叫一級域名,在其之後是二級域名。
gTLD分爲幾類:通用、通用限制和贊助。通用gTLD是開放的,可無限制地使用。其他的(通用限制和贊助)受限於各種使用類型以及其他實體可以從域名中分配名稱。
2.1 域名命名規則
國際域名註冊規則
1、只提供英文字母(a-z,不區分大小寫)、數字(0-9)、以及”-“(英文中的連詞號,即中橫線),不能使用空格及特殊字符(如!、$、&、? 等)
2、”-“不能用作開頭和結尾
3、域名最長可達67個字節(包括後綴.com、.net、.org等)
國際域名和國內域名區別
國際域名是用戶可註冊的通用頂級域名的俗稱。它的後綴爲.com、.net或.org。國內域名爲後綴爲.cn的域名。二者註冊機構不同,在使用中基本沒有區別。
總而言之,上面這是人爲規定的,與程序什麼的無關,而且現在IE瀏覽器會自動將大寫轉換爲小寫。
2.2 域名結構(一級域名、二級域名)
域名就是網站的網址, 以b站網址爲例:https://www.bilibili.com/
在寫法上,其實也就是多了個點的區別,一級域名與二級域名的關係類比起來就是+++省+++市,三級就是+++鎮。但是具體含義而言,是不一樣的。
2.3 域名服務器
負責管理部分有效DNS名稱空間(一個或多個域)的個人應該至少安置兩臺域名服務器(name server)或是DNS服務器(DNS server)來存儲名稱空間的相關信息,以便於互聯網用戶查詢名稱。在DNS服務器的語言中,管理授權的單位稱爲區域(zone)。
一個區域是DNS名稱空間的一棵子樹,它可以獨立管理而不受其他區域影響。每一個域名都存在於某個區域中,即使是TLD,它也存在於根區域(rootzone)中。每當一個新記錄添加到區域中時,該區域的DNS管理員爲該新條目分配一個名稱和附加信息(通常是IP地址),並且將這些信息保存到名稱服務器的數據庫中。 一臺DNS服務器可以包含多個區域的信息。在一個域名的任何層次變化點上(即句點出現的地方),不同的區域和包含的服務器可能被訪問以提供該名稱的信息。這稱爲授權(delegation)。
該圖片來自https://jocent.me/2017/06/18/dns-protocol-principle.html
根域名服務器: 最高層次的域名服務器,也是最重要的域名服務器,本地域名服務器如果解析不了域名就會向根域名服務器求助。全球共有13個不同IP地址的根域名服務器,它們的名稱用一個英文字母命名,從a一直到m。這些服務器由各種組織控制,並由 ICANN(互聯網名稱和數字地址分配公司)授權,由於每分鐘都要解析的名稱數量多得令人難以置信,所以實際上每個根服務器都有鏡像服務器,每個根服務器與它的鏡像服務器共享同一個 IP 地址,中國大陸地區內只有6組根服務器鏡像(F,I(3臺),J,L)。當你對某個根服務器發出請求時,請求會被路由到該根服務器離你最近的鏡像服務器。所有的根域名服務器都知道所有的頂級域名服務器的域名和地址,如果向根服務器發出對“jocent.me” 的請求,則根服務器是不能在它的記錄文件中找到與 “jocent.me” 匹配的記錄。但是它會找到 “me”的頂級域名記錄,並把負責 “me” 地址的頂級域名服務器的地址發回給請求者。
頂級域名服務器:負責管理在該頂級域名服務器下注冊的二級域名。當根域名服務器告訴查詢者頂級域名服務器地址時,查詢者緊接着就會到頂級域名服務器進行查詢。比如還是查詢"jocent.me",根域名服務器已經告訴了查詢者“me”頂級域名服務器的地址,“me”頂級域名服務器會找到“jocent.me”的域名服務器的記錄,域名服務器檢查其區域文件,並發現它有與 “jocent.me”相關聯的區域文件。在此文件的內部,有該主機的記錄。此記錄說明此主機所在的 IP 地址,並向請求者返回最終答案。
權限域名服務器:負責一個區的域名解析工作。
本地域名服務器:當一個主機發出DNS查詢請求的時候,這個查詢請求首先就是發給本地域名服務器的。
3. 遞歸查詢以及迭代查詢
DNS客戶端扮演提問者的角色,當客戶機需要訪問Internet上某一主機時,DNS客戶端首先向本地DNS服務器查詢對方IP地址,如果在本地DNS服務器無法查詢出,本地DNS服務器會繼續向另外一臺DNS服務器查詢,知道得出結果,這一過程就稱爲“查詢”。查詢方式有兩種:遞歸查詢以及迭代查詢。
- 主機向本地域名服務器的查詢一般都是採用遞歸查詢:在該模式下DNS服務器接收到客戶機請求,必須使用一個準確的查詢結果回覆客戶機。如果DNS服務器本地沒有存儲查詢DNS信息,那麼該服務器會詢問其他服務器,並將返回的查詢結果提交給客戶機。
- 本地域名服務器向根域名服務器的查詢的迭代查詢:DNS服務器另外一種查詢方式爲迭代查詢,DNS服務器會向客戶機提供其他能夠解析查詢請求的DNS 服務器地址,當客戶機發送查詢請求時,DNS服務器並不直接回複查詢結果,而是告訴客戶機另一臺DNS 服務器地址,客戶機再向這臺DNS 服務器提交請求,依次循環直到返回查詢的結果。
4. 緩存(保留DNS協議的信息用來回答下一個查詢請求)
大部分的名稱服務器(除了一些根服務器和TLD服務器)也緩存(cache)它們學習的區域信息,直到稱爲生存時間(TTL)的時間限制爲止。使用緩存的信息來應答查詢請求。這樣做可以大大減少DNS消息的流量,否則這些信息將會在互聯網上傳輸。當應答查詢時,服務器指明它返回的信息是來自於它的緩存還是來自於區域的授權副本。當返回緩存的信息時,服務器通常也會包含名稱服務器的域名信息,通過聯繫該名稱服務器就可以檢索對應區域的授權信息。
這個圖是個什麼鬼下文會有詳細的解釋。每個DNS記錄都有自己的TTL以及控制其緩存的時間。這些值在必要時候由區域管理員設置和更改。
緩存同時適用於成功的解析和不成功的解析( 稱爲否定緩存(negative caching) )。如果一個特定域名的請求無法返回一個記錄,該事實也會被緩存。當出錯的應用程序一再請求不存在的域名時,這樣做就可以幫助降低互聯網流量。否定緩存在中由可選的變爲強制的。
5. DNS協議
DNS協議主要由兩個主要部分組成:用於執行對DNS特定名稱查詢的查詢/響應協議和名稱服務器用於交換數據庫記錄的協議(區域傳輸)。它有辦法通知輔助服務器區域數據庫已演變,需要進行區域傳輸(DNS通知),也有方法動態更新區域(動態更新)。
5.1 DNS消息格式
基本的DNS消息以12字節頭部開始,其後跟隨4個可變長度的區域(section):問題(或查詢)、回答、授權記錄和額外記錄。除了第一個區域,其他都包含一個或多個資源記錄(Resource Record,RR),下面會具體討論。RR可以被緩存,而問題則不可以。
標誌意思都比較清晰,下面貼出RCODE。
5.2 DNS擴展格式(EDNS0)
DNS 的擴展機制允許 DNS 請求者公佈其 UDP 數據包的大小,並且更便於傳輸大於 512 字節(對於 UDP 數據包大小的原始 DNS 限制)的數據包。DNS 服務器通過 UDP 傳輸層接收請求時,它對來自 OPT 資源記錄 (RR) 的請求者的 UDP 數據包大小進行標識,測量其響應,以包含請求者指定的最大 UDP 數據包大小中允許的多個資源記錄。
這個東西不知道是比較少見還是太過於專業怎麼樣,我找了半天也沒有具體說明,TCP/IP協議書上也是幾筆帶過,等我學到了DNS安全部分再做更新。
現在也可以看這篇文章做了解:博客園CobbLiu的《EDNS》,網址https://www.cnblogs.com/cobbliu/p/3188632.html
5.3 UDP或TCP
對於TCP和UDP來說, DNS的知名端口號都是53。
5.4 問題(查詢)和區域區段格式
查詢類:對於Internet信息,總是IN。
5.4.1 用wireshark抓包,直觀的感受查詢報文
對着上面看一下,一眼就搞明白了。
Type查詢類型,class查詢類,length長度。
5.5 回答、授權和額外信息區段格式
5.5.1 用wireshark抓包,直觀的感受回答報文
5.6 資源記錄類型(主要用於緩存那一塊)
雖然DNS常用來確定一個特定的名稱對應的IP地址,但是它也可以用於相反的目的和一些其他的事情。它可用於IPv4和IPv6,甚至可以爲非互聯網數據(在DNS術語中爲其他類)提供分佈式數據庫功能。由DNS提供的廣泛功能主要是由於它能夠擁有不同類型的資源記錄。資源記錄有很多類塑(完整列表見[DNSPARAMS]),並且一個單一的名稱可能有多個匹配的RR表。
5.7 動態更新(DNS UPDATE)
動態更新允許應用程序使用在線協議修改區域的內容。
在DNS服務器的語言中,管理授權的單位稱爲區域(zone)。一個區域是DNS名稱空間的一棵子樹,它可以獨立管理而不受其他區域影響。請求。先決條件在服務器中評估;如果它們不爲真,更新不執行,並返回一個錯誤消息。
通過向一個區域的授權DNS服務器發送動態更新的DNS消息, DNS UPDATE就可以完成。此類消息的結構和傳統的DNS信息是一樣的,只不過頭部字段和區段有不同的名稱(見那個DNS消息格式那個圖)。區段說明了正在更新的區域、需要不同的RR存在(或不存在)以便讓更新發揮作用的先決條件,以及更新信息(update information)。在一次更新中,頭部反映了查詢的格式,而操作碼字段被設置爲Update ( 5 )。
頭部字段ZOCOUNT、 PRCOUNT、 UPCOUNT和ADCOUNT包含以下計數:要被更新的區域(值將爲1 ),要考慮的先決條件,要做出的更新和額外的信息記錄。也定義了DNS響應消息中攜帶的RCODE值的集合,該消息能夠說明與先決條件或服務器的問題相關的情況。
更新消息的區域區段說明了該區域的名稱、類型和類。類型值是6,表明SOA記錄的存在,用於識別該區域。類值是1 (互聯網),表明我們關心的任意更新消息。正被更新的所有記錄必須在相同的區域中。
更新消息的先決條件區段包含一個或多個先決條件,它使用我們先前討論的RR的格式來描述。有五種類型的先決條件。RRSet存在(依賴於值的和不依賴於值的種類),RRSet不存在,名稱在使用,名稱沒有使用。
5.8 區域傳輸
區域傳輸(完整或增量)用於允許冗餘的從服務器與主服務器同步區域的內容,主要是爲了冗餘。
區域傳輸用於從一個服務器到另一個服務器複製一個區域的一組RR (通常是從主服務器向從服務器)。這樣做的目的是保持多臺服務器的區域內容同步。如果一臺服務器失效了,多臺服務器可以爲失敗提供恢復能力。由於多臺服務器能夠共享傳人查詢的處理負載,性能也可以改進。最後,如果服務器放置於離客戶端近的地方, DNS查詢/響應的延遲可能降低(即解析器和服務器之間的網絡延遲是很小的)。
6. 總結
DNS是互聯網的一個重要組成部分, DNS技術也被廣泛應用於私有網絡中。 DNS名稱空間是全世界範圍的,並且劃分成以頂級域名開始的層次結構。域名可以使用國際化域名(IDN)以多種語言和文字表示。應用程序使用解析器來聯繫一個或多個DNS服務器,執行對區域數據庫的查找任務,如轉換主機名稱到一個IP地址,反之亦然。解析器然後聯繫一個本地域名服務器,該服務器可能遞歸地聯繫一個根服務器或滿足該請求的其他服務器。大多數DNS服務器和一些解析器緩存知道的信息,在一段稱爲生存時間(TTL)的間隔內,將其提供給隨後的客戶端。查詢和響應使用一個特殊的DNS協議,它與TCP或UDP一起工作。
7. 參考資料
- CSDN博主沐雨聽濤的《國內常用dns服務器》,網址:https://blog.csdn.net/kevin3101/article/details/80568578?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-8&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-8
- CSDN博主明風的博客的《利用WireShark進行DNS協議分析》,網址:https://blog.csdn.net/tianxuhong/article/details/53811842
- CSDN博主一路陽光隨行的《DNS遞歸查詢和迭代查詢的區別》,網址:https://blog.csdn.net/wuchuanpingstone/article/details/6720723
- 博客園CobbLiu的《EDNS》,網址https://www.cnblogs.com/cobbliu/p/3188632.html
- 騰訊雲《域名命名規則及交易平臺》,網址:https://cloud.tencent.com/developer/article/1392144
- 《DNS協議詳解及報文格式分析》,網址:https://jocent.me/2017/06/18/dns-protocol-principle.html
- 360新知《dns應該怎麼設置》,網址:http://xinzhi.wenda.so.com/a/1536755770209444
- 知乎用戶Arno Fan對問題頂級域名 一級域名 二級域名 三級域名什麼區別?的回答《域名級別說明》,網址:https://www.zhihu.com/question/29998374/answer/121041060
- TCP/IP協議詳解:卷一:協議(原書第二版) P362-PP411,P636-P654
- 我自己的博客《IPv4和IPv6的數據報結構頭部詳解》,網址:https://blog.csdn.net/qq_45877524/article/details/105003498