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