網(wǎng)太卡?看 DNS 是如何影響你沖浪速度的?
本文詳細(xì)介紹了 DNS 相關(guān)知識(shí),包括 DNS 工作原理、如何提升域名解析速度、以及 DNS 記錄與報(bào)文等內(nèi)容。
1. 域名與域名服務(wù)器
在日常上網(wǎng)過(guò)程中,出于好記的原因,人們更喜歡在瀏覽器中輸入網(wǎng)站的
域名
,而不是
IP
地址。比如想要訪問(wèn)百度,則會(huì)輸入
www.baidu.com
,而不是
202.108.22.5
(或者百度網(wǎng)站的其他 IP)。
然而計(jì)算機(jī)網(wǎng)絡(luò)通信中所識(shí)別的標(biāo)識(shí)并不是
域名
,而是
IP
地址,因?yàn)槠淇梢蕴峁┲鳈C(jī)在互聯(lián)網(wǎng)中的位置信息,而且是定長(zhǎng)的,路由器等設(shè)備更容易處理。

為了折中人類和計(jì)算機(jī)不同的偏好,就出現(xiàn)了 DNS( D omain N ame S ystem,域名系統(tǒng)),其主要任務(wù)是 根據(jù)域名查出對(duì)應(yīng)的 IP 地址 。
下面先介紹一下域名和域名服務(wù)器,之后再介紹 DNS 的工作原理。
域名 由若干個(gè)英文字符串組成(不區(qū)分大小寫(xiě)),各字符串之間用點(diǎn)號(hào)『.』分隔連接,其中越靠右的表示域名級(jí)別越高。
舉個(gè)例子,百度的域名為
www.baidu.com
,其中
com
是頂級(jí)域名(一級(jí)域名),
baidu
是二級(jí)域名,
www
是三級(jí)域名。
域名服務(wù)器 (也稱為 DNS 服務(wù)器)負(fù)責(zé)存儲(chǔ)域名和 IP 地址的映射關(guān)系,當(dāng)我們需要獲取某個(gè)域名對(duì)應(yīng)的 IP 地址時(shí),只需要從域名服務(wù)器中查詢即可。

由于域名非常非常多,如果都存放在一臺(tái)域名服務(wù)器中,那么不僅查詢速度慢,服務(wù)器壓力大,而且難以保證服務(wù)的可靠性。因此,
DNS 采用了分布式的設(shè)計(jì)方案,大量的域名服務(wù)器之間通過(guò)
層次
方式組織,分布在全世界范圍內(nèi)。
一般而言,域名服務(wù)器可以分為以下四類:
-
根域名服務(wù)器:最高層級(jí)的域名服務(wù)器,因特網(wǎng)上一共有 13 個(gè)根域名服務(wù)器(以英文字母 A 到 M 依序命名,格式為[a~m].root-servers.net), 每個(gè)根域名服務(wù)器都知道所有頂級(jí)域名服務(wù)器的 IP 地址 ,比如知道負(fù)責(zé) com 域的頂級(jí)域名服務(wù)器的 IP 地址。 -
頂級(jí)域名服務(wù)器:對(duì)于每個(gè)頂級(jí)域名,如 com、org、edu 等,都有對(duì)應(yīng)的頂級(jí)域名服務(wù)器。 頂級(jí)域名服務(wù)器知道其所管理的所有權(quán)威域名服務(wù)器的 IP 地址 ,比如負(fù)責(zé) com 域的頂級(jí)域名服務(wù)器知道負(fù)責(zé) baidu.com 域的權(quán)威域名服務(wù)器的 IP 地址。 -
權(quán)威域名服務(wù)器:一個(gè)網(wǎng)站需要將其域名和 IP 地址注冊(cè)到相應(yīng)的權(quán)威域名服務(wù)器中,比如網(wǎng)站 www.baidu.com 的域名和 IP 地址就存儲(chǔ)在負(fù)責(zé) baidu.com 域的權(quán)威域名服務(wù)器中。 -
本地域名服務(wù)器:本地域名服務(wù)器不屬于上述域名服務(wù)器的層次結(jié)構(gòu),但是它對(duì)域名系統(tǒng)非常重要。每個(gè) ISP(如一個(gè)大學(xué)、一個(gè)公司)都有一個(gè)本地域名服務(wù)器(也叫默認(rèn)域名服務(wù)器) 。 具體在下一節(jié)中介紹。

2. 域名解析流程
知道了域名和域名服務(wù)器的基礎(chǔ)知識(shí)后,我們來(lái)了解一下 域名解析 的具體流程,以輸入百度域名為例,看看我們的主機(jī)是如何得到 www.baidu.com 的 IP 地址的。

