8 張圖帶你徹底搞懂 DNS 域名解析過(guò)程
在下方公眾號(hào)后臺(tái)回復(fù):JGNB,可獲取杰哥原創(chuàng)的 PDF 手冊(cè)。
1、DNS
DNS(Domain Name System)是域名系統(tǒng)的英文縮寫,是一種組織成域?qū)哟谓Y(jié)構(gòu)的計(jì)算機(jī)和網(wǎng)絡(luò)服務(wù)命名系統(tǒng),用于 TCP/IP 網(wǎng)絡(luò)。
2、域名系統(tǒng) DNS 的作用
通常我們有兩種方式識(shí)別主機(jī):通過(guò)主機(jī)名或者 IP 地址。人們喜歡便于記憶的主機(jī)名表示,而路由器則喜歡定長(zhǎng)的、有著層次結(jié)構(gòu)的 IP 地址。為了滿足這些不同的偏好,我們就需要一種能夠進(jìn)行主機(jī)名到IP 地址轉(zhuǎn)換的目錄服務(wù),域名系統(tǒng)作為將域名和 IP 地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù),能夠使人更方便地訪問(wèn)互聯(lián)網(wǎng)。
因此,即使不使用域名也可以通過(guò)IP地址來(lái)尋址目的主機(jī),但域名與IP地址相比,便于人們記憶。因此對(duì)于大多數(shù)網(wǎng)絡(luò)應(yīng)用,我們一般使用域名來(lái)訪問(wèn)目的主機(jī),而不是直接使用IP地址來(lái)訪問(wèn)。
對(duì)于本例,簡(jiǎn)單來(lái)說(shuō),當(dāng)我們?cè)跒g覽器地址欄中輸入某個(gè)Web服務(wù)器的域名時(shí)。用戶主機(jī)首先用戶主機(jī)會(huì)首先在自己的DNS高速緩存中查找該域名所應(yīng)的IP地址。

如果沒(méi)有找到,則會(huì)向網(wǎng)絡(luò)中的某臺(tái)DNS服務(wù)器查詢,DNS服務(wù)器中有域名和IP地址映射關(guān)系的數(shù)據(jù)庫(kù)。當(dāng)DNS服務(wù)器收到DNS查詢報(bào)文后,在其數(shù)據(jù)庫(kù)中查詢,之后將查詢結(jié)果發(fā)送給用戶主機(jī)。

現(xiàn)在,用戶主機(jī)中的瀏覽器可以通過(guò)Web服務(wù)器的IP地址對(duì)其進(jìn)行訪問(wèn)了。

3、域名的層級(jí)關(guān)系
層級(jí)關(guān)系特點(diǎn)
因特網(wǎng)采用層次樹狀結(jié)構(gòu)的域名結(jié)構(gòu)
域名的結(jié)構(gòu)由若干個(gè)分量組成,各分量之間用點(diǎn)隔開,分別代表不同級(jí)別的域名。
每一級(jí)的域名都由英文字母和數(shù)字組成,不超過(guò)63個(gè)字符,不區(qū)分大小寫字母。
級(jí)別最低的域名寫在最左邊,而級(jí)別最高的頂級(jí)域名寫在最右邊。
完整的域名不超過(guò)255個(gè)字符。
域名系統(tǒng)既不規(guī)定一個(gè)域名需要包含多少個(gè)下級(jí)域名,也不規(guī)定每一級(jí)的域名代表什么意思。
各級(jí)域名由其上一級(jí)的域名管理機(jī)構(gòu)管理,而最高的頂級(jí)域名則由因特網(wǎng)名稱與數(shù)字地址分配機(jī)構(gòu)ICANN進(jìn)行管理。
因特網(wǎng)的域名空間

