先說一下DNS的幾個基本概念:linux
就是所謂的「.」,其實咱們的網址www.baidu.com在配置當中應該是www.baidu.com.(最後有一點),通常咱們在瀏覽器裏輸入時會省略後面的點,而這也已經成爲了習慣。瀏覽器
根域服務器咱們知道有13臺,可是這是錯誤的觀點。緩存
根域服務器只是具備13個IP地址,但機器數量卻不是13臺,由於這些IP地址藉助了任播的技術,因此咱們能夠在全球設立這些IP的鏡像站點,你訪問到的這個IP並非惟一的那臺主機。服務器
具體的鏡像分佈能夠參考維基百科。這些主機的內容都是同樣的
網絡
根域下來就是頂級域或者叫一級域,工具
有兩種劃分方式,一種互聯網剛興起時的按照行業性質劃分的com.,net.等,一種是按國家劃分的如cn.,jp.,等。spa
具體多少你能夠本身去查,咱們這裏不關心。.net
每一個域都會有域名服務器,也叫權威域名服務器。3d
Baidu.com就是一個頂級域名,而www.baidu.com卻不是頂級域名,他是在baidu.com 這個域裏的一叫作www的主機。代理
一級域以後還有二級域,三級域,只要我買了一個頂級域,而且我搭建了本身BIND服務器(或者其餘軟件搭建的)註冊到互聯網中,那麼我就能夠隨意在前面多加幾個域了(固然長度是有限制的)。
好比a.www.baidu.com,在這個網址中,www.baidu.com變成了一個二級域而不是一臺主機,主機名是a。
能提供域名解析的服務器,上面的記錄類型能夠是A(address)記錄,NS記錄(name server),MX(mail),CNAME等。
(詳解參見博客:域名解析中A記錄、CNAME、MX記錄、NS記錄的區別和聯繫)
A記錄是什麼意思呢,就是記錄一個IP地址和一個主機名字,好比我這個域名服務器所在的域test.baidu.com,咱們知道這是一個二級的域名,而後我在裏面有一條A記錄,記錄了主機爲a的IP,查到了就返回給你了。
若是我如今要想baidu.com這個域名服務器查詢a.test.baidu.com,那麼這個頂級域名服務器就會發現你請求的這個網址在test.baidu.com這個域中,我這裏記錄了這個二級域的域名服務器test.baidu.com的NS的IP。我返回給你這個地址你再去查主機爲a的主機把。
這些域內的域名服務器都稱爲權威服務器,直接提供DNS查詢服務。(這些服務器可不會作遞歸哦)
那麼咱們的DNS是怎麼解析一個域名的呢?
1.如今我有一臺計算機,經過ISP接入了互聯網,那麼ISP就會給我分配一個DNS服務器,這個DNS服務器不是權威服務器,而是至關於一個代理的dns解析服務器,他會幫你迭代權威服務器返回的應答,而後把最終查到IP返回給你。
2.如今的我計算機要向這臺ISPDNS發起請求查詢www.baidu.com這個域名了,(經網友提醒:這裏其實準確來講不是ISPDNS,而應該是用戶本身電腦網絡設置裏的DNS,並不必定是ISPDNS。好比也有可能你手工設置了8.8.8.8)
3.ISPDNS拿到請求後,先檢查一下本身的緩存中有沒有這個地址,有的話就直接返回。這個時候拿到的ip地址,會被標記爲非權威服務器的應答。
4.若是緩存中沒有的話,ISPDNS會從配置文件裏面讀取13個根域名服務器的地址(這些地址是不變的,直接在BIND的配置文件中),
5.而後像其中一臺發起請求。
6.根服務器拿到這個請求後,知道他是com.這個頂級域名下的,因此就會返回com域中的NS記錄,通常來講是13臺主機名和IP。
7.而後ISPDNS向其中一臺再次發起請求,com域的服務器發現你這請求是baidu.com這個域的,我一查發現了這個域的NS,那我就返回給你,你再去查。
(目前百度有4臺baidu.com的頂級域名服務器)。
8.ISPDNS不厭其煩的再次向baidu.com這個域的權威服務器發起請求,baidu.com收到以後,查了下有www的這臺主機,就把這個IP返回給你了,
9.而後ISPDNS拿到了以後,將其返回給了客戶端,而且把這個保存在高速緩存中。
下面咱們來用 nslookup 這個工具詳細來講一下解析步驟:
從上圖咱們能夠看到:
第一行Server是:DNS服務器的主機名--210.32.32.1
第二行Address是: 它的IP地址--210.32.32.1#53
下面的Name是:解析的URL-- www.jsjzx.com
Address是:解析出來的IP--112.121.162.168
可是也有像百度這樣的DNS比較複雜的解析:
你會發現百度有一個cname = www.a.shifen.com 的別名。
這是怎麼一個過程呢?
咱們用dig工具來跟蹤一下把(linux系統自帶有)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Dig工具會在本地計算機作迭代,而後記錄查詢的過程。
第一步是向我這臺機器的ISPDNS獲取到根域服務區的13個IP和主機名[b-j].root-servers.net.。
第二步是向其中的一臺根域服務器(Servername就是末行小括號裏面的)發送www.baidu.com的查詢請求,他返回了com.頂級域的服務器IP(未顯示)和名稱,
第三步,便向com.域的一臺服務器192.33.4.12請求,www.baidu.com,他返回了baidu.com域的服務器IP(未顯示)和名稱,百度有四臺頂級域的服務器
【此處能夠用dig @192.33.4.12 www.baidu.com查看返回的百度頂級域名服務器IP地址】。
第四步呢,向百度的頂級域服務器(202.108.22.220)請求www.baidu.com,他發現這個www有個別名,而不是一臺主機,別名是www.a.shifen.com。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
按照通常的邏輯,當dns請求到別名的時候,查詢會終止,而是從新發起查詢別名的請求,因此此處應該返回的是www.a.shifen.com而已。
可是爲何返回a.shifen.com的這個域的NS呢?
咱們能夠嘗試下面的這個命令:dig +trace shifen.com 看看有什麼結果。。。。。。。。
你會發現第三步時shifen.com這個頂級域的域名服務器和baidu.com這個域的域名服務器是同一臺主機(即:dns.baidu.com)!
當我拿到www.baidu.com的別名www.a.shifen.com的時候,我原本須要從新到com域查找shifen.com域的NS,可是由於這兩個域在同一臺NS上,因此直接向本機發起了,
shifen.com域發現請求的www.a.shifen.com是屬於a.shifen.com這個域的,
因而就把a.shifen.com的這個NS和IP返回,讓我到a.shifen.com這個域的域名服務器上查詢www.a.shifen.com。
因而我便從ns X .a.shifen.com中一臺拿到了一條A記錄,最終的最終也即是www.baidu.com的IP地址了.【此處也能夠用dig +trace www.a.shifen.com】跟蹤一下
用一個圖來講明一下(圖中第三步的全世界只有13臺是錯誤的)
如下內容爲在虛擬機中搭建local dns服務器獲得的實驗數據,糾正上述結論
在上面的分析中,咱們用dig工具進行了追蹤,可是dig沒有繼續追蹤當咱們從baidu.com拿到cname和ns2.a.shifen.com的IP以後的事情。
咱們就因此然的下結論認爲local dns會向ns2.a.shifen.com請求www.a.shifenc.om。
其實這個想法是錯誤,在本身的本地搭建一個local dns,抓取整個解析過程當中是全部包,看看就明白拉。
實際的結果是雖然dns.baidu.com返回了a.shifen.com域的服務器地址和IP,
可是local dns並非直接向上述返回的IP請求www.a.shifen.com,而是再一次去請求com域,獲得shifen.com域的服務器(也就是baidu.com的那四臺),
而後又請求www.a.shifen.com,返回a.shifen.com的域的服務器,最後纔是去請求www.a.shifen.com,
雖然上面已經返回了IP,可是實驗的結果就是再走一遍shifen.com域的查詢。
上圖就是localdns在解析www.baidu.com的抓包全過程。藍色那條就是在收到cname和響應的a.shifen.com的域名服務器IP地址以後,繼續向com域請求shifen.com。
這個圖充分說明了返回cname的同時也返回了ns2.a.shifen.com的IP。
所以總結一下即是
①本機向local dns請求www.baidu.com
②local dns向根域請求www.baidu.com,根域返回com.域的服務器IP
③向com.域請求www.baidu.com,com.域返回baidu.com域的服務器IP
④向baidu.com請求www.baidu.com,返回cname www.a.shifen.com和a.shifen.com域的服務器IP
⑤向root域請求www.a.shifen.com
⑥向com.域請求www.a.shife.com
⑦向shifen.com請求
⑧向a.shifen.com域請求
⑨拿到www.a.shifen.com的IP
⑩localdns返回本機www.baidu.com cname www.a.shifen.com 以及 www.a.shifen.com的IP