百度百科中的DNS介紹DNS介紹
DNS(Domain Name System,域名系統(tǒng)),萬維網(wǎng)上作為域名和ip地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù),能夠使用戶更方便的訪問互聯(lián)網(wǎng),而不用去記住能夠被機(jī)器直接讀取的ip數(shù)串。通過域名,最終得到該域名對(duì)應(yīng)的ip地址的過程叫做域名解析(或主機(jī)名解析)。DNS協(xié)議運(yùn)行在UDP協(xié)議之上,使用端口號(hào)53。在RFC文檔中RFC 2181對(duì)DNS有規(guī)范說明,RFC 2136對(duì)DNS的動(dòng)態(tài)更新進(jìn)行說明,RFC 2308對(duì)DNS查詢的反向緩存進(jìn)行說明。
DNS是什么
DNS是Domain Name System的簡(jiǎn)寫,中文翻譯過來就是域名系統(tǒng),是用來將主機(jī)名轉(zhuǎn)換為ip的。事實(shí)上,除了進(jìn)行主機(jī)名到IP地址的轉(zhuǎn)換外,DNS通常還提供主機(jī)名到以下幾項(xiàng)的轉(zhuǎn)換服務(wù):
1.主機(jī)命名(host aloasing)。有著復(fù)雜規(guī)范主機(jī)名的主機(jī)可能有一個(gè)或多個(gè)別名,通常規(guī)范主機(jī)名較復(fù)雜,而別名讓人更容易記憶。應(yīng)用程序可以調(diào)用DNS來獲得主機(jī)別名對(duì)應(yīng)的規(guī)范主機(jī)名,以及主機(jī)的IP地址。
2.郵件服務(wù)器別名(mail server aliasing)。DNS也能完成郵件服務(wù)器別名到其規(guī)范主機(jī)名以及ip地址的轉(zhuǎn)換。
3.負(fù)載均衡(load distribution)。DNS可用于冗余的服務(wù)器之間進(jìn)行負(fù)載均衡。一個(gè)繁忙的站點(diǎn),如abc.com,可能被冗余部署在多臺(tái)具有不同ip的服務(wù)器上。在該情況下,在DNS數(shù)據(jù)庫(kù)中,該主機(jī)名可能對(duì)應(yīng)著一個(gè)ip集合,但應(yīng)用程序調(diào)用DNS來獲取該主機(jī)名對(duì)應(yīng)的ip時(shí),DNS通過某種算法從該主機(jī)名對(duì)應(yīng)的ip集合中,挑選出某一ip進(jìn)行響應(yīng)。
DNS的作用
DNS是因特網(wǎng)的目錄服務(wù)
DNS是因特網(wǎng)的目錄服務(wù),它提供了主機(jī)名到ip地址映射的查詢服務(wù)。這種服務(wù)的起源之一是人和路由器的需求之間的矛盾,主機(jī)可以用主機(jī)名或ip地址標(biāo)識(shí),對(duì)我們?nèi)藖碚f我們很喜歡像taobao.com或者是baidu.com之類的由便于記憶的單詞組成的主機(jī)名,但對(duì)于路由器來說,它難以處理這種字母數(shù)字組成的主機(jī)名,而更能接受ip地址。所以DNS就是根據(jù)主機(jī)名查詢對(duì)應(yīng)的ip地址的服務(wù)。
當(dāng)然DNS的作用不僅于此。
DNS提供的具體服務(wù):
●提供了主機(jī)名到ip地址映射的查詢服務(wù)
●提供主機(jī)別名(host aliasing)服務(wù),有著復(fù)雜主機(jī)名的主機(jī)可以有一個(gè)或者多個(gè)別名,例如:aaa.xxx.com的主機(jī)可能還會(huì)有aaa.com和xxx.com兩個(gè)別名,在這種情況下,aaa.xxx.com叫做規(guī)范主機(jī)別名(canonical hostname)。主機(jī)別名的特征是比規(guī)范主機(jī)名更容易記憶,DNS可以提供根據(jù)主機(jī)別名獲取規(guī)范主機(jī)名的服務(wù)。
●提供負(fù)載分配服務(wù)(load distribution)。一般來說,被繁忙訪問的大型站點(diǎn)是分布在多臺(tái)服務(wù)器上的,這個(gè)時(shí)候,主機(jī)名和ip地址就不是一一對(duì)應(yīng)的關(guān)系,而是一個(gè)主機(jī)名對(duì)應(yīng)一個(gè)ip地址的集合。在大量的,連續(xù)的多次訪問中,DNS通過旋轉(zhuǎn)ip地址達(dá)到負(fù)載均衡的目的:在向這個(gè)主機(jī)名發(fā)出DNS請(qǐng)求的時(shí)候,服務(wù)器會(huì)用包含全部這些ip地址的報(bào)文進(jìn)行回答,但在每個(gè)不同的回答中會(huì)旋轉(zhuǎn)這些ip地址的擺放順序,而客戶機(jī)總向報(bào)文中排在最前面的ip地址發(fā)出請(qǐng)求。
DNS的性質(zhì)
從兩個(gè)層面上理解DNS:
第一,從協(xié)議的層面看,它是一種應(yīng)用層協(xié)議
第二,從實(shí)體的層面看,它是一個(gè)由分層的DNS服務(wù)器實(shí)現(xiàn)的分布式數(shù)據(jù)庫(kù)
DNS應(yīng)用層協(xié)議
DNS資源記錄
DNS服務(wù)器存儲(chǔ)的資源記錄(Resource Records,RRs),一條資源記錄(RR)記載著一個(gè)映射狀態(tài)。每條RR通常包含如下表所示的一些信息:
NAME和RDATA表示的含義根據(jù)TYPE的取值不同而不同,常見的:
1.若TYPE=A,則name是主機(jī)名,value是其對(duì)應(yīng)的ip;
2.若TYPE=NS,則name是一個(gè)域,value是一個(gè)權(quán)威DNS服務(wù)器的主機(jī)名。該記錄表示name域的域名解析將由value主機(jī)名對(duì)應(yīng)的DNS服務(wù)器來做;
3.若TYPE=CNAME,則value是別名為name的主機(jī)對(duì)應(yīng)的規(guī)范主機(jī)名;
4.若TYPE=MX,則value是別名為name的郵件服務(wù)器的規(guī)范主機(jī)名;
5......

