DNS查詢流程簡介
DNS(domain name system),讀者們或多或少都聽過,就是可以將域名轉換給IP的一個系統。使得我們只需記住域名而非IP就能訪問某個網站。當我們在瀏覽器裡面輸入一個網址時,瀏覽器會向本地DNS伺服器發出查詢請求,本地DNS伺服器會把網址對應的IP返回給瀏覽器。注意:更確切來說,不是本地DNS伺服器,而是Windows網路連線裡面所配置的DNS伺服器。一般我們不會配置的,所以本文預設使用本地DNS伺服器。
除了用瀏覽器,我們也可以通過命令列的方式查詢某個網址的IP。比如使用nslookup命令。下圖是通過nslookup命令向阿里的公共DNS伺服器223.5.5.5查詢www.weibo.com的IP地址。可以看到最後的查詢結果是121.194.0.221
從上面的敘述和命令使用,可以得知從域名到IP參與者有:DNS客戶端(瀏覽器或者nslookup命令);DNS伺服器(本地DNS伺服器或者阿里的公共伺服器)。其實,這裡還隱藏了另外一個參與者:名字伺服器(name server)。一共有三個參與者:DNS客戶端( domain name systemclient)、DNS伺服器(domain name system server)、名字伺服器(name server)。
名字伺服器有什麼用呢?它和DNS伺服器又有什麼區別呢?要弄懂這個,首先要解決一個問題,阿里的公共DNS是如何知道微博IP的?它記住了,確實它是記住了(上圖返回的是非權威應答,這說明是記住了)。但它不可能記住全球所有網站的IP吧。當用戶向它查詢一個它沒有記住的網址時,它是怎麼辦的呢?我們不知道一個網址的IP,可以求助於DNS伺服器,那麼DNS伺服器不知道呢?嘿嘿。
或許讀者聽說過DNS是分層的,不知道的話,就向上層查詢。DNS確實是分層的,並且全球有13個根域名伺服器(root name server)。阿里的公共DNS不懂一個網址的IP就要向根域名伺服器詢問(也可能不是向根域名伺服器詢問),不懂就要問嘛。但根域名伺服器也不可能把全球的所有網址的IP都記錄下來吧(對於IPv4或許有點可能,但對於IPv6就不可能了)。如果根域名伺服器都不知道某個網址的IP,那可怎麼辦?其實,雖然根域名伺服器不能告訴你某個網址的IP,但它會提供非常有用的資訊給查詢者(也就是阿里公共DNS伺服器或者本地DNS伺服器)。
在繼續講解查詢之前,要先介紹域(domain)這個概念,因為網址是分域而治的。域名系統就像我們平常使用的檔案目錄那樣,是分層的。首先是根,然後是頂級域(一級域)、接著是二級域、三級域、……。我們熟知的頂級域有:com、net、org、cn。父域將某個識別符號(比如cn)分配給子域,然後子域cn將全權負責cn下面的二級域的具體分配。對於cn,熟知的二級域有com.cn、edu.cn這些。當然對於edu.cn又會負責旗下的三級域名分配(比如每個大學分配一個)。這樣分層的一個好處就是方便管理。下圖是一個DNS層次例子。
圖來自《DNS 與 BIND》 圖2-5
除了域(domain),還有另外一個重要的概念區域(zone)。假如A是一個域(domain),並且A有子域a和b。如果域(domain)A的管理者把a和b授權給另外的人管理,那麼a和b就各自形成一個區域(zone)。也就是說,站在A的角度來看,a和b是區域(zone),但如果只看a或者b,那麼又是一個域了。這類似於樹裡面的,樹的一個孩子節點本身也是一顆樹。下面用一張圖說明這點:
圖來自《DNS與BIND》
每一個區域(zone)都會有名字伺服器(name server)[1],用來管理這個區域。管理包括對這個域進行再劃分成更小的子域以及對子域名的IP解析(也就是將域名轉換成IP)。對於某個區域,該區域的名字伺服器(name server)就是該區域的權威,權威可以這樣認為:該名字伺服器給出的本區域的域名到IP轉換結果是權威的(除了域名到IP的轉換外,還有其他轉換的)。
可以使用nslookup 命令查詢一個區域(zone)或者主機的名字伺服器(name server),如下圖所示。其中,-qt=ns 指明要查詢的型別是名字伺服器(name server);223.5.5.5則是阿里的公共DNS伺服器。
從上圖可以看到,區域(zone) qq.com的名字伺服器是ns[1-4].qq.com,而主機www.qq.com則是ns-tell.qq.com。
需要注意的是,區域(zone)和域(domain)都是一個範圍而不是一臺主機。比如qq.com它不是一臺主機,而qq旗下的全球資訊網伺服器的主機名為www.qq.com,還有v.qq.com則是視訊伺服器的主機名。
有了上面的那些介紹,明確DNS中有什麼物理實體,那麼講解DNS查詢過程就容易多了。
使用阿里的223.5.5.5作為DNS伺服器,查詢www.qq.com的IP。假設在查詢過程中,阿里的DNS伺服器的快取中並沒有任何有關www.qq.com的記錄。
- 我的PC機向223.5.5.5提出查詢請求,查詢www.qq.com對應的IP地址
- 223.5.5.5向根域名伺服器提出查詢請求,查詢www.qq.com。根域名伺服器的IP地址是固定的,每一個DNS伺服器都會從配置檔案中讀取到
- 根域名伺服器告訴223.5.5.5:“x.x.x.x是.com的名字伺服器的IP地址,你去.com的名字伺服器查詢吧。哥只能幫你到這裡了。”
- 223.5.5.5拿到這個回覆並不生氣,而是屁顛屁顛地向.com的名字伺服器發出查詢請求:“請告訴我www.qq.com的IP地址?”
- .com的名字伺服器回覆說,“給你qq.com區域的名字伺服器 ns1.qq.com的IP地址y.y.y.y,你去那裡查吧。”
- 吃完閉門羹,223.5.5.5再次出發向ns1.qq.com提出查詢請求,“你總能告訴我www.qq.com的IP地址吧?這是你們旗下的域名啊”
- ns1.qq.com嘿嘿一聲,說:“你去ns-tel1.qq.com查吧,它的IP是z.z.z.z”
- 223.5.5.5不抱希望地問ns-tel1.qq.com:“你能告訴我www.qq.com的IP嗎”
- ns-tel1.qq.com說:“可以啊,它的IP是14.17.42.40”
- 223.5.5.5拿到結果後,在自己的快取中存了一份備份,免得待會又有人問我的時候又要這樣問來問去。最後223.5.5.5把結果告訴我的PC機
由於223.5.5.5會在自己的快取中保留一份備份,這就有權威應答和非權威應答兩種。如果223.5.5.5返回的結果是直接從自己的快取中讀取的,那麼就是非權威應答。如果是從域名本身的權威名字伺服器得到的結果,那麼就是權威應答。
下圖是《DNS與BIND》書中關於DNS查詢過程的流程圖:
圖中的解析器相當於PC裡面的瀏覽器或者nslookup程式。左邊的名字伺服器就相當於本地DNS伺服器或者阿里的公共DNS伺服器。
有一點要注意:阿里公共DNS伺服器每次發出查詢時,請求查詢的內容都www.qq.com,而不是其中的某一部分。上圖也展示了這一點。這是因為可能途中某個名字伺服器的快取中有www.qq.com,如果僅僅查詢qq.com可能會錯過[2]。
需要指出的是,DNS查詢有兩種:遞迴查詢和迭代查詢[3]。前面展示的是遞迴查詢,查詢工作由本地DNS伺服器或者本文中的阿里公共DNS伺服器完成絕大部分任務,查詢的最初提出者只需等待結果即可。而在迭代查詢中,如果本地DNS伺服器或者公共DNS伺服器的快取中有查詢的域名,那麼返回之。如果沒有,那麼就像上圖右邊的那些名字伺服器(name server)那樣,告訴查詢提出者“你去那裡查吧”,當然也是可以直接返回一個錯誤資訊的。
遞迴查詢使得我們無法觀察整個流程,此時可以使用dig命令,通過+trace強制使用迭代查詢觀看整個流程。下圖展示了整個流程(@223.5.5.5表示使用阿里公共DNS伺服器):
參考:
[2]《DNS與BIND》第5版 32頁