本文詳細介紹了 DNS 相關知識,包括 DNS 工作原理、如何提升域名解析速度、以及 DNS 記錄與報文等內容。
1. 域名與域名服務器?
在日常上網過程中,出于好記的原因,人們更喜歡在瀏覽器中輸入網站的域名?,而不是 IP 地址。比如想要訪問百度,則會輸入 www.baidu.com,而不是 202.108.22.5(或者百度網站的其他 IP)。
然而計算機網絡通信中所識別的標識并不是域名?,而是 IP 地址,因為其可以提供主機在互聯網中的位置信息,而且是定長的,路由器等設備更容易處理。
為了折中人類和計算機不同的偏好,就出現了 DNS(Domain Name System,域名系統),其主要任務是根據域名查出對應的 IP 地址。
下面先介紹一下域名和域名服務器,之后再介紹 DNS 的工作原理。
域名由若干個英文字符串組成(不區分大小寫),各字符串之間用點號『.』分隔連接,其中越靠右的表示域名級別越高。
舉個例子,百度的域名為 www.baidu.com,其中 com 是頂級域名(一級域名),baidu 是二級域名,www 是三級域名。
域名服務器(也稱為 DNS 服務器)負責存儲域名和 IP 地址的映射關系,當我們需要獲取某個域名對應的 IP 地址時,只需要從域名服務器中查詢即可。
由于域名非常非常多,如果都存放在一臺域名服務器中,那么不僅查詢速度慢,服務器壓力大,而且難以保證服務的可靠性。因此,DNS 采用了分布式的設計方案,大量的域名服務器之間通過?層次方式組織,分布在全世界范圍內。
一般而言,域名服務器可以分為以下四類:
- 根域名服務器:最高層級的域名服務器,因特網上一共有 13 個根域名服務器(以英文字母 A 到 M 依序命名,格式為[a~m].root-servers.NET),每個根域名服務器都知道所有頂級域名服務器的 IP 地址,比如知道負責 com 域的頂級域名服務器的 IP 地址。
- 頂級域名服務器:對于每個頂級域名,如 com、org、edu 等,都有對應的頂級域名服務器。頂級域名服務器知道其所管理的所有權威域名服務器的 IP 地址,比如負責 com 域的頂級域名服務器知道負責 baidu.com 域的權威域名服務器的 IP 地址。
- 權威域名服務器:一個網站需要將其域名和 IP 地址注冊到相應的權威域名服務器中,比如網站 www.baidu.com 的域名和 IP 地址就存儲在負責 baidu.com 域的權威域名服務器中。
- 本地域名服務器:本地域名服務器不屬于上述域名服務器的層次結構,但是它對域名系統非常重要。每個 ISP(如一個大學、一個公司)都有一個本地域名服務器(也叫默認域名服務器)。具體在下一節中介紹。
2. 域名解析流程?
知道了域名和域名服務器的基礎知識后,我們來了解一下域名解析的具體流程,以輸入百度域名為例,看看我們的主機是如何得到 www.baidu.com 的 IP 地址的。
- 請求主機向本地域名服務器發送 DNS 查詢報文,詢問 www.baidu.com 的 IP 地址是什么;
- 本地域名服務器轉發此查詢報文到根域名服務器;
- 根域名服務器發現要查詢的頂級域名為 com,于是向本地域名服務器發送響應報文,報文中封裝了負責 com 域的頂級域名服務器的 IP 地址列表;
- 本地域名服務器收到根域名服務器響應的報文后,選擇其中一個頂級域名服務器的 IP 地址,并向其發送查詢報文;
- 頂級域名服務器發現要查詢的二級域名為 baidu,于是向本地域名服務器發送響應報文,報文中封裝了負責baidu.com 域的權威域名服務器的 IP 地址列表;
- 本地域名服務器收到頂級域名服務器響應的報文后,選擇其中一個權威域名服務器的 IP 地址,并向其發送查詢報文;
- 權威域名服務器通過查詢數據庫,找到 www.baidau.com 的 IP 地址,并將此信息封裝為一個響應報文,發送給本地域名服務器;
- 本地域名服務器將響應報文發送給原請求主機。我們的主機就知道了百度的 IP 地址,DNS 查詢過程結束。
在此過程中,請求主機與本地域名服務器之間的交互稱為遞歸查詢?,而本地域名服務器與域名服務器層次結構中相關服務器的交互稱為迭代查詢。
請求主機是如何知道本地域名服務器的 IP 地址的?
當用戶插上網線或者連上 wifi 后,電腦會通過 DHCP 協議分配一個 IP 地址,與此同時,也會獲取到本地域名服務器的 IP 地址!
本地域名服務器是如何知道根域名服務器的 IP 地址的?
因特網上一共有 13 個根域名服務器,它們的 IP 地址是固定不變的,因此被集成在了操作系統中,每臺電腦都知道!
為了解析出百度域名的 IP 地址,一共發送了 8 份 DNS 報文。用戶本來只是想和百度的服務器進行交互,卻耗費了大量的時間進行域名解析,如果每次都這樣搞,豈不是得慢死?因此就需要有一些提升域名解析速度的方式。
3. 提升域名解析速度?
(1)TCP or UDP
我們都知道,TCP 相較于 UDP 更可靠,但是速度更慢。
DNS 應該采用哪個傳輸層協議呢?
- 如果采用 TCP 協議,不僅需要三次握手建立連接,而且需要進行擁塞控制等,那么域名解析速度將慢成龜速,不利于用戶體驗。
- 如果采用 UDP 協議,萬一丟包了怎么辦?如果解析不出來 IP,怎么訪問目標網站?不利于用戶體驗。
實際上,DNS 主要使用 UDP,在特殊情況下,也會使用 TCP,端口號都是 53。
一般情況下,DNS 報文都比較小,只需要一個包就能承載所有信息。既然只有一個包,就無需考慮哪個包未送達,直接重發一個包即可,因此無需使用 TCP 那樣復雜的協議,直接使用 UDP 協議,DNS 協議自己處理超時和重傳問題,以提供可靠性服務。
當然有的時候 DNS 報文比較大,比如響應報文中可能一個域名包含有很多 IP 記錄。當服務器響應時,會將報文中的 TC 標志位設置為 1,表示響應長度超過了 512 字節,此報文僅僅返回前 512 字節。當我們的主機收到響應后,就會使用 TCP 協議重發原來的查詢請求,以獲取完整報文。
此外,為了防止本地域名服務器(主域名服務器)宕機而導致無法對域名進行解析,本機還需要設置一個輔助域名服務器。當主域名服務器宕機后,由輔助域名服務器繼續提供域名解析的服務。輔助域名服務器會定時(通常是每隔 3小時)向主服務器發送查詢請求以實現同步,此時傳輸數據較多,因而使用 TCP 協議。
(2)DNS 緩存
即使采用 UDP 協議,但是如果每次都需要從根服務器開始一層一層的查詢,仍然很慢,且處于層級結構中的域名服務器將會接收到大量的請求,處理速度進一步降低!
為了提升域名解析速度并減輕域名服務器的壓力,DNS 廣泛使用了緩存技術。
當用戶訪問了某個網站后,本地域名服務器會將解析出的域名和 IP 地址的映射關系緩存一定時間。在緩存過期前,用戶再訪問相同網站時,本地域名服務器就可以直接返回查詢結果,而無需再去詢問根域名服務器、頂級域名服務器等,這樣就能大大減少傳輸的 DNS 報文數量!
實際上,不僅在本地域名服務器中設置了高度緩存,用戶主機也有緩存。對于 windows 電腦,可以通過命令ipconfig/displaydns查詢當前 DNS 緩存,比如當我訪問了百度后,本機就會緩存以下信息:
緩存雖然提升了 DNS 解析速度,但并不能保證一致性,因為一個網站的域名和 IP 地址的映射關系并不是永久不變的,可能緩存的解析結果已失效,因而 DNS 緩存時間不能設置太大!
Windows 電腦也可以通過命令ipconfig/flushdns清空本機緩存。
(3)切換本地域名服務器
前面提到,在進行域名解析時,主機會向本地域名服務器發起遞歸查詢,如果本地域名服務器的性能較差,或者未正確配置緩存,那么我們上網的速度將會變得非常慢,因此選擇一個好的本地域名服務器將有助于提升沖浪速度!
默認情況下,本機在聯網時會通過 DHCP 協議自動獲得一個 DNS 服務器地址,那么如果此服務器性能不好,該如何更換呢?
以 Windows 為例,可以通過控制面板?—>網絡和 Internet?—>網絡連接?—>Internet 協議版本4(TCP/IPv4)修改本地域名服務器的 IP 地址。
互聯網上常見的公共 DNS 服務器的 IP 地址如下:
|
首選 DNS 服務器地址 |
備用 DNS 服務器地址 |
阿里 |
223.5.5.5 |
223.6.6.6 |
騰訊 |
119.29.29.29 |
182.254.116.116 |
百度 |
180.76.76.76 |
114.114.114.114 |
谷歌 |
8.8.8.8 |
8.8.4.4 |
114DNS |
114.114.114.114 |
114.114.115.115 |
?一般情況下,自動獲取的本地域名服務器與主機位于同一個子網中,速度都挺快的。但是如果在上網過程中,發現打開網頁的速度很慢,也可以嘗試使用上面的公共 DNS 服務器,說不定速度會有所改善。
4. DNS 記錄和報文?
實際上,域名服務器中保存并不僅僅是域名和 IP 地址,而是保存了一個資源記錄(Resource Record,RR)。
一個資源記錄包含四部分內容,分別是 Name,Value,Type,TTL。
TTL 指的是記錄的生存時間,以秒為單位,它決定了緩存此記錄的過期時間。
Name 和 Value 的含義隨著 Type 的不同而不同,舉幾個常見例子:
- 當 Type = A 時(A 是 Address 縮寫,也可用編號 1 表示),Name 表示域名,Value 表示對應的 IP 地址,如(www.example.com,93.184.216.34,A,86400)。
- 當 Type = NS 時(NS 是 Name Server 縮寫,也可用編號 2 表示),Name 表示一個域,Value 為負責該域解析的域名服務器的域名,如(baidu.com,ns1.baidu.com,NS,172800),此記錄用于沿著層級結構查詢鏈來路由 DNS 查詢。
如果一臺域名服務器是用于某特定域名的權威域名服務器,那么其將會有一條包含該域名的 A 記錄。
如果一臺域名服務器不是用于某特定域名的權威域名服務器,那么其將包含一條 NS 記錄,該記錄用來指定該域名由哪個域名服務器來進行解析;除此之外,它還將包含一條 A 記錄,該記錄提供了在 NS 記錄中 Value 字段中的域名服務器的 IP 地址。
接下來介紹一下 DNS 報文的具體內容。DNS 報文分為兩類:查詢報文和回答報文,二者有著相同的格式,如下圖所示:
- 事務 ID:用于標識 DNS 查詢的標識符。查詢報文和其對應的回答報文有著相同的事務 ID,因此通過它可以區分 DNS 回答報文是對哪個請求進行響應的。
- 標志:此字段中含有若干標志,比如有一個『QR』標志位用于指出此報文是查詢報文(0)還是回答報文(1),再比如有一個『TC』標志位用于指出此報文長度是否大于 512 字節。
- 問題數:對應于下面查詢問題的數量(支持同時查詢多個域名,通常為一個)。
- 回答資源記錄數:對應于下面回答問題相關資源記錄的數量(一個域名可能有多個 IP 對應,那么將會有多個回答記錄)。
- 權威資源記錄數:對應于下面權威域名服務器相關資源記錄的數量。
- 附加資源記錄數:對應于下面附加信息相關資源記錄的數量。
- 查詢問題:此區域為查詢內容,包含查詢域名和查詢類型(如 www.example.com,A)。
- 回答問題:此區域為查詢結果,包含一到多條資源記錄(如 www.example.com,93.184.216.34, A,300)。
- 權威域名服務器:此區域為其他權威域名服務器的記錄,即含有指向權威域名服務器的資源記錄,用以繼續解析過程。(如 baidu.com,ns1.baidu.com,NS,172800)。
- 附加信息:此區域為其他有幫助的信息,比如提供權威域名服務器所對應的 IP 地址。
最后,使用 Wireshark 抓一個 DNS 查詢報文和回答報文:
查詢報文:
回答報文:
??
本文轉載自微信公眾號「 一楓說碼」,作者「一楓說碼」,可以通過以下二維碼關注。