整體及Header部分
DNS協(xié)議

Header部分是一定有的,長(zhǎng)度固定為12個(gè)字節(jié);其余4部分可能有也可能沒有,并且長(zhǎng)度也不一定,這個(gè)在Header部分中有指明。Header的結(jié)構(gòu)如下:

1.ID:占16位。該值由發(fā)出DNS請(qǐng)求的程序生成,DNS服務(wù)器在響應(yīng)時(shí)會(huì)使用該ID,這樣便于請(qǐng)求程序區(qū)分不同的DNS響應(yīng)。
2.QR:占1位。指示該消息是請(qǐng)求還是響應(yīng)。0表示請(qǐng)求;1表示響應(yīng)。
3.OPCODE:占4位。指示請(qǐng)求的類型,有請(qǐng)求發(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,截?cái)啵赫?位。指示消息是否因?yàn)閭鬏敶笮∠拗贫唤財(cái)唷?br>
6.RD(Recursion Desired,期望遞歸):占1位。該值在請(qǐng)求消息中被設(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,沒有錯(cuò)誤條件;
● 1:Format error,請(qǐng)求格式有誤,服務(wù)器無法解析請(qǐng)求;
● 2:Server failure,服務(wù)器出錯(cuò)。
● 3:Name Error,只在權(quán)威DNS服務(wù)器的響應(yīng)中有意義,表示請(qǐng)求中的域名不存在。
● 4:Not Implemented,服務(wù)器不支持該請(qǐng)求類型。
● 5:Refused,服務(wù)器拒絕執(zhí)行請(qǐng)求操作。
● 6~15:保留備用。
- QDCOUNT:占16位(無符號(hào))。指明Question部分的包含的實(shí)體數(shù)量。
- ANCOUNT:占16位(無符號(hào))。指明Answer部分的包含的RR(Resource Record)數(shù)量。
- NSCOUNT:占16位(無符號(hào))。指明Authority部分的包含的RR(Resource Record)數(shù)量。
- ARCOUNT:占16位(無符號(hào))。指明Additional部分的包含的RR(Resource Record)數(shù)量。
Answer、Authority、Additional部分
Answer、Authority、Additional部分格式一致,每部分都由若干實(shí)體組成,每個(gè)實(shí)體即為一條RR,格式如下圖所示:
- NAME:長(zhǎng)度不定,可能是真正的數(shù)據(jù),也有可能是指針(其值表示的是真正的數(shù)據(jù)在整個(gè)數(shù)據(jù)中的字節(jié)索引數(shù)),還有可能是二者的混合(以指針結(jié)尾)。若是真正的數(shù)據(jù),會(huì)以0x00結(jié)尾;若是指針,指針占2個(gè)字節(jié),第一個(gè)字節(jié)的高2位為11。
- TYPE:占2個(gè)字節(jié)。表示RR的類型,如A、CNAME、NS等,見以上RR介紹;
- CLASS:占2個(gè)字節(jié)。表示RR的分類,見以上RR介紹;
- TTL:占4個(gè)字節(jié)。表示RR生命周期,即RR緩存時(shí)長(zhǎng),單位是秒;
-
RDLENGTH:占2個(gè)字節(jié)。指定RDATA字段的字節(jié)數(shù);
用wireshark抓到的一個(gè)DNS包
RDATA:即之前介紹的value,含義與TYPE有關(guān),見以上RR介紹。
DNS協(xié)議是工作在應(yīng)用層的,運(yùn)輸層依賴的是UDP協(xié)議。
image.png
DNS的工作過程
當(dāng)我們?cè)谝慌_(tái)客戶端上通過瀏覽器訪問someschool.edu/index.html...
的時(shí)候,DNS的工作過程是這樣的:
1.在這臺(tái)用戶主機(jī)上運(yùn)行有DNS的客戶機(jī)
2.該瀏覽器從上述URL中抽取someschool.edu,發(fā)給本主機(jī)的DNS客戶機(jī)
3.DNS客戶機(jī)向DNS服務(wù)器發(fā)送一個(gè)包含主機(jī)名someschool.edu的請(qǐng)求
4.返回的響應(yīng)報(bào)文里包含有目的IP地址,由瀏覽器獲取并對(duì)該IP地址對(duì)應(yīng)的HTTP服務(wù)器發(fā)起一個(gè)TCP連接。
DNS服務(wù)器的層次和類別
DNS服務(wù)器是有層次的,它可以分為三種類型:根DNS服務(wù)器,頂級(jí)域(Top-Level Domain, TLD)DNS服務(wù)器和權(quán)威DNS服務(wù)器,分別對(duì)應(yīng)下面三個(gè)層次(從上至下)

