百度百科中的DNS介紹DNS介紹
DNS(Domain Name System,域名系統(tǒng)),萬維網(wǎng)上作為域名和ip地址相互映射的一個分布式數(shù)據(jù)庫,能夠使用戶更方便的訪問互聯(lián)網(wǎng),而不用去記住能夠被機器直接讀取的ip數(shù)串。通過域名,最終得到該域名對應(yīng)的ip地址的過程叫做域名解析(或主機名解析)。DNS協(xié)議運行在UDP協(xié)議之上,使用端口號53。在RFC文檔中RFC 2181對DNS有規(guī)范說明,RFC 2136對DNS的動態(tài)更新進行說明,RFC 2308對DNS查詢的反向緩存進行說明。
DNS是什么
DNS是Domain Name System的簡寫,中文翻譯過來就是域名系統(tǒng),是用來將主機名轉(zhuǎn)換為ip的。事實上,除了進行主機名到IP地址的轉(zhuǎn)換外,DNS通常還提供主機名到以下幾項的轉(zhuǎn)換服務(wù):
1.主機命名(host aloasing)。有著復(fù)雜規(guī)范主機名的主機可能有一個或多個別名,通常規(guī)范主機名較復(fù)雜,而別名讓人更容易記憶。應(yīng)用程序可以調(diào)用DNS來獲得主機別名對應(yīng)的規(guī)范主機名,以及主機的IP地址。
2.郵件服務(wù)器別名(mail server aliasing)。DNS也能完成郵件服務(wù)器別名到其規(guī)范主機名以及ip地址的轉(zhuǎn)換。
3.負(fù)載均衡(load distribution)。DNS可用于冗余的服務(wù)器之間進行負(fù)載均衡。一個繁忙的站點,如abc.com,可能被冗余部署在多臺具有不同ip的服務(wù)器上。在該情況下,在DNS數(shù)據(jù)庫中,該主機名可能對應(yīng)著一個ip集合,但應(yīng)用程序調(diào)用DNS來獲取該主機名對應(yīng)的ip時,DNS通過某種算法從該主機名對應(yīng)的ip集合中,挑選出某一ip進行響應(yīng)。
DNS的作用
DNS是因特網(wǎng)的目錄服務(wù)
DNS是因特網(wǎng)的目錄服務(wù),它提供了主機名到ip地址映射的查詢服務(wù)。這種服務(wù)的起源之一是人和路由器的需求之間的矛盾,主機可以用主機名或ip地址標(biāo)識,對我們?nèi)藖碚f我們很喜歡像taobao.com或者是baidu.com之類的由便于記憶的單詞組成的主機名,但對于路由器來說,它難以處理這種字母數(shù)字組成的主機名,而更能接受ip地址。所以DNS就是根據(jù)主機名查詢對應(yīng)的ip地址的服務(wù)。
當(dāng)然DNS的作用不僅于此。
DNS提供的具體服務(wù):
●提供了主機名到ip地址映射的查詢服務(wù)
●提供主機別名(host aliasing)服務(wù),有著復(fù)雜主機名的主機可以有一個或者多個別名,例如:aaa.xxx.com的主機可能還會有aaa.com和xxx.com兩個別名,在這種情況下,aaa.xxx.com叫做規(guī)范主機別名(canonical hostname)。主機別名的特征是比規(guī)范主機名更容易記憶,DNS可以提供根據(jù)主機別名獲取規(guī)范主機名的服務(wù)。
●提供負(fù)載分配服務(wù)(load distribution)。一般來說,被繁忙訪問的大型站點是分布在多臺服務(wù)器上的,這個時候,主機名和ip地址就不是一一對應(yīng)的關(guān)系,而是一個主機名對應(yīng)一個ip地址的集合。在大量的,連續(xù)的多次訪問中,DNS通過旋轉(zhuǎn)ip地址達到負(fù)載均衡的目的:在向這個主機名發(fā)出DNS請求的時候,服務(wù)器會用包含全部這些ip地址的報文進行回答,但在每個不同的回答中會旋轉(zhuǎn)這些ip地址的擺放順序,而客戶機總向報文中排在最前面的ip地址發(fā)出請求。
DNS的性質(zhì)
從兩個層面上理解DNS:
第一,從協(xié)議的層面看,它是一種應(yīng)用層協(xié)議
第二,從實體的層面看,它是一個由分層的DNS服務(wù)器實現(xiàn)的分布式數(shù)據(jù)庫
DNS應(yīng)用層協(xié)議
DNS資源記錄
DNS服務(wù)器存儲的資源記錄(Resource Records,RRs),一條資源記錄(RR)記載著一個映射狀態(tài)。每條RR通常包含如下表所示的一些信息:NAME和RDATA表示的含義根據(jù)TYPE的取值不同而不同,常見的:
1.若TYPE=A,則name是主機名,value是其對應(yīng)的ip;
2.若TYPE=NS,則name是一個域,value是一個權(quán)威DNS服務(wù)器的主機名。該記錄表示name域的域名解析將由value主機名對應(yīng)的DNS服務(wù)器來做;
3.若TYPE=CNAME,則value是別名為name的主機對應(yīng)的規(guī)范主機名;
4.若TYPE=MX,則value是別名為name的郵件服務(wù)器的規(guī)范主機名;
5......
整體及Header部分
DNS協(xié)議
Header部分是一定有的,長度固定為12個字節(jié);其余4部分可能有也可能沒有,并且長度也不一定,這個在Header部分中有指明。Header的結(jié)構(gòu)如下:
1.ID:占16位。該值由發(fā)出DNS請求的程序生成,DNS服務(wù)器在響應(yīng)時會使用該ID,這樣便于請求程序區(qū)分不同的DNS響應(yīng)。
2.QR:占1位。指示該消息是請求還是響應(yīng)。0表示請求;1表示響應(yīng)。
3.OPCODE:占4位。指示請求的類型,有請求發(fā)起者設(shè)定,響應(yīng)消息中復(fù)用該值。0表示標(biāo)準(zhǔn)查詢;1表示反轉(zhuǎn)查詢;2表示服務(wù)器狀態(tài)查詢。3~15目前保留,以備將來使用。
4.AA(Authoritative Answer,權(quán)威應(yīng)答):占1位。表示響應(yīng)的服務(wù)器是否是權(quán)威DNS服務(wù)器。只在響應(yīng)消息中有效。
5.TC(TrunCation,截斷):占1位。指示消息是否因為傳輸大小限制而被截斷。
6.RD(Recursion Desired,期望遞歸):占1位。該值在請求消息中被設(shè)置,響應(yīng)消息復(fù)用該值。如果被設(shè)置,表示希望服務(wù)器遞歸查詢。但服務(wù)器不一定支持遞歸查詢。
7.RA(Recursion Available,遞歸可用性):占1位。該值在響應(yīng)消息中被設(shè)置或被清除,以表明服務(wù)器是否支持遞歸查詢。
8.Z:占3位。保留備用。
9.RCODE(Response code):占4位。該值在響應(yīng)消息中被設(shè)置。取值及含義如下:
● 0:No error condition,沒有錯誤條件;
● 1:Format error,請求格式有誤,服務(wù)器無法解析請求;
● 2:Server failure,服務(wù)器出錯。
● 3:Name Error,只在權(quán)威DNS服務(wù)器的響應(yīng)中有意義,表示請求中的域名不存在。
● 4:Not Implemented,服務(wù)器不支持該請求類型。
● 5:Refused,服務(wù)器拒絕執(zhí)行請求操作。
● 6~15:保留備用。
- QDCOUNT:占16位(無符號)。指明Question部分的包含的實體數(shù)量。
- ANCOUNT:占16位(無符號)。指明Answer部分的包含的RR(Resource Record)數(shù)量。
- NSCOUNT:占16位(無符號)。指明Authority部分的包含的RR(Resource Record)數(shù)量。
- ARCOUNT:占16位(無符號)。指明Additional部分的包含的RR(Resource Record)數(shù)量。
Answer、Authority、Additional部分
Answer、Authority、Additional部分格式一致,每部分都由若干實體組成,每個實體即為一條RR,格式如下圖所示:- NAME:長度不定,可能是真正的數(shù)據(jù),也有可能是指針(其值表示的是真正的數(shù)據(jù)在整個數(shù)據(jù)中的字節(jié)索引數(shù)),還有可能是二者的混合(以指針結(jié)尾)。若是真正的數(shù)據(jù),會以0x00結(jié)尾;若是指針,指針占2個字節(jié),第一個字節(jié)的高2位為11。
- TYPE:占2個字節(jié)。表示RR的類型,如A、CNAME、NS等,見以上RR介紹;
- CLASS:占2個字節(jié)。表示RR的分類,見以上RR介紹;
- TTL:占4個字節(jié)。表示RR生命周期,即RR緩存時長,單位是秒;
-
RDLENGTH:占2個字節(jié)。指定RDATA字段的字節(jié)數(shù);
用wireshark抓到的一個DNS包
RDATA:即之前介紹的value,含義與TYPE有關(guān),見以上RR介紹。
DNS協(xié)議是工作在應(yīng)用層的,運輸層依賴的是UDP協(xié)議。
image.png
DNS的工作過程
當(dāng)我們在一臺客戶端上通過瀏覽器訪問someschool.edu/index.html...
的時候,DNS的工作過程是這樣的:
1.在這臺用戶主機上運行有DNS的客戶機
2.該瀏覽器從上述URL中抽取someschool.edu,發(fā)給本主機的DNS客戶機
3.DNS客戶機向DNS服務(wù)器發(fā)送一個包含主機名someschool.edu的請求
4.返回的響應(yīng)報文里包含有目的IP地址,由瀏覽器獲取并對該IP地址對應(yīng)的HTTP服務(wù)器發(fā)起一個TCP連接。
DNS服務(wù)器的層次和類別
DNS服務(wù)器是有層次的,它可以分為三種類型:根DNS服務(wù)器,頂級域(Top-Level Domain, TLD)DNS服務(wù)器和權(quán)威DNS服務(wù)器,分別對應(yīng)下面三個層次(從上至下)
根DNS服務(wù)器
因特網(wǎng)上有13個根DNS服務(wù)器, 其中大部分分布在北美洲,下面顯示的是2012年的根DNS服務(wù)器分布圖頂級域DNS服務(wù)器
頂級域DNS服務(wù)器負(fù)責(zé)頂級域名,如com,org,edu和gov和所有國家的頂級域名如cn,uk,jp(edu教育機構(gòu)域名,gov政府部門域名,org非盈利性的組織,com企業(yè)域名)
權(quán)威DNS服務(wù)器
在因特網(wǎng)上具有公共可訪問的主機的每個組織機構(gòu)必須提供公共可訪問的DNS記錄,這些記錄將這些主機的名字映射為IP地址。
由組織機構(gòu)的權(quán)威DNS服務(wù)器保存這些DNS記錄,組織機構(gòu)可以選擇實現(xiàn)它自己的權(quán)威DNS服務(wù)器來保持這些記錄,或者通過支付費用將這些記錄存儲在某個服務(wù)提供商的DNS服務(wù)器中。多數(shù)大學(xué)和大公司實現(xiàn)和維護它們自己基本的權(quán)威DNS服務(wù)器。
本地DNS服務(wù)器
還有一類比較重要的DNS服務(wù)器,叫做本地DNS服務(wù)器(local DNS server),它并不在上面說的DNS層次結(jié)構(gòu)中。
本地DNS服務(wù)器的作用
●主機和本地DNS服務(wù)器一般是相鄰的,當(dāng)主機發(fā)出DNS請求的時候,該請求會被發(fā)往本地DNS服務(wù)器,它起著代理的作用,并將該請求轉(zhuǎn)發(fā)到DNS服務(wù)器層次結(jié)構(gòu)中
●本地DNS服務(wù)器可以通過緩存主機名/IP地址,減少對相同主機名的查詢而消耗的時間,改善延時和性能。
DNS的工作機理
DNS從實體的角度上看,就是一個分布式的數(shù)據(jù)庫,它實現(xiàn)關(guān)鍵數(shù)據(jù)的查詢和插入過程:
在DNS中查詢記錄
實際上,在DNS服務(wù)中,并不能通過對某個DNS服務(wù)器,通過僅僅一次的"請求/響應(yīng)"就取得主機名/IP地址的查詢結(jié)果。相反,需要多個不同的DNS服務(wù)器之間進行多次交互才能獲取最終的查詢結(jié)果
如上圖所示例子,主機cis.poly.edu想知道主機gaia.cs.umass.edu的IP地址,并且主機gaia.cs.umass.edu的權(quán)威DNS服務(wù)器為dns.umass.edu。
則DNS查詢過程如下:
1.主機cis.poly.edu首先向它的本地DNS服務(wù)器dns.poly.edu發(fā)送一個DNS查詢報文,該查詢報文含有要求轉(zhuǎn)換的主機名gaia.cs.umass.edu
2.本地DNS服務(wù)器dns.poly.edu將該報文轉(zhuǎn)發(fā)至根DNS服務(wù)器。
3.該根DNS服務(wù)器注意到DNS服務(wù)器的edu前綴并向本地DNS服務(wù)器dns.poly.edu返回負(fù)責(zé)edu的頂級域DNS服務(wù)器的ip地址列表
4.本地DNS服務(wù)器接收到了返回的報文,根據(jù)報文中的IP地址,向該頂級域DNS服務(wù)器發(fā)送查詢報文
5.頂級域DNS服務(wù)器注意到了umass.edu前綴,用包含權(quán)威DNS服務(wù)器的IP地址進行響應(yīng),該權(quán)威DNS服務(wù)器是負(fù)責(zé)馬薩諸塞大學(xué)的dns.umass.edu
6.本地DNS服務(wù)器直接向主機dns.umass.edu重發(fā)查詢報文
7.主機dns.umass.edu使用gaia.cs.umass.edu的IP地址作為響應(yīng),傳回給本地DNS服務(wù)器
8.最終,本地DNS服務(wù)器將包含最終結(jié)果的查詢報文轉(zhuǎn)發(fā)給請求主機http://cis.poly.edu
總共8份報文
可以看到,這8份報文由以下兩部分組成:
●請求主機和本地DNS服務(wù)器的請求/響應(yīng),共兩份報文
●本地DNS服務(wù)器和根DNS服務(wù)器,頂級域DNS服務(wù)器,權(quán)威DNS服務(wù)器的請求響應(yīng),共6份報文
DNS查詢方式
DNS查詢分為遞歸查詢和非遞歸查詢
所謂遞歸查詢是指接收請求的第一個域名服務(wù)器必須自始至終對請求進行處理,或向其它域名服務(wù)器進行請求且最終獲得授權(quán)數(shù)據(jù),并對請求進行應(yīng)答。采用遞歸查詢時,當(dāng)所請求的域名信息在自身緩沖區(qū)時,域名服務(wù)器直接返回緩沖數(shù)據(jù)。此時遞歸查詢請求標(biāo)志無效。
所謂非遞歸查詢是指接收請求的第一個域名服務(wù)器可以返回可靠數(shù)據(jù)(本身有時),也可以返回指向其它服務(wù)器的指針(相當(dāng)于將查詢的接力棒傳給了最接近的域名服務(wù)器)。
主機的地址解析程序在查詢時可以指定是否用遞歸還是非遞歸查詢方式。非遞歸查詢方式與遞歸查詢方式相比響應(yīng)速度快。