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