上圖展示了 DNS 服務(wù)器的部分層次結(jié)構(gòu),從上到下依次為根域名服務(wù)器、頂級(jí)域名服務(wù)器和權(quán)威域名服務(wù)器。域名和IP地址的映射關(guān)系必須保存在域名服務(wù)器中,供所有其他應(yīng)用查詢。顯然不能將所有信息都儲(chǔ)存在一臺(tái)域名服務(wù)器中。DNS使用分布在各地的域名服務(wù)器來(lái)實(shí)現(xiàn)域名到IP地址的轉(zhuǎn)換。
域名服務(wù)器可以劃分為以下四種不同的類型:
根域名服務(wù)器:根域名服務(wù)器是最高層次的域名服務(wù)器。每個(gè)根域名服務(wù)器都知道所有的頂級(jí)域名服務(wù)器的域名及其IP地址。因特網(wǎng)上共有13個(gè)不同IP地址的根域名服務(wù)器。當(dāng)本地域名服務(wù)器向根域名服務(wù)器發(fā)出查詢請(qǐng)求時(shí),路由器就把查詢請(qǐng)求報(bào)文轉(zhuǎn)發(fā)到離這個(gè)DNS客戶最近的一個(gè)根域名服務(wù)器。這就加快了DNS的查詢過(guò)程,同時(shí)也更合理地利用了因特網(wǎng)的資源。頂級(jí)域名服務(wù)器:這些域名服務(wù)器負(fù)責(zé)管理在該頂級(jí)域名服務(wù)器注冊(cè)的所有二級(jí)域名。當(dāng)收到DNS查詢請(qǐng)求時(shí)就給出相應(yīng)的回答(可能是最后的結(jié)果,也可能是下一級(jí)權(quán)限域名服務(wù)器的IP地址)。權(quán)限域名服務(wù)器:這些域名服務(wù)器負(fù)責(zé)管理某個(gè)區(qū)的域名。每一個(gè)主機(jī)的域名都必須在某個(gè)權(quán)限域名服務(wù)器處注冊(cè)登記。因此權(quán)限域名服務(wù)器知道其管轄的域名與IP地址的映射關(guān)系。另外,權(quán)限域名服務(wù)器還知道其下級(jí)域名服務(wù)器的地址。本地域名服務(wù)器:本地域名服務(wù)器不屬于上述的域名服務(wù)器的等級(jí)結(jié)構(gòu)。當(dāng)一個(gè)主機(jī)發(fā)出DNS請(qǐng)求報(bào)文時(shí),這個(gè)報(bào)文就首先被送往該主機(jī)的本地域名服務(wù)器。本地域名服務(wù)器起著代理的作用,會(huì)將該報(bào)文轉(zhuǎn)發(fā)到上述的域名服務(wù)器的等級(jí)結(jié)構(gòu)中。本地域名服務(wù)器離用戶較近,一般不超過(guò)幾個(gè)路由器的距離,也有可能就在同一個(gè)局域網(wǎng)中。本地域名服務(wù)器的IP地址需要直接配置在需要域名解析的主機(jī)中。
4、DNS域名解析過(guò)程
域名解析包含兩種查詢方式,分別是遞歸查詢和迭代查詢。
遞歸查詢
如果主機(jī)所詢問(wèn)的本地域名服務(wù)器不知道被查詢域名的 IP 地址,那么本地域名服務(wù)器就以 DNS 客戶端的身份,向其他根域名服務(wù)器繼續(xù)發(fā)出查詢請(qǐng)求報(bào)文,即替主機(jī)繼續(xù)查詢,而不是讓主機(jī)自己進(jìn)行下一步查詢。
我們以一個(gè)例子來(lái)了解DNS遞歸查詢的工作原理,假設(shè)圖中的主機(jī) (IP地址為m.xyz.com) 想知道域名y.abc.com的IP地址。
1、主機(jī)首先向其本地域名服務(wù)器進(jìn)行遞歸查詢。
2、本地域名服務(wù)器收到遞歸查詢的委托后,也采用遞歸查詢的方式向某個(gè)根域名服務(wù)器查詢。
3、根域名服務(wù)器收到遞歸查詢的委托后,也采用遞歸查詢的方式向某個(gè)頂級(jí)域名服務(wù)器查詢。
4、頂級(jí)域名服務(wù)器收到遞歸查詢的委托后,也采用遞歸查詢的方式向某個(gè)權(quán)限域名服務(wù)器查詢。
過(guò)程如圖所示

當(dāng)查詢到域名對(duì)應(yīng)的IP地址后,查詢結(jié)果會(huì)在之前受委托的各域名服務(wù)器之間傳遞,最終傳回給用戶主機(jī)。
過(guò)程如圖所示

迭代查詢
當(dāng)根域名服務(wù)器收到本地域名服務(wù)器發(fā)出的迭代查詢請(qǐng)求報(bào)文時(shí),要么給出所要查詢的IP 地址,要么告訴本地服務(wù)器下一步應(yīng)該找哪個(gè)域名服務(wù)器進(jìn)行查詢,然后讓本地服務(wù)器進(jìn)行后續(xù)的查詢。
迭代查詢過(guò)程如下
1、主機(jī)首先向其本地域名服務(wù)器進(jìn)行遞歸查詢。
2、本地域名服務(wù)器采用迭代查詢,它先向某個(gè)根域名服務(wù)器查詢。
3、根域名服務(wù)器告訴本地域名服務(wù)器,下一次應(yīng)查詢的頂級(jí)域名服務(wù)器的IP地址。
4、本地域名服務(wù)器向頂級(jí)域名服務(wù)器進(jìn)行迭代查詢。
5、頂級(jí)域名服務(wù)器告訴本地域名服務(wù)器,下一次應(yīng)查詢的權(quán)限域名服務(wù)器的IP地址。
6、本地域名服務(wù)器向權(quán)限域名服務(wù)器進(jìn)行迭代查詢。
7、權(quán)限域名服務(wù)器告訴本地域名服務(wù)器所查詢的域名的IP地址。
8、本地域名服務(wù)器最后把查詢的結(jié)果告訴主機(jī)。
過(guò)程如圖所示

