? ??????“DNS”這個(gè)單字启具,想必那些經(jīng)常使用計(jì)算機(jī),尤其是經(jīng)常手動(dòng)配置IP和DNS服務(wù)器的人是非常熟悉的。也許其中的大部分人并沒(méi)有深入了解過(guò)它的具體意義规肴,只是對(duì)它有個(gè)簡(jiǎn)單的了解,然后習(xí)慣性地將主DNS服務(wù)器和備DNS服務(wù)器配置成 114.114.114.114 和 8.8.8.8?(因?yàn)楸容^好記憶~~)夜畴。
????????最近在做與路由器DNS功能相關(guān)的項(xiàng)目拖刃,所以就深入學(xué)習(xí)了下DNS的內(nèi)容。同時(shí)在這過(guò)程中贪绘,寫下一些文字兑牡,一方面是自己的一種總結(jié),另一方面也是希望通過(guò)這一個(gè)平臺(tái)税灌,跟其他人進(jìn)行交流提高均函。
什么是DNS亿虽?
? ? ? ? DNS?的全稱是 Domain Name System(域名系統(tǒng),或者常稱為域名解析系統(tǒng))苞也。
? ? ? ? 我們?cè)谏暇W(wǎng)的時(shí)候洛勉,經(jīng)常要通過(guò)瀏覽器去訪問(wèn)一些網(wǎng)站,實(shí)際上就是訪問(wèn)網(wǎng)站所在的服務(wù)器IP地址如迟,但是讓用戶記住設(shè)備的IP地址是非常困難的收毫。我們常用的方式就是在瀏覽器中輸入要訪問(wèn)的網(wǎng)址鏈接(例如 www.example.com),然后瀏覽器就會(huì)通過(guò)解析這個(gè)域名地址殷勘,找到要訪問(wèn)的服務(wù)器此再,從而讀取到需要訪問(wèn)的網(wǎng)站的數(shù)據(jù)。所以我們?cè)谝蛱鼐W(wǎng)上玲销,構(gòu)建了域名和IP地址互相映射的分布式數(shù)據(jù)庫(kù)输拇,在IP地址和域名之間形成一種轉(zhuǎn)換和查詢機(jī)制。
? ? ????所以贤斜,DNS工作的過(guò)程可以簡(jiǎn)單描述為:域名地址經(jīng)過(guò)DNS服務(wù)器解析后策吠,得到對(duì)應(yīng)的IP地址,通過(guò)該IP地址訪問(wèn)到服務(wù)器獲取我們要訪問(wèn)的內(nèi)容蠢古。
????????DNS通信主要使用UDP奴曙,TCP為輔,使用端口號(hào)53草讶。當(dāng)然洽糟,端口號(hào)可以修改,但是默認(rèn)是使用53端口堕战;在某些情況下坤溃,也會(huì)采用TCP協(xié)議。DNS是網(wǎng)絡(luò)分層里的應(yīng)用層協(xié)議嘱丢,事實(shí)上他是為其他應(yīng)用層協(xié)議工作的薪介。
????????如果上面通俗的解釋讓你理解了DNS是什么的話,那么再讀一讀下面比較官方的說(shuō)法越驻,也許你就能形成更加準(zhǔn)確的認(rèn)識(shí)汁政。
以下是百度百科對(duì)DNS的定義:
????????DNS(Domain Name System,域名系統(tǒng))缀旁,因特網(wǎng)上作為域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù)记劈,能夠使用戶更方便的訪問(wèn)互聯(lián)網(wǎng),而不用去記住能夠被機(jī)器直接讀取的IP數(shù)串并巍。通過(guò)主機(jī)名目木,最終得到該主機(jī)名對(duì)應(yīng)的IP地址的過(guò)程叫做域名解析(或主機(jī)名解析)。DNS協(xié)議運(yùn)行在UDP協(xié)議之上懊渡,使用端口號(hào)53刽射。在RFC文檔中RFC 2181對(duì)DNS有規(guī)范說(shuō)明军拟,RFC 2136對(duì)DNS的動(dòng)態(tài)更新進(jìn)行說(shuō)明,RFC 2308對(duì)DNS查詢的反向緩存進(jìn)行說(shuō)明誓禁。
以下是維基百科對(duì)DNS的定義:
????????The?Domain Name System?(DNS) is a?hierarchical?decentralized naming system for computers, services, or other resources connected to the?Internet?or a private network. It associates various information with?domain names?assigned to each of the participating entities. Most prominently, it translates more readily memorized domain names to the numerical?IP addresses?needed for locating and identifying computer services and devices with the underlying network protocols. By providing a worldwide, distributed?directory service, the Domain Name System is an essential component of the functionality on the Internet, that has been in use since 1985.
概念澄清
? ? ? ? 下面我們?cè)趯NS里面經(jīng)常涉及到的一些概念進(jìn)行說(shuō)明懈息。后面會(huì)有文章對(duì)其中的一些概念作詳細(xì)說(shuō)明。
域名:IP地址對(duì)應(yīng)的主機(jī)名现横。
label:域名由多個(gè)lable組成漓拾,label間常用符號(hào)"."連接。
DNS客戶端:局域網(wǎng)內(nèi)的用戶程序(例如Ping戒祠、Tracert)向DNS Client發(fā)出請(qǐng)求,本地設(shè)備收到請(qǐng)求報(bào)文后速种,會(huì)向DNS Server發(fā)送查詢報(bào)文姜盈。在收到DNS Server的應(yīng)答報(bào)文后,本地會(huì)對(duì)報(bào)文進(jìn)行解析配阵,并決定下一步的操作馏颂,從而完成一次域名解析過(guò)程。
DNS代理:(DNS proxy)用來(lái)在DNS Client和DNS Server之間轉(zhuǎn)發(fā)DNS請(qǐng)求和應(yīng)答報(bào)文棋傍。局域網(wǎng)內(nèi)的DNS Client把DNS proxy當(dāng)作DNS Server救拉,將DNS請(qǐng)求報(bào)文發(fā)送給DNS proxy。DNS proxy將該請(qǐng)求報(bào)文轉(zhuǎn)發(fā)給真正的DNS Server瘫拣,并將DNS Server的應(yīng)答報(bào)文發(fā)送給DNS Client亿絮,從而實(shí)現(xiàn)域名解析。使用代理功能后麸拄,當(dāng)DNS Server的地址發(fā)生變化時(shí)派昧,只需要改變DNS proxy上的配置,無(wú)需改變整個(gè)局域網(wǎng)內(nèi)每個(gè)DNS Client的配置拢切,從而簡(jiǎn)化了網(wǎng)絡(luò)管理蒂萎。?
DNS透明代理:可以修改部分DNS請(qǐng)求報(bào)文的目的地址,將其修改為其他ISP內(nèi)的DNS服務(wù)器地址淮椰,DNS請(qǐng)求被轉(zhuǎn)發(fā)到不同的ISP五慈,解析后的Web服務(wù)器地址也就屬于不同的ISP,所有上網(wǎng)流量將通過(guò)不同的ISP鏈路轉(zhuǎn)發(fā)主穗。這樣就不會(huì)造成一個(gè)鏈路擁塞泻拦、其他鏈路卻閑置的情況,充分利用了所有鏈路資源黔牵。
DDNS:(Dynamic Domain Name System動(dòng)態(tài)域名系統(tǒng))DNS僅提供了域名和IP地址之間的靜態(tài)對(duì)應(yīng)關(guān)系聪轿,當(dāng)節(jié)點(diǎn)的IP地址發(fā)生變化時(shí),DNS無(wú)法動(dòng)態(tài)地更新域名和IP地址的對(duì)應(yīng)關(guān)系猾浦。DDNS通過(guò)動(dòng)態(tài)更新DNS服務(wù)器上域名和IP地址之間的對(duì)應(yīng)關(guān)系陆错,保證通過(guò)域名解析后得到正確的IP地址灯抛。
DNS64:將DNS查詢信息中的A記錄(ipv4地址)合成到AAAA記錄(ipv6地址)中,返回合成的AAAA記錄給ipv6側(cè)用戶音瓷。
細(xì)粒度訂閱:發(fā)布端(Subscriber)提供按需的數(shù)據(jù)發(fā)布機(jī)制对嚼,訂閱端只需要訂閱其關(guān)系的數(shù)據(jù),一旦訂閱的數(shù)據(jù)發(fā)生變化绳慎,發(fā)布者將相關(guān)數(shù)據(jù)實(shí)時(shí)發(fā)布到相關(guān)的訂閱端纵竖。
從域名到IP地址的解析過(guò)程
????????當(dāng)一個(gè)應(yīng)用需要把主機(jī)名解析為IP地址時(shí),該應(yīng)用進(jìn)程就調(diào)用地址解析程序杏愤,它自己就變?yōu)榱薉NS的一個(gè)客戶靡砌,把待解析的域名放在DNS請(qǐng)求報(bào)文中,以UDP方式先發(fā)給本地域名服務(wù)器珊楼,本地域名服務(wù)器在查找域名后通殃,把對(duì)應(yīng)的IP地址放在回答報(bào)文中返回,應(yīng)用程序獲得目的主機(jī)的IP地址后即可進(jìn)行通信厕宗。若本地域名服務(wù)器不能回答該請(qǐng)求画舌,則此域名服務(wù)器就暫時(shí)稱為DNS的另一個(gè)客戶,并向其他域名服務(wù)器發(fā)出查詢請(qǐng)求已慢。這種過(guò)程直至找到能夠回答該請(qǐng)求的域名服務(wù)器為止曲聂。
????????當(dāng)一個(gè)業(yè)務(wù)需要把域名解析為IP地址時(shí),它就成為了DNS的一個(gè)客戶端佑惠,調(diào)用地址解析程序朋腋,把待解析的域名加入到DNS請(qǐng)求報(bào)文中,通過(guò)UDP先發(fā)送給本地DNS服務(wù)器兢仰。本地DNS服務(wù)器查找得到對(duì)應(yīng)的IP地址后乍丈,通過(guò)回應(yīng)報(bào)文將該IP返回,客戶端獲得該IP地址后可繼續(xù)后續(xù)操作把将。如果本地域名服務(wù)器不能回答該請(qǐng)求轻专,則自身會(huì)稱為一個(gè)新的DNS客戶端,向其他DNS服務(wù)器發(fā)送請(qǐng)求報(bào)文察蹲。這個(gè)過(guò)程一直重復(fù)请垛,直至得到回應(yīng)報(bào)文為止。
主機(jī)?------>?本地域名服務(wù)器:一般都是采用遞歸查詢
????????如果主機(jī)所詢問(wèn)的本地域名服務(wù)器不知道被查詢的域名的IP地址洽议,那么本地域名服務(wù)器就以DNS客戶端的身份(遞歸思想)宗收,向根域名服務(wù)器繼續(xù)發(fā)出查詢報(bào)文(替主機(jī)查詢),不讓主機(jī)自己進(jìn)行查詢亚兄。遞歸查詢返回的結(jié)果或者是IP混稽,或者報(bào)錯(cuò)。這是從上到下的遞歸查詢過(guò)程。
本地域名服務(wù)器?------>?根域名服務(wù)器:一般采用迭代查詢
????????當(dāng)根域名服務(wù)器收到本地域名服務(wù)器的查詢請(qǐng)求匈勋,要么給出ip礼旅,要么通知本地域名服務(wù)器下一步應(yīng)該去請(qǐng)求哪一個(gè)頂級(jí)域名服務(wù)器查詢(并告知本地域名服務(wù)器自己知道的頂級(jí)域名的IP),讓本地域名服務(wù)器繼續(xù)查詢洽洁,而不是替他查詢痘系。同理,頂級(jí)域名服務(wù)器無(wú)法返回IP的時(shí)候饿自,也會(huì)通知本地域名服務(wù)器下一步向誰(shuí)查詢(查詢哪一個(gè)權(quán)限域名服務(wù)器)……這是一個(gè)迭代過(guò)程汰翠。
DNS緩存
????????實(shí)際使用中,DNS服務(wù)器會(huì)將接收到的DNS應(yīng)答結(jié)果在本地緩存一段時(shí)間昭雌,直到數(shù)據(jù)老化才刪除复唤。當(dāng)出現(xiàn)對(duì)相同域名的查詢時(shí),便可以通過(guò)緩存的結(jié)果直接進(jìn)行回復(fù)烛卧,只有在本地緩存中找不到時(shí)才向DNS服務(wù)器發(fā)起查詢請(qǐng)求苟穆。通過(guò)DNS緩存,大部分查詢都只需要本地DNS服務(wù)器即可完成解析唱星,可以提高效率。
從IP地址到域名的解析過(guò)程
????????當(dāng)在瀏覽器內(nèi)輸入U(xiǎn)RL時(shí)跟磨,便開(kāi)始了DNS解析過(guò)程间聊,最后會(huì)把找到后的IP地址告知瀏覽器客戶端,方便它繼續(xù)發(fā)出 HTTP(s)請(qǐng)求抵拘。在這個(gè)過(guò)程中哎榴,瀏覽器提出的查詢記錄類型叫A記錄(address)查詢,主要是針對(duì)ipv4僵蛛,如果是ipv6的化尚蝌,就是AAAA。這個(gè)A記錄意思是從域名解析得到IP地址充尉。那么反過(guò)來(lái),從IP地址得到域名的解析過(guò)程也需要一個(gè)記錄姿鸿,叫PTR記錄(和A記錄功能相反)苛预。我們可以通過(guò)查詢IP地址的PTR記錄來(lái)得到該IP地址指向的域名笋熬,達(dá)到反查的目的。
????????域名系統(tǒng)中昔馋,一個(gè)IP地址可對(duì)應(yīng)多個(gè)域名绒极,在Internet上是不會(huì)去傻傻的遍歷整個(gè)域名樹(shù)的。故DNS的頂級(jí)域名提供了一個(gè)特別的頂級(jí)域——arpa用來(lái)做反向域名解析榔袋,也稱為反向域名铡俐。當(dāng)一個(gè)主機(jī)加入網(wǎng)絡(luò)审丘,獲得DNS授權(quán),它的IP地址假設(shè)為33.13.252.140锅知,它也順便獲得了對(duì)應(yīng)IP地址的 in-addr.arpa (逆向解析域in-addr.arpa)空間的授權(quán)售睹,注意DNS名由樹(shù)底部向上組織可训,故它的DNS名字為33.13.252.140.in-addr.arpa。IP地址的第一字節(jié)一定位于in-addr的下一級(jí)飞崖。這樣把待解析的IP地址就會(huì)被表達(dá)成一種像域名一樣的形式固歪,后綴以反向解析域名"in-addr.arpa"結(jié)尾昼牛。這就是反向域名解析的本質(zhì)康聂。
DNS報(bào)文的格式
實(shí)際上網(wǎng)時(shí)域名的解析過(guò)程
? ? ? ? 1. 當(dāng)用戶在地址欄輸入一個(gè)URL之后伶椿,瀏覽器首先查詢?yōu)g覽器的緩存;
? ? ? ? 2. 找不到就去查詢Hosts文件和本地DNS緩存导狡,如果hosts和本地DNS緩存都沒(méi)有找到域名對(duì)應(yīng)的IP,則自動(dòng)進(jìn)入路由器的緩存中檢查旱捧;
? ? ? ? 3. 以上均為客戶端DNS緩存枚赡,若在客戶端DNS緩存還是沒(méi)找到贫橙,則進(jìn)入ISP DNS緩存中查詢卢肃;
? ? ? ? 4. 還是找不到,最終才向根DNS 服務(wù)器發(fā)出 DNS 查詢報(bào)文莫湘,再找不到就報(bào)錯(cuò)逊脯。
面試會(huì)提到的相關(guān)問(wèn)題
1. DNS 是基于 TCP 還是 UDP 的竣贪?端口號(hào)是多少演怎?
2. 打開(kāi)一個(gè)URL爷耀,在網(wǎng)絡(luò)層面都發(fā)生了哪些事情拍皮?(當(dāng)中說(shuō)到了DNS原理,這個(gè)是繞不過(guò)的)
3. 什么是DNS劫持咆耿?