根DNS服務(wù)器
因特網(wǎng)上有13個(gè)根DNS服務(wù)器, 其中大部分分布在北美洲,下面顯示的是2012年的根DNS服務(wù)器分布圖
頂級(jí)域DNS服務(wù)器
頂級(jí)域DNS服務(wù)器負(fù)責(zé)頂級(jí)域名,如com,org,edu和gov和所有國(guó)家的頂級(jí)域名如cn,uk,jp(edu教育機(jī)構(gòu)域名,gov政府部門域名,org非盈利性的組織,com企業(yè)域名)
權(quán)威DNS服務(wù)器
在因特網(wǎng)上具有公共可訪問的主機(jī)的每個(gè)組織機(jī)構(gòu)必須提供公共可訪問的DNS記錄,這些記錄將這些主機(jī)的名字映射為IP地址。
由組織機(jī)構(gòu)的權(quán)威DNS服務(wù)器保存這些DNS記錄,組織機(jī)構(gòu)可以選擇實(shí)現(xiàn)它自己的權(quán)威DNS服務(wù)器來保持這些記錄,或者通過支付費(fèi)用將這些記錄存儲(chǔ)在某個(gè)服務(wù)提供商的DNS服務(wù)器中。多數(shù)大學(xué)和大公司實(shí)現(xiàn)和維護(hù)它們自己基本的權(quán)威DNS服務(wù)器。
本地DNS服務(wù)器
還有一類比較重要的DNS服務(wù)器,叫做本地DNS服務(wù)器(local DNS server),它并不在上面說的DNS層次結(jié)構(gòu)中。
本地DNS服務(wù)器的作用
●主機(jī)和本地DNS服務(wù)器一般是相鄰的,當(dāng)主機(jī)發(fā)出DNS請(qǐng)求的時(shí)候,該請(qǐng)求會(huì)被發(fā)往本地DNS服務(wù)器,它起著代理的作用,并將該請(qǐng)求轉(zhuǎn)發(fā)到DNS服務(wù)器層次結(jié)構(gòu)中
●本地DNS服務(wù)器可以通過緩存主機(jī)名/IP地址,減少對(duì)相同主機(jī)名的查詢而消耗的時(shí)間,改善延時(shí)和性能。
DNS的工作機(jī)理
DNS從實(shí)體的角度上看,就是一個(gè)分布式的數(shù)據(jù)庫(kù),它實(shí)現(xiàn)關(guān)鍵數(shù)據(jù)的查詢和插入過程:
在DNS中查詢記錄
實(shí)際上,在DNS服務(wù)中,并不能通過對(duì)某個(gè)DNS服務(wù)器,通過僅僅一次的"請(qǐng)求/響應(yīng)"就取得主機(jī)名/IP地址的查詢結(jié)果。相反,需要多個(gè)不同的DNS服務(wù)器之間進(jìn)行多次交互才能獲取最終的查詢結(jié)果

