網(wǎng)絡(luò)協(xié)議之:Domain name service DNS詳解
時間:2023-02-02 13:56:01 | 來源:建站知識
時間:2023-02-02 13:56:01 來源:建站知識
簡介
現(xiàn)在是互聯(lián)網(wǎng)的世界,大家從各種網(wǎng)站中獲取各類資源和信息,通常我們只需要牢記一個網(wǎng)站地址即可,至于這個網(wǎng)站后臺的服務(wù)器在什么地方,我們并不需要關(guān)心。當(dāng)我們的請求指向這個網(wǎng)址之后,接下來就只需要等待請求被轉(zhuǎn)發(fā)到該網(wǎng)址的后端服務(wù)器上,得到返回的處理結(jié)果即可。
這個將網(wǎng)站名稱解析成為服務(wù)IP地址的服務(wù)就是DNS服務(wù),它的全稱是Domain Name System,也就是域名解析服務(wù)。
那么DNS到底是怎么工作的呢?
有聰明的小伙伴可能會說了,那還不簡單,搞一個統(tǒng)一的服務(wù)器,把世界上所有的域名對應(yīng)的IP都存起來,每次需要解析的時候從這個服務(wù)去取就行了。確實(shí),在互聯(lián)網(wǎng)的初期就是這么干的,那時候網(wǎng)站還不多,域名維護(hù)的成本還不高,并且最開始還沒有域名系統(tǒng)。
作為互聯(lián)網(wǎng)的技術(shù)基礎(chǔ)的ARPANET(The Advanced Research Projects Agency Network)是第一個具有分布式控制的廣域分組交換網(wǎng)絡(luò),也是最早應(yīng)用 TCP/IP 協(xié)議的網(wǎng)絡(luò)設(shè)施。
在ARPANET網(wǎng)絡(luò)中,每個主機(jī)都有一個數(shù)字地址,但是這個數(shù)字地址明顯是反人類記憶模式的,所以科學(xué)家們希望能夠給這些主機(jī)起一些好記的名字,那么就需要維護(hù)這些名字和主機(jī)之間的映射關(guān)系,在這個時候斯坦福研究所(現(xiàn)在被稱為SRI International)接下了這個任務(wù),他們維護(hù)了一個HOSTS.TXT 的文本文件,在這個文件中描述了主機(jī)地址和主機(jī)名字之間的映射關(guān)系。
如果有人想要更新這個HOST文件,那么需要在工作時間打電話給SRI網(wǎng)絡(luò)信息中心,由信息中心的工作人員將主機(jī)名和地址添加到HOSTS.TXT文件中。當(dāng)然這樣的操作對少量的數(shù)據(jù)更新來說還可以,但是如果數(shù)據(jù)量太大的情況下就有問題了。
后面一個叫做Elizabeth Feinler的人在SRI網(wǎng)絡(luò)信息中心的基礎(chǔ)上搭建了WHOIS目錄,用于檢索有關(guān)資源、聯(lián)系人和實(shí)體的信息,并且提出了域名的概念.
最開始的維護(hù)都是在一個單一的服務(wù)器上進(jìn)行集中式管理,但是這種維護(hù)方式已經(jīng)不能夠滿足日益增長的網(wǎng)絡(luò)需求,于是在1983年P(guān)aul Mockapetris在南加州大學(xué)創(chuàng)建了DNS系統(tǒng),并在1983年11月于RFC 882 和 RFC 883發(fā)布了相關(guān)的原始規(guī)范。
后面DNS經(jīng)過一系列的發(fā)展,于1987年11月,RFC 1034和 RFC 1035取代了1983年的DNS規(guī)范。
DNS的功能
前面我們也提過了,DNS最基本的作用就是將用戶提供的域名轉(zhuǎn)換成為服務(wù)器的地址。
比如我們現(xiàn)在有個域名叫做www.flydean.com,它對應(yīng)的服務(wù)器IPv4地址是42.138.111.201,對應(yīng)的IPv6地址是fe40::1024:ff:fe10:123f,DNS要做的工作就是將
http://www.flydean.com根據(jù)需要快速的轉(zhuǎn)換成為IPv4或者IPv6地址。這是DNS的第一個功能也是最重要的功能:提供域名的解析服務(wù)。
另外,在具體的應(yīng)用場景中,域名背后對應(yīng)的服務(wù)器IP可能是會變化的,那么就需要DNS有快速更新的功能,可以快速反映網(wǎng)絡(luò)的變化情況,而不影響具體用戶的訪問。
這種操作對用用戶來說是友好的,因?yàn)橛脩舨恍枰赖讓臃?wù)器的變化,他們只需要知道要訪問的域名即可。
最后,現(xiàn)代的網(wǎng)絡(luò)應(yīng)用一般都是分布式的,可能會有多個工作節(jié)點(diǎn),不同的工作節(jié)點(diǎn)可能會被部署在不同的地方。用戶在訪問一個域名的時候,為了提升訪問速度,應(yīng)該優(yōu)先訪問離用戶最近的那個節(jié)點(diǎn)。這時候DNS又承擔(dān)了優(yōu)化網(wǎng)絡(luò)訪問的任務(wù),它負(fù)責(zé)向用戶提供最近的服務(wù)器節(jié)點(diǎn),所以在現(xiàn)代網(wǎng)絡(luò)架構(gòu)中,DNS的作用越來越大。
DNS的組成
講解完DNS的功能之后,讓我們來看看DNS的組成,作為一個域名服務(wù),DNS是由域名空間和Name servers兩部分組成的。
域名空間描述的是域名的結(jié)構(gòu)和命令規(guī)則,而Name servers則是對域名進(jìn)行解析的服務(wù)。接下來我們分別進(jìn)行講解。
域名空間Domain name space
域名空間,也叫做Domain name space,它是所有域名的集合。下面是維基百科上的域名空間的示意圖:
從上圖可以看出,域名空間其實(shí)是一個樹形結(jié)構(gòu),每個節(jié)點(diǎn)或者葉子節(jié)點(diǎn)都有一個label和RR(esource records記載著和域名相關(guān)的有用信息),域名本身由label組成,右邊是其父節(jié)點(diǎn)的名稱,用點(diǎn)分隔。
域名空間可以被劃分為多個子空間,每個子空間可以單獨(dú)進(jìn)行管理,這樣的子空間叫做一個域(zone)。
每個DNS域又可以被劃分為一個域,也可能包含許多域和子域,具體取決于域管理器的管理選擇。
大家對域名都很熟悉了,但是大家可能不是很明白域名的構(gòu)成。
事實(shí)上域名是由label組成的,各個label是以點(diǎn)連接起來的,比如:
http://www.flydean.com。
每個label都可以看做是域的一個層級,最右邊是頂級域名com,左邊的是右邊域名的子域名,比如flydean是com的子域名,www是
http://flydean.com的子域名,以此類推,總共可以有127個層級結(jié)構(gòu)。
每個label可以包含0到63個字符,總共的域名長度不能超過253個字符。為什么是253個字符而不是255個字符呢?那是因?yàn)橛?個字符是用來存儲長度值的。
一般來說域名的標(biāo)簽是以ASCII字符表示的,通常使用a-z,A-Z,0-9和連字符來表示,這種規(guī)則簡稱為LDH(letters, digits, hyphen)規(guī)則。
在域名中,字符串是大小寫不敏感的,這就意味著
http://www.flydean.com和
http://WWW.FLYDEAN.COM是等價的。
注意,標(biāo)簽不能以連字符開頭或者結(jié)尾,并且頂級域名不能全為數(shù)字。
有朋友可能會問了,不對呀,為什么我聽過中文域名呢?
這是因?yàn)闉榱私鉀Q域名只能使用ASCII編碼的問題,ICANN通過了一個叫做IDNA國際化域名的系統(tǒng),通過這個系統(tǒng),用戶應(yīng)用程序(例如Web瀏覽器)可以使用Punycode將Unicode字符串映射到有效的DNS字符集。
什么是Punycode呢?Punycode是一種使用ASCII字符集來表示Unicode的編碼方式。感興趣的同學(xué)可以自行探索,這里就不細(xì)講了。
Name servers
name servers也被稱為名稱服務(wù)器,是用來解析域名的服務(wù)器。名稱服務(wù)器是一種客戶端-服務(wù)器的架構(gòu),每個名稱服務(wù)器用于發(fā)布有關(guān)該域的信息以及管理從屬于它的任何域的名稱服務(wù)器。
這樣的名稱管理器就構(gòu)成了層級結(jié)構(gòu)。為了提升域名解析的效率,通常會需要使用緩存來存儲域名和服務(wù)器地址的對應(yīng)關(guān)系,但是有時候我們需要時效性更高的場景和服務(wù),于是出現(xiàn)了一種特殊的名稱服務(wù)器,這種服務(wù)器叫做權(quán)威名稱服務(wù)器。
為什么叫權(quán)威名稱服務(wù)器呢?這是因?yàn)闄?quán)威名稱服務(wù)器僅從由原始來源配置的數(shù)據(jù)中給出DNS查詢的答案,而不是通過對另一個名稱服務(wù)器的查詢獲得的結(jié)果。它是域名服務(wù)器查詢中的最后一站,如果權(quán)威名稱服務(wù)器中保存有請求的記錄,則其會將已請求主機(jī)名的IP地址返回到發(fā)出初始請求的DNS解析器.
DNS的工作流程
上面講了那么多概念性的東西,大家可能會有些懵。 沒關(guān)系,這里我們舉一個具體的例子來觀察一下DNS查詢的整個流程。
假如用戶在瀏覽器中輸入
http://www.flydean.com想訪問這個網(wǎng)站,因?yàn)橛脩糨斎氲氖且粋€域名,所以需要將域名解析成為IP地址,從而發(fā)送后續(xù)的數(shù)據(jù)請求包。
因?yàn)镈NS本身是一個名稱服務(wù),所以需要一個客戶端來請求DNS,這個客戶端就叫做DNS解析器。
一般來說DNS解析器是嵌入在瀏覽器中的,當(dāng)用戶輸入URL來訪問網(wǎng)絡(luò)資源的時候,瀏覽器會自動調(diào)用DNS解析器去對這個URL進(jìn)行解析。
那么域名解析的第一站是哪里呢?域名解析的第一站就是根服務(wù)器,也叫root服務(wù)器。
域名解析的請求由root服務(wù)器首先響應(yīng),但是root服務(wù)器并不會直接返回用戶要解析的域名地址,而是根據(jù)用戶訪問的域名中的頂級域名的不同,返回頂級域名服務(wù)器(TLD)的地址。
比如這里我們要訪問的定義域名是.com,那么root服務(wù)器會返回.com的頂級域名服務(wù)器的地址。
root服務(wù)器有多少個呢?世界上的root服務(wù)器IP地址只有13個,這是由于早期技術(shù)原因的限制導(dǎo)致的。這13個root服務(wù)器的IP地址中,1個為主root地址,這個地址是由ICANN負(fù)責(zé)管理的,其他12地址中9個在美國,2個在歐洲,1個在日本。
雖然root根服務(wù)器IP只有13個,但是基于這13個IP地址構(gòu)建了一個服務(wù)器集群,可以有效的保證根服務(wù)器的運(yùn)行穩(wěn)定性。從而不至于出現(xiàn)根服務(wù)器不能訪問導(dǎo)致的大規(guī)模網(wǎng)絡(luò)錯誤。
回到我們的解析過程,root服務(wù)器把.com頂級域名服務(wù)器的地址返回給了DNS解析器,DNS解析會再次向.com TLD發(fā)起解析查詢。
.com TLD會再次返回
http://flydean.com的域名服務(wù)器地址給DNS解析器。
DNS解析器再次發(fā)送請求給
http://flydean.com的域名服務(wù)器,這里的域名服務(wù)器是一個權(quán)威域名服務(wù)器,因?yàn)檫@里是域名解析的最后一站,存放著域名的真實(shí)IP地址,權(quán)威域名服務(wù)器經(jīng)過查詢得到
http://www.flydean.com的真實(shí)IP地址,并返回給DNS解析器。
最后DNS解析器將這個IP地址返回給瀏覽器,供后續(xù)的瀏覽請求使用。
可以看到DNS解析是一個不斷遞歸解析的過程,所以這樣的解析器又被稱為DNS遞歸解析器。
從上面的流程可以看到,每次域名的請求都需要經(jīng)過root域名服務(wù)器,那么這樣root域名服務(wù)器的壓力會很大,為了解決這個問題,事實(shí)上我們在使用的過程中引入了DNS緩存。
緩存的目的就是將DNS數(shù)據(jù)放到離自己最近的地方,從而提示數(shù)據(jù)的處理速度和展示效率。
常見的DNS緩存有瀏覽器緩存和操作系統(tǒng)DNS緩存。
瀏覽器緩存就是由瀏覽器負(fù)責(zé)維護(hù)的DNS緩存,而操作系統(tǒng)DNS緩存是操作系統(tǒng)級的DNS緩存。
如果這兩個緩存都不存在的話,那么本地的DNS客戶端會將DNS查詢發(fā)生到ISP(Internet 服務(wù)提供商)內(nèi)部的DNS遞歸解析器,對于ISP來說,它也會存在DNS緩存,所以如果新增一個域名或者更改一個IP地址,并不是馬上生效的,而是需要等待一定的時間來讓緩存失效或者緩存刷新。
DNS資源記錄
前面我們提到了DNS命名空間中每個節(jié)點(diǎn)都是有l(wèi)abel和resource records (RR)組成的,RR存儲著資源的描述信息,會在收到DNS查詢之后返回。
DNS RR是由一條條的record構(gòu)成的,下面是一條record的結(jié)構(gòu):
其中NAME是樹中節(jié)點(diǎn)的完全限定域名。
TYPE是記錄類型。它表示數(shù)據(jù)的格式和用途,比如A表示用于將域名轉(zhuǎn)換為IPv4地址,NS表示列出了哪些名稱服務(wù)器可以響應(yīng)DNS的域查找,MX表示指定用于處理指定域的郵件的郵件服務(wù)器在電子郵件地址中。
RDATA是特定類型相關(guān)的數(shù)據(jù),例如地址記錄的IP地址,或MX記錄的優(yōu)先級和主機(jī)名。
DNS消息的結(jié)構(gòu)
既然有DNS查詢,那么就會有DNS查詢的消息結(jié)構(gòu),DNS消息可以分為兩種,分別是查詢消息和回復(fù)消息。
每一個message都包含了一個消息頭和四個其他部分:question, answer, authority和額外空間。
header負(fù)責(zé)控制其他的4個部分,header包含了這樣幾個字段: Identification, Flags, Number of questions, Number of answers, Number of authority resource records (RRs)和 Number of additional RRs, 如下表所示:
整個頭的標(biāo)記字段長度是16bits,緊跟著4個16bits,分別表示4個其他部分的長度。
總結(jié)
以上就是DNS的結(jié)構(gòu)和DNS工作的基本流程。
關(guān)鍵詞:協(xié)議,網(wǎng)絡(luò)