前言
DNS身為TCP/IP協(xié)議族的“高層”(第7層,頂層),專職互聯(lián)網(wǎng)的翻譯任務(wù),是一位出色的“翻譯官”。本文將和大家一起接近、了解這位我們每天都要接觸多次的翻譯專家。
基本概念
DNS(Domain Name System):域名系統(tǒng),DNS其實(shí)就是一個(gè)分布式的數(shù)據(jù)庫系統(tǒng),它主要的功能是提供主機(jī)名和IP地址之間的轉(zhuǎn)換功能。我們每天在瀏覽器上輸入的網(wǎng)址,比如www.jianshu.com,當(dāng)你敲擊回車時(shí),就開始使用DNS服務(wù)了。最早,在DNS還沒被發(fā)明之現(xiàn),所有的地址都由一個(gè)中樞主機(jī)名進(jìn)行管理,在那個(gè)“上古”時(shí)代,因?yàn)榫W(wǎng)站十分的稀少,管理難度還可以操控,但隨著互聯(lián)網(wǎng)的野蠻式發(fā)展,網(wǎng)站數(shù)量驟增,這種中央工作模式開始暴露出響應(yīng)慢、安全性等一系列的問題,DNS適時(shí)的出現(xiàn)了。
DNS是如何工作的
我們還是用例子來說明。
172.27.0.14是筆者的主機(jī)(簡(jiǎn)稱A),183.60.83.19是筆者網(wǎng)絡(luò)運(yùn)營(yíng)商的DNS服務(wù)器(簡(jiǎn)稱B)。
首先A主機(jī)發(fā)出了需要訪問www.jianshu.com的請(qǐng)求,但這個(gè)域名,在系統(tǒng)內(nèi)部要本不知道你要訪問什么,TCP/IP協(xié)議只認(rèn)IP地址,就像人臉識(shí)別一樣,換個(gè)人就會(huì)識(shí)別錯(cuò)誤。此時(shí)就需要一個(gè)稱職的翻譯官,將適合人記錄的域名翻譯成IP地址。這時(shí)候DNS進(jìn)場(chǎng)了。
DNS首先會(huì)查找本機(jī)有無對(duì)應(yīng)的DNS記錄,windows系統(tǒng)會(huì)通過windowssystem32driversetchosts文件查找,Linux會(huì)通過/etc/hosts文件查找。
host記錄的格式如上,分為2個(gè)部分,前半部分是IP地址,后半部分是對(duì)應(yīng)的域名。
如果host找不到記錄,就會(huì)先發(fā)送DNS查詢請(qǐng)求到指定的DNS服務(wù)器(這也就是為什么你的電腦為何必須指明DNS服務(wù)器地址的原因)。我們來看2條報(bào)文。
此時(shí)A通過54889端口(臨時(shí)端口,使用UDP協(xié)議,如果你不清楚UDP協(xié)議是什么,請(qǐng)參考我的另一篇文檔TCP和UDP,你要知道的123 (UDP篇)),和B主機(jī)的53端口通信,第1條報(bào)文是A主機(jī)發(fā)向B主機(jī),+號(hào)表示遞歸查詢,A表示查詢類型,意思是需要查詢IP地址,?表示這是一條查詢報(bào)文。www.jianshu.com表示要查詢的域名,33表示字節(jié),UDP的首部長(zhǎng)度是12個(gè)字節(jié),域名長(zhǎng)度為17個(gè)字節(jié),查詢類型和類占4個(gè)字節(jié)。
image.png
簡(jiǎn)單解釋下域名長(zhǎng)度為何是17個(gè)字節(jié),以小數(shù)點(diǎn)為分隔單位,第1個(gè)3表示www占3個(gè)字節(jié),第2個(gè)7表示jianshu占7個(gè)字節(jié),第3個(gè)3表示com占3個(gè)字節(jié),最后一個(gè)置0,表示后域名結(jié)束。
現(xiàn)在來看第2條報(bào)文,這是B服務(wù)器的響應(yīng)報(bào)文,3/0/0表示返回了3資源記錄(Resource Record),第2個(gè)0表示返回0條授權(quán)回答,第3個(gè)0表示返回了0條附加記錄(一般都是0)。第1條資源記錄類型為CNAME(域名規(guī)范名稱),第2條就是A記錄,表示返回對(duì)應(yīng)CNAME的IP地址,第3條也是A記錄返回的是該域名的另一個(gè)IP地址。有時(shí)候甚至可能返回N條A記錄,這是因?yàn)槭褂昧素?fù)載均衡技術(shù),目的是增加服務(wù)提供的可靠性和并發(fā)處理能力。此時(shí)DNS系統(tǒng)已經(jīng)拿到了www.jianshu.com對(duì)應(yīng)IP地址記錄,即完成了翻譯任務(wù),并將其返回給系統(tǒng),系統(tǒng)拿到了IP地址,將訪問網(wǎng)頁的請(qǐng)求進(jìn)行打包封裝,并指定報(bào)文的目的地址為剛剛獲取到的域名對(duì)應(yīng)IP地址,數(shù)據(jù)就順利的發(fā)送到目的主機(jī)了。
至于DNS服務(wù)器是如何查詢到域名IP地址的,和前面提到的遞歸查詢有關(guān),后續(xù)有機(jī)會(huì)再跟大家匯報(bào)。