一. 根域
就是所謂的“.”,其實我們的網址www.baidu.com在配置當中應該是www.baidu.com.(最后有一點),一般我們在瀏覽器里輸入時會省略后面的點,而這也已經成為了習慣。
根域服務器我們知道有13臺,但是這是錯誤的觀點。
根域服務器只是具有13個IP地址,但機器數量卻不是13臺,因為這些IP地址借助了任播的技術,所以我們可以在全球設立這些IP的鏡像站點,你訪問到的這個IP并不是唯一的那臺主機。
具體的鏡像分布可以參考維基百科。這些主機的內容都是一樣的
二. 域的劃分
有兩種劃分方式,一種互聯網剛興起時的按照行業性質劃分的com.,net.等,一種是按國家劃分的如cn.,jp.,等。
具體多少你可以自己去查,我們這里不關心。
每個域都會有域名服務器,也叫權威域名服務器。
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

你會發現百度有一個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。

字母 | IPv4地址 | IPv6地址 | 自治系統編號(AS-number) | 舊名稱 | 運作單位 | 設置地點 #數量(全球性/地區性) | 軟件 |
---|---|---|---|---|---|---|---|
A | 198.41.0.4 | 2001:503:ba3e::2:30 | AS19836 | ns.internic.net | VeriSign | 以任播技術分散設置于多處 6/0 | BIND |
B | 192.228.79.201 (2004年1月起生效,舊IP地址為128.9.0.107) | 2001:478:65::53 (not in root zone yet) | none | ns1.isi.edu | 南加州大學信息科學研究所 (Information Sciences Institute, University of Southern California) | 美國加州馬里納戴爾雷伊 (Marina del Rey) 0/1 | BIND |
C | 192.33.4.12 | 2001:500:2::C | AS2149 | c.psi.net | Cogent Communications | 以任播技術分散設置于多處 6/0 | BIND |
D | 199.7.91.13(2013年起生效,舊IP地址為128.8.10.90) | 2001:500:2::D | AS27 | terp.umd.edu | 馬里蘭大學學院市分校 (University of Maryland, College Park) | 美國馬里蘭州大學公園市 (College Park) 1/0 | BIND |
E | 192.203.230.10 | ? | AS297 | ns.nasa.gov | NASA | 美國加州山景城 (Mountain View) 1/0 | BIND |
F | 192.5.5.241 | 2001:500:2f::f | AS3557 | ns.isc.org | 互聯網系統協會 (Internet Systems Consortium) | 以任播技術分散設置于多處 2/47 | BIND |
G | 192.112.36.4 | ? | AS5927 | ns.nic.ddn.mil | 美國國防部國防信息系統局 (Defense Information Systems Agency) | 以任播技術分散設置于多處 6/0 | BIND |
H | 128.63.2.53 | 2001:500:1::803f:235 | AS13 | aos.arl.army.mil | 美國國防部陸軍研究所 (U.S. Army Research Lab) | 美國馬里蘭州阿伯丁(Aberdeen) 1/0 | NSD |
I | 192.36.148.17 | 2001:7fe::53 | AS29216 | nic.nordu.net | 瑞典奧托諾米嘉公司(Autonomica) | 以任播技術分散設置于多處 36 | BIND |
J | 192.58.128.30 (2002年11月起生效,舊IP地址為198.41.0.10) | 2001:503:c27::2:30 | AS26415 | ? | VeriSign | 以任播技術分散設置于多處 63/7 | BIND |
K | 193.0.14.129 | 2001:7fd::1 | AS25152 | ? | 荷蘭RIPE NCC | 以任播技術分散設置于多處 5/13 | NSD |
L | 199.7.83.42 (2007年11月起生效,舊IP地址為198.32.64.12) | 2001:500:3::42 | AS20144 | ? | ICANN | 以任播技術分散設置于多處 37/1 | NSD |
M | 202.12.27.33 | 2001:dc3::35 | AS7500 | ? | 日本WIDE Project | 以任播技術分散設置于多處 5/1 | BIND |