-
請(qǐng)求主機(jī)向 本地域名服務(wù)器 發(fā)送 DNS 查詢報(bào)文,詢問(wèn) www.baidu.com 的 IP 地址是什么;
-
本地域名服務(wù)器 轉(zhuǎn)發(fā)此查詢報(bào)文到 根域名服務(wù)器 ;
-
根域名服務(wù)器 發(fā)現(xiàn)要查詢的頂級(jí)域名為 com ,于是向 本地域名服務(wù)器 發(fā)送響應(yīng)報(bào)文,報(bào)文中封裝了負(fù)責(zé) com 域的頂級(jí)域名服務(wù)器的 IP 地址列表;
-
本地域名服務(wù)器 收到根域名服務(wù)器響應(yīng)的報(bào)文后,選擇其中一個(gè) 頂級(jí)域名服務(wù)器 的 IP 地址,并向其發(fā)送查詢報(bào)文;
-
頂級(jí)域名服務(wù)器 發(fā)現(xiàn)要查詢的二級(jí)域名為 baidu ,于是向 本地域名服務(wù)器 發(fā)送響應(yīng)報(bào)文,報(bào)文中封裝了負(fù)責(zé) baidu.com 域的權(quán)威域名服務(wù)器的 IP 地址列表;
-
本地域名服務(wù)器 收到頂級(jí)域名服務(wù)器響應(yīng)的報(bào)文后,選擇其中一個(gè) 權(quán)威域名服務(wù)器 的 IP 地址,并向其發(fā)送查詢報(bào)文;
-
權(quán)威域名服務(wù)器 通過(guò)查詢數(shù)據(jù)庫(kù),找到 www.baidau.com 的 IP 地址,并將此信息封裝為一個(gè)響應(yīng)報(bào)文,發(fā)送給 本地域名服務(wù)器 ;
-
本地域名服務(wù)器 將響應(yīng)報(bào)文發(fā)送給原請(qǐng)求主機(jī)。我們的主機(jī)就知道了百度的 IP 地址,DNS 查詢過(guò)程結(jié)束。
在此過(guò)程中,請(qǐng)求主機(jī)與本地域名服務(wù)器之間的交互稱為
遞歸查詢
,而本地域名服務(wù)器與域名服務(wù)器層次結(jié)構(gòu)中相關(guān)服務(wù)器的交互稱為
迭代查詢
。
請(qǐng)求主機(jī)是如何知道本地域名服務(wù)器的 IP 地址的?
當(dāng)用戶插上網(wǎng)線或者連上 WIFI 后,電腦會(huì)通過(guò) DHCP 協(xié)議分配一個(gè) IP 地址,與此同時(shí),也會(huì)獲取到本地域名服務(wù)器的 IP 地址!
本地域名服務(wù)器是如何知道根域名服務(wù)器的 IP 地址的?
因特網(wǎng)上一共有 13 個(gè)根域名服務(wù)器,它們的 IP 地址是固定不變的,因此被集成在了操作系統(tǒng)中,每臺(tái)電腦都知道!
為了解析出百度域名的 IP 地址,一共發(fā)送了 8 份 DNS 報(bào)文。用戶本來(lái)只是想和百度的服務(wù)器進(jìn)行交互,卻耗費(fèi)了大量的時(shí)間進(jìn)行域名解析, 如果每次都這樣搞,豈不是得慢死?因此就需要有一些提升域名解析速度的方式。
3. ?提升域名解析速度
(1)TCP or UDP
我們都知道,
TCP 相較于 UDP 更可靠,但是速度更慢
。