如上圖所示例子,主機(jī)cis.poly.edu想知道主機(jī)gaia.cs.umass.edu的IP地址,并且主機(jī)gaia.cs.umass.edu的權(quán)威DNS服務(wù)器為dns.umass.edu。
則DNS查詢過程如下:
1.主機(jī)cis.poly.edu首先向它的本地DNS服務(wù)器dns.poly.edu發(fā)送一個(gè)DNS查詢報(bào)文,該查詢報(bào)文含有要求轉(zhuǎn)換的主機(jī)名gaia.cs.umass.edu
2.本地DNS服務(wù)器dns.poly.edu將該報(bào)文轉(zhuǎn)發(fā)至根DNS服務(wù)器。
3.該根DNS服務(wù)器注意到DNS服務(wù)器的edu前綴并向本地DNS服務(wù)器dns.poly.edu返回負(fù)責(zé)edu的頂級(jí)域DNS服務(wù)器的ip地址列表
4.本地DNS服務(wù)器接收到了返回的報(bào)文,根據(jù)報(bào)文中的IP地址,向該頂級(jí)域DNS服務(wù)器發(fā)送查詢報(bào)文
5.頂級(jí)域DNS服務(wù)器注意到了umass.edu前綴,用包含權(quán)威DNS服務(wù)器的IP地址進(jìn)行響應(yīng),該權(quán)威DNS服務(wù)器是負(fù)責(zé)馬薩諸塞大學(xué)的dns.umass.edu
6.本地DNS服務(wù)器直接向主機(jī)dns.umass.edu重發(fā)查詢報(bào)文
7.主機(jī)dns.umass.edu使用gaia.cs.umass.edu的IP地址作為響應(yīng),傳回給本地DNS服務(wù)器
8.最終,本地DNS服務(wù)器將包含最終結(jié)果的查詢報(bào)文轉(zhuǎn)發(fā)給請(qǐng)求主機(jī)http://cis.poly.edu
總共8份報(bào)文
可以看到,這8份報(bào)文由以下兩部分組成:
●請(qǐng)求主機(jī)和本地DNS服務(wù)器的請(qǐng)求/響應(yīng),共兩份報(bào)文
●本地DNS服務(wù)器和根DNS服務(wù)器,頂級(jí)域DNS服務(wù)器,權(quán)威DNS服務(wù)器的請(qǐng)求響應(yīng),共6份報(bào)文

DNS查詢方式
DNS查詢分為遞歸查詢和非遞歸查詢
所謂遞歸查詢是指接收請(qǐng)求的第一個(gè)域名服務(wù)器必須自始至終對(duì)請(qǐng)求進(jìn)行處理,或向其它域名服務(wù)器進(jìn)行請(qǐng)求且最終獲得授權(quán)數(shù)據(jù),并對(duì)請(qǐng)求進(jìn)行應(yīng)答。采用遞歸查詢時(shí),當(dāng)所請(qǐng)求的域名信息在自身緩沖區(qū)時(shí),域名服務(wù)器直接返回緩沖數(shù)據(jù)。此時(shí)遞歸查詢請(qǐng)求標(biāo)志無效。
所謂非遞歸查詢是指接收請(qǐng)求的第一個(gè)域名服務(wù)器可以返回可靠數(shù)據(jù)(本身有時(shí)),也可以返回指向其它服務(wù)器的指針(相當(dāng)于將查詢的接力棒傳給了最接近的域名服務(wù)器)。
主機(jī)的地址解析程序在查詢時(shí)可以指定是否用遞歸還是非遞歸查詢方式。非遞歸查詢方式與遞歸查詢方式相比響應(yīng)速度快。