由于遞歸查詢對(duì)于被查詢的域名服務(wù)器負(fù)擔(dān)太大,通常采用以下模式:從請(qǐng)求主機(jī)到本地域名服務(wù)器的查詢是遞歸查詢,而其余的查詢是迭代查詢。
5、高速緩存
為了提高DNS的查詢效率,并減輕根域名服務(wù)器的負(fù)荷和減少因特網(wǎng)上的DNS查詢報(bào)文數(shù)量,在域名服務(wù)器中廣泛地使用了高速緩存。高速緩存用來(lái)存放最近查詢過(guò)的域名以及從何處獲得域名映射信息的記錄。
由于域名到IP地址的映射關(guān)系并不是永久不變,為保持高速緩存中的內(nèi)容正確,域名服務(wù)器應(yīng)為每項(xiàng)內(nèi)容設(shè)置計(jì)時(shí)器并刪除超過(guò)合理時(shí)間的項(xiàng)(例如,每個(gè)項(xiàng)目只存放兩天)。
不但在本地域名服務(wù)器中需要高速緩存,在用戶主機(jī)中也很需要。許多用戶主機(jī)在啟動(dòng)時(shí)從本地域名服務(wù)器下載域名和IP地址的全部數(shù)據(jù)庫(kù),維護(hù)存放自己最近使用的域名的高速緩存,并且只在從緩存中找不到域名時(shí)才向域名服務(wù)器查詢。同理,主機(jī)也需要保持高速緩存中內(nèi)容的正確性。
如圖所示

如果本地域名服務(wù)器不久前已經(jīng)有用戶查詢過(guò)域名為y.abc.com的IP地址,則本地域名服務(wù)器的高速緩存中應(yīng)該存有該域名對(duì)應(yīng)的IP地址。因此,直接把高速緩存中存放的上次查詢結(jié)果(即y.abc.com的IP地址)告訴用戶。
6、DNS相關(guān)面試問(wèn)題
1、DNS為什么用UDP?
更正確的答案是 DNS 既使用 TCP 又使用 UDP。當(dāng)進(jìn)行區(qū)域傳送(主域名服務(wù)器向輔助域名服務(wù)器傳送變化的那部分?jǐn)?shù)據(jù))時(shí)會(huì)使用 TCP,因?yàn)閿?shù)據(jù)同步傳送的數(shù)據(jù)量比一個(gè)請(qǐng)求和應(yīng)答的數(shù)據(jù)量要多,而 TCP 允許的報(bào)文長(zhǎng)度更長(zhǎng),因此為了保證數(shù)據(jù)的正確性,會(huì)使用基于可靠連接的 TCP。
當(dāng)客戶端向 DNS 服務(wù)器查詢域名 ( 域名解析) 的時(shí)候,一般返回的內(nèi)容不會(huì)超過(guò) UDP 報(bào)文的最大長(zhǎng)度,即 512 字節(jié)。用 UDP 傳輸時(shí),不需要經(jīng)過(guò) TCP 三次握手的過(guò)程,從而大大提高了響應(yīng)速度,但這要求域名解析器和域名服務(wù)器都必須自己處理超時(shí)和重傳從而保證可靠性。
2、遞歸查詢和迭代查詢區(qū)別?
遞歸查詢: 如果主機(jī)所詢問(wèn)的本地域名服務(wù)器不知道被查詢域名的 IP 地址,那么本地域名服務(wù)器就以 DNS 客戶端的身份,向其他根域名服務(wù)器繼續(xù)發(fā)出查詢請(qǐng)求報(bào)文,即替主機(jī)繼續(xù)查詢,而不是讓主機(jī)自己進(jìn)行下一步查詢。
迭代查詢:當(dāng)根域名服務(wù)器收到本地域名服務(wù)器發(fā)出的迭代查詢請(qǐng)求報(bào)文時(shí),要么給出所要查詢的IP 地址,要么告訴本地服務(wù)器下一步應(yīng)該找哪個(gè)域名服務(wù)器進(jìn)行查詢,然后讓本地服務(wù)器進(jìn)行后續(xù)的查詢。
3、使用域名訪問(wèn)web服務(wù)器過(guò)程
具體請(qǐng)看本專欄的這篇文章:面試官問(wèn)我:從地址欄輸入U(xiǎn)RL到顯示頁(yè)面都發(fā)生了什么?
4、講講DNS解析過(guò)程?
詳細(xì)解析過(guò)程請(qǐng)看上文DNS域名解析過(guò)程,這里我們做一個(gè)總結(jié):
瀏覽器緩存—-->系統(tǒng)hosts文件—-->本地DNS解析器緩存—-->本地域名服務(wù)器(本地配置區(qū)域資源、本地域名服務(wù)器緩存)—-->根域名服務(wù)器—-->主域名服務(wù)器—-->下一級(jí)域名域名服務(wù)器 客戶端—-->本地域名服務(wù)器(遞歸查詢) 本地域名服務(wù)器-->DNS服務(wù)器的交互查詢是迭代查詢
來(lái)源:入門小站
推薦閱讀