DNS 應(yīng)該采用哪個(gè)傳輸層協(xié)議呢?
-
如果采用 TCP 協(xié)議,不僅需要三次握手建立連接,而且需要進(jìn)行擁塞控制等,那么域名解析速度將慢成龜速,不利于用戶體驗(yàn)。
-
如果采用 UDP 協(xié)議,萬(wàn)一丟包了怎么辦?如果解析不出來(lái) IP,怎么訪問(wèn)目標(biāo)網(wǎng)站?不利于用戶體驗(yàn)。
實(shí)際上, DNS 主要使用 UDP,在特殊情況下,也會(huì)使用 TCP,端口號(hào)都是 53 。
一般情況下,DNS 報(bào)文都比較小,只需要一個(gè)包就能承載所有信息。既然只有一個(gè)包,就無(wú)需考慮哪個(gè)包未送達(dá),直接重發(fā)一個(gè)包即可,因此無(wú)需使用 TCP 那樣復(fù)雜的協(xié)議,直接 使用 UDP 協(xié)議 ,DNS 協(xié)議自己處理超時(shí)和重傳問(wèn)題,以提供可靠性服務(wù)。
當(dāng)然有的時(shí)候 DNS 報(bào)文比較大,比如響應(yīng)報(bào)文中可能一個(gè)域名包含有很多 IP 記錄。當(dāng)服務(wù)器響應(yīng)時(shí),會(huì)將報(bào)文中的 TC 標(biāo)志位設(shè)置為 1,表示響應(yīng)長(zhǎng)度超過(guò)了 512 字節(jié),此報(bào)文僅僅返回前 512 字節(jié)。當(dāng)我們的主機(jī)收到響應(yīng)后,就會(huì) 使用 TCP 協(xié)議 重發(fā)原來(lái)的查詢請(qǐng)求,以獲取完整報(bào)文。
此外,為了防止本地域名服務(wù)器(主域名服務(wù)器)宕機(jī)而導(dǎo)致無(wú)法對(duì)域名進(jìn)行解析,本機(jī)還需要設(shè)置一個(gè)輔助域名服務(wù)器。 當(dāng)主域名服務(wù)器宕機(jī)后,由輔助域名服務(wù)器繼續(xù)提供域名解析的服務(wù)。 輔助域名服務(wù)器會(huì)定時(shí)(通常是每隔 3小時(shí))向主服務(wù)器發(fā)送查詢請(qǐng)求以實(shí)現(xiàn)同步,此時(shí)傳輸數(shù)據(jù)較多,因而 使用 TCP 協(xié)議 。
(2)DNS 緩存
即使采用 UDP 協(xié)議,但是如果每次都需要從根服務(wù)器開(kāi)始一層一層的查詢,仍然很慢,且處于層級(jí)結(jié)構(gòu)中的域名服務(wù)器將會(huì)接收到大量的請(qǐng)求,處理速度進(jìn)一步降低!
為了提升域名解析速度并減輕域名服務(wù)器的壓力,DNS 廣泛使用了 緩存 技術(shù)。
當(dāng)用戶訪問(wèn)了某個(gè)網(wǎng)站后,本地域名服務(wù)器會(huì)將解析出的域名和 IP 地址的映射關(guān)系緩存一定時(shí)間。 在緩存過(guò)期前,用戶再訪問(wèn)相同網(wǎng)站時(shí),本地域名服務(wù)器就可以直接返回查詢結(jié)果 ,而無(wú)需再去詢問(wèn)根域名服務(wù)器、頂級(jí)域名服務(wù)器等,這樣就能大大減少傳輸?shù)?DNS 報(bào)文數(shù)量!
實(shí)際上,不僅在本地域名服務(wù)器中設(shè)置了高度緩存,用戶主機(jī)也有緩存。對(duì)于 Windows 電腦,可以通過(guò)命令
ipconfig/displaydns
查詢當(dāng)前 DNS 緩存,比如當(dāng)我訪問(wèn)了百度后,本機(jī)就會(huì)緩存以下信息:

緩存雖然提升了 DNS 解析速度,但并不能保證一致性,因?yàn)橐粋€(gè)網(wǎng)站的域名和 IP 地址的映射關(guān)系并不是永久不變的,可能緩存的解析結(jié)果已失效,因而 DNS 緩存時(shí)間不能設(shè)置太大!
Windows 電腦也可以通過(guò)命令
ipconfig/flushdns
清空本機(jī)緩存。
(3)切換本地域名服務(wù)器
前面提到,在進(jìn)行域名解析時(shí),主機(jī)會(huì)向本地域名服務(wù)器發(fā)起
遞歸查詢
,如果本地域名服務(wù)器的性能較差,或者未正確配置緩存,那么我們上網(wǎng)的速度將會(huì)變得非常慢,因此
選擇一個(gè)好的本地域名服務(wù)器將有助于提升沖浪速度
!
默認(rèn)情況下,本機(jī)在聯(lián)網(wǎng)時(shí)會(huì)通過(guò) DHCP 協(xié)議自動(dòng)獲得一個(gè) DNS 服務(wù)器地址,那么如果此服務(wù)器性能不好,該如何更換呢?
以 Windows 為例,可以通過(guò)
控制面板
—>
網(wǎng)絡(luò)和 Internet
—>
網(wǎng)絡(luò)連接
—>
Internet 協(xié)議版本4(TCP/IPv4)
修改本地域名服務(wù)器的 IP 地址。

