DNS多級緩存系統

DNS基礎

DNS,是英文Domain Name System的簡稱,中文稱之爲“域名系統”。互聯網主機之間通信是通過IP地址來互相訪問,IP地址是十進制數,比如10.11.10.235,但這樣的數字串對人類來說很難理解和記憶。於是,人們發明了DNS系統,使用人類可讀、可理解的字符串來代替一堆堆數字。

其實DNS本質是”命名系統“,爲什麼不叫“名字”而叫“域名”呢?這是因爲在因特網的命名系統中使用了許多的“域(domain)”,因此就出現了“域名”這個名詞。“域名系統”明確地指明這種系統是應用在因特網中。

因特網的域名結構

因爲因特網規模很大,所以整個因特網只使用一個域名服務器是不可能的。因此,早在1983年因特網開始採用層次樹狀結構的命名方法,並使用了分佈式的域名系統DNS。使用分佈式系統的好處是:即使單個節點故障,也不會妨礙整個DNS系統的正常運行。

任何一個連接在因特網上的主機或路由器,都有一個唯一的層次結構的名字,即域名(domain name)。這裏,“域”(domain)是名字空間中一個可被管理的劃分。從語法上講,每一個域名都是有標籤(label)序列組成,而各標號之間用點(小數點)隔開。
如下例子所示:

這是中央電視臺用於收發電子郵件的計算機的域名,它由三個標籤組成,其中.com是頂級域名,cctv是二級域名,.mail是三級域名。下圖是因特網的樹狀結構的域名空間:

DNS基本解析流程

我們有必要了解一下DNS基本的解析流程,我們以瀏覽器訪問www.google.com爲例:
 

  • 首先從客戶端瀏覽器緩存查找,找到www.google.com就直接訪問對應的IP地址;
  • 瀏覽器緩存如未找到對應的IP,操作系統會去檢查自己的Host文件,如果從中沒找到對應關係,會再到系統DNS緩存中查,如果緩存中有,就直接返回該域名所對應的IP;
  • 如果本地計算機緩存中沒有,則會向我們事先設置好的Local DNS服務器(一般是由ISP運營商提供)去請求(對應圖中的步驟1),即所謂的“遞歸查詢”,Local DNS服務器首先會到自身解析數據庫中去查,如果找到就返回;沒有找到會向根服務器(Root NS)發送詢問請求(對應圖中的步驟2);
  • 根服務器收到請求,發現後綴是.com,就會把com所在的NS服務器告訴Local DNS服務器(對應圖中的步驟3),然後,Local DNS服務器就會去請求.com所在的NS服務器(對應圖中的步驟4);
  • 當請求到達.com NS服務器時,.com服務器發現域名是在google這個域下的,就會把google所在的NS服務器再告訴Local DNS服務器;
  • Local DNS服務器收到NS回覆(對應圖中的步驟5),去訪問google域下的NS服務器(對應圖中的步驟6);
  • Google這個域的NS服務器一看是要訪問www,就直接找到了www對應的的IP,並把它丟給了Local DNS服務器(對應圖中的步驟7);
  • Local DNS服務器收到最終解析後的IP地址,返回給客戶端(End User)(對應圖中的步驟8),瀏覽器最終通過該IP地址訪問www.google.com(對應圖中的步驟9)。

DNS多級緩存機制

經過前面的一堆鋪墊,我們現在講解本篇文章最核心的內容:DNS的多級緩存機制。

我們試着思考一下,當我們在瀏覽器上輸入需要訪問的網站域名的時候,域名解析是開始訪問互聯網應用的第一步,如果這一步都需要花很長時間,那麼,整個互聯網的架構設計一定是失敗的!

爲了滿足DNS的高效、快速的查詢,整個DNS系統,需要按照分佈式系統架構來設計,並且,前面提到的Local DNS查詢服務器,它是離客戶最近的DNS解析服務器,類似於CDN的邊緣節點,除了直接把域名解析的結果緩存起來,也會試圖把整個分佈式的DNS管理服務器的數據,按照樹型組織集中緩存在本地,這就是所謂的多級緩存!

比如緩存了 .com域名服務器的域名解析結果,這樣就不需要到Root NS去查詢,無形中大幅降低了Root NS根管理服務器的流量壓力。只有在查詢服務器把各級緩存全都遺忘的時候,纔會從根部開始一次查詢,而這次新的查詢結束後,查詢服務器又會把它記住,直到歲月導致的遺忘。

這張圖展示了多級緩存系統的結構,在客戶端系統中,有瀏覽器緩存、OS緩存來直接解析的機制,這樣就減少了訪問Local DNS服務器的網絡和查詢的開銷,所以速度是最快的。
當客戶端查詢不到時,需要訪問Local DNS服務器,Local DNS的多級域名緩存機制能夠儘可能的減少Root NS等服務器的訪問。

這張圖展示了Local DNS的遞歸查詢,遞歸查詢其實是基於自身多級緩存的查詢,如果緩存裏沒有,需要訪問Root NS等域名服務器的時候,屬於向上的迭代查詢。
我們舉例了當我們需要查詢谷歌郵箱地址mail.google.com時的多級緩存查詢:
1、首先查詢mail.google.com,如果Local DNS有,就直接返回解析後的IP地址;
2、如果沒有,在緩存中查詢 .google.com,如果有,就去向上查詢.google.com的域名服務器迭代返回結果;
3、如果沒有,在緩存中查詢 .com,如果有,就去向上查詢 .com的域名服務器迭代返回結果;
4、如果沒有,就執行ROOT開始的基本的迭代查詢,當然這個是效率最低的查詢。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章