互聯(lián)網(wǎng)上常見(jiàn)的 公共 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 |
一般情況下,自動(dòng)獲取的本地域名服務(wù)器與主機(jī)位于同一個(gè)子網(wǎng)中,速度都挺快的。 但是如果在上網(wǎng)過(guò)程中,發(fā)現(xiàn)打開(kāi)網(wǎng)頁(yè)的速度很慢,也可以嘗試使用上面的公共 DNS 服務(wù)器,說(shuō)不定速度會(huì)有所改善。
4. DNS 記錄和報(bào)文
實(shí)際上,域名服務(wù)器中保存并不僅僅是域名和 IP 地址,而是保存了一個(gè)資源記錄(Resource Record,RR)。
一個(gè)資源記錄包含四部分內(nèi)容,分別是
Name
,
Value
,
Type
,
TTL
。
TTL 指的是記錄的生存時(shí)間,以秒為單位,它決定了緩存此記錄的過(guò)期時(shí)間。
Name 和 Value 的含義隨著 Type 的不同而不同,舉幾個(gè)常見(jiàn)例子:
-
當(dāng) Type = A 時(shí)(A 是 Address 縮寫(xiě),也可用編號(hào) 1 表示),Name 表示域名,Value 表示對(duì)應(yīng)的 IP 地址 ,如( www.example.com ,93.184.216.34,A,86400 )。
-
當(dāng) Type = NS 時(shí)(NS 是 Name Server 縮寫(xiě),也可用編號(hào) 2 表示),Name 表示一個(gè)域,Value 為負(fù)責(zé)該域解析的域名服務(wù)器的域名 ,如( baidu.com,ns1.baidu.com,NS,172800 ),此記錄用于沿著層級(jí)結(jié)構(gòu)查詢鏈來(lái)路由 DNS 查詢。
如果一臺(tái)域名服務(wù)器是用于某特定域名的權(quán)威域名服務(wù)器,那么其將會(huì)有一條包含該域名的 A 記錄。
如果一臺(tái)域名服務(wù)器不是用于某特定域名的權(quán)威域名服務(wù)器,那么其將包含一條 NS 記錄,該記錄用來(lái)指定該域名由哪個(gè)域名服務(wù)器來(lái)進(jìn)行解析;除此之外,它還將包含一條 A 記錄,該記錄提供了在 NS 記錄中 Value 字段中的域名服務(wù)器的 IP 地址。

接下來(lái)介紹一下 DNS 報(bào)文的具體內(nèi)容。DNS 報(bào)文分為兩類:
查詢報(bào)文
和
回答報(bào)文
,二者有著相同的格式,如下圖所示:

-
事務(wù) ID:用于標(biāo)識(shí) DNS 查詢的標(biāo)識(shí)符。查詢報(bào)文和其對(duì)應(yīng)的回答報(bào)文有著相同的事務(wù) ID,因此通過(guò)它可以區(qū)分 DNS 回答報(bào)文是對(duì)哪個(gè)請(qǐng)求進(jìn)行響應(yīng)的。 -
標(biāo)志:此字段中含有若干標(biāo)志,比如有一個(gè)『QR』標(biāo)志位用于指出此報(bào)文是查詢報(bào)文(0)還是回答報(bào)文(1),再比如有一個(gè)『TC』標(biāo)志位用于指出此報(bào)文長(zhǎng)度是否大于 512 字節(jié)。 -
問(wèn)題數(shù):對(duì)應(yīng)于下面查詢問(wèn)題的數(shù)量(支持同時(shí)查詢多個(gè)域名,通常為一個(gè))。 -
回答資源記錄數(shù):對(duì)應(yīng)于下面回答問(wèn)題相關(guān)資源記錄的數(shù)量(一個(gè)域名可能有多個(gè) IP 對(duì)應(yīng),那么將會(huì)有多個(gè)回答記錄)。 -
權(quán)威資源記錄數(shù):對(duì)應(yīng)于下面權(quán)威域名服務(wù)器相關(guān)資源記錄的數(shù)量。 -
附加資源記錄數(shù):對(duì)應(yīng)于下面附加信息相關(guān)資源記錄的數(shù)量。 -
查詢問(wèn)題:此區(qū)域?yàn)椴樵儍?nèi)容,包含查詢域名和查詢類型(如 ? www.example.com ,A )。 -
回答問(wèn)題:此區(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ù)解析過(guò)程。(如 baidu.com,ns1.baidu.com,NS,172800 )。 -
附加信息:此區(qū)域?yàn)槠渌袔椭男畔?,比如提供?quán)威域名服務(wù)器所對(duì)應(yīng)的 IP 地址。
最后,使用 Wireshark 抓一個(gè) DNS 查詢報(bào)文和回答報(bào)文:
查詢報(bào)文:

回答報(bào)文:

我是小富,下期見(jiàn)~
··········? END? ··············
在看 、 點(diǎn)贊 、 轉(zhuǎn)發(fā) ,是對(duì)我最大的鼓勵(lì) 。
技術(shù)書(shū)籍公眾號(hào)內(nèi)回復(fù)[? pdf ?] Get 。
面試筆記、springcloud進(jìn)階實(shí)戰(zhàn)PDF,公眾號(hào)內(nèi)回復(fù)[? 1222 ?]?Get。
有幾個(gè) 技術(shù)群 ,想進(jìn)的同學(xué)可以加我好友,備注: 進(jìn)群 ,一起成長(zhǎng)。
