前言chrome
前面的章節介紹了數據鏈路層,網絡層和傳輸層的協議,今天咱們一塊兒看下應用層的協議——DNS。數據庫
咱們平時上網的時候想訪問某個網站,須要在瀏覽器中輸入URL網址,咱們輸入的通常是域名domain。要想訪問某個網站,咱們必須知道該網站的IP地址,這時候就須要有一個東西告訴咱們域名和IP的映射關係,域名解析系統——DNS就能夠實現這一個目的。編程
若是說ARP協議是用來將IP地址轉換爲MAC地址,那麼DNS協議則是用來將域名轉換爲IP地址(也能夠將IP地址轉換爲相應的域名地址)。windows
正文瀏覽器
咱們都知道,TCP/IP中使用的是IP地址和端口號來肯定網絡上某一臺主機上的某一個程序,難免有人有疑問,爲何不用域名來直接進行通訊呢?緩存
由於IP地址是固定長度的,IPv4是32位,IPv6是128位,而域名是變長的,不便於計算機處理。服務器
總結一點就是IP地址是面向主機的,而域名則是面向用戶的。網絡
1 什麼是DNSdom
DNS是 Domain Name System 的縮寫,也就是 域名解析系統,是因特網的一項核心服務,它做爲能夠將域名和IP地址相互映射的一個分佈式數據庫,可以令人更方便的訪問互聯網,而不用去記住可以被機器直接讀取的IP地址。分佈式
咱們能夠將域名系統(DNS)理解成因特網的電話簿。人類經過域名在線訪問信息,如www.baidu.com或www.taobao..com。Web瀏覽器經過Internet協議(IP)地址進行交互。DNS將域名轉換爲IP地址,以便瀏覽器能夠加載Internet資源。
域名服務主要是基於UDP實現的,服務器的端口號爲53。
2 DNS的域名層級
域名系統必需要保持惟一性。爲了達到惟一性的目的,因特網在命名的時候採用了層次結構的命名方法:
每個域名(本文只討論英文域名)都是一個標號序列(labels),用字母(A-Z,a-z,大小寫等價)、數字(0-9)和鏈接符(-)組成
標號序列總長度不能超過255個字符,它由點號分割成一個個的標號(label)。
每一個標號應該在63個字符以內,每一個標號均可以當作一個層次的域名。
關於域名的層次結構:
一、在全部域名的尾部,實際上都有一個根域名,例如www.baidu.com真正的域名是www.baidu.com.root,簡寫爲www.baidu.com.。由於,根域名.root對於全部域名都是同樣的,因此平時是省略的。
二、頂級域名,如 .com,.cn .net等。
頂級域名又分爲三類:
一是國家和地區頂級域名,目前200多個國家都按照ISO3166國家代碼分配了頂級域名,例如中國是cn,日本是jp等;
二是通用頂級域名,例如表示工商企業的.com,表示網絡提供商的 .net,表示非盈利組織的 .org等。
三是新頂級域名,如通用的.xyz、表明「高端」的.top、表明「紅色」的.red、表明「人」的.men等一千多種。
三、次級域名,如 baidu.com 裏的 baidu,這個是用戶能夠進行註冊購買的。
四、主機域名,好比 baike.baidu.com 裏的baike,這個是用戶可分配的。
3 DNS的工做原理
當一個用戶在地址欄輸入www.taobao.com時,DNS解析有大體十個過程,以下:
舉例:在chrome瀏覽器的地址欄中輸入 chrome://net-internals/#dns 並回車,該頁面會顯示當前全部DNS緩存,經過點擊「Clear host cache」,能夠清空全部DNS緩存。
二、若是瀏覽器緩存中沒有(專業點叫還沒命中),瀏覽器會檢查操做系統緩存中有沒有對應的已解析過的結果。而操做系統也有一個域名解析的過程。在windows中可經過c盤裏一個叫hosts的文件來設置,若是你在這裏指定了一個域名對應的ip地址,那瀏覽器會首先使用這個ip地址。
可是這種操做系統級別的域名解析規程也被不少***利用,經過修改你的hosts文件裏的內容把特定的域名解析到他指定的ip地址上,形成所謂的域名劫持。因此在windows7中將hosts文件設置成了readonly,防止被惡意篡改。
若是至此尚未命中域名,纔會真正的請求本地域名服務器(LDNS)來解析這個域名,這臺服務器通常在你的城市的某個角落,距離你不會很遠,而且這臺服務器的性能都很好,通常都會緩存域名解析結果,大約80%的域名解析到這裏就完成了。
若是LDNS仍然沒有命中,就直接跳到根域名服務器請求解析。
根域名服務器返回給LDNS一個所查詢域的主域名服務器(gTLD Server,國際頂尖域名服務器,如.com .cn .org等)地址。
此時LDNS再發送請求給上一步返回的主域名服務器 (gTLD)。
接受請求的主域名服務器gTLD查找並返回這個域名對應的Name Server的地址,這個Name Server就是網站註冊的域名服務器。
Name Server根據映射關係表找到目標ip,返回給LDNS。
LDNS緩存這個域名和對應的ip。
總結:
簡單來講,一條域名的DNS記錄會在本地有兩種緩存:瀏覽器緩存和操做系統(OS)緩存。在瀏覽器中訪問的時候,會優先訪問瀏覽器緩存,若是未命中則訪問OS緩存,最後再訪問DNS服務器(通常是ISP提供),而後DNS服務器會遞歸式的查找域名記錄,而後返回。
4 DNS報文結構
DNS報文格式頭部
該部分中每一個字段含義以下:
事務 ID:DNS 報文的 ID 標識。對於請求報文和其對應的應答報文,該字段的值是相同的。經過它能夠區分 DNS 應答報文是對哪一個請求進行響應的。
標誌:DNS 報文中的標誌字段。
問題計數:DNS 查詢請求的數目。
回答資源記錄數:DNS 響應的數目。
權威名稱服務器計數:權威名稱服務器的數目。
標誌Flags 字段中每一個字段的含義以下:
AA 受權應答(Authoritative Answer) - 這個比特位在應答的時候纔有意義,指出給出應答的服務器是查詢域名的受權解析服務器。注意由於別名的存在,應答可能存在多個主域名,這個AA位對應請求名,或者應答中的第一個主域名。
TC 截斷(TrunCation) - 用來指出報文比容許的長度還要長,致使被截斷。
RD 指望遞歸(Recursion Desired) - 這個比特位被請求設置,應答的時候使用的相同的值返回。若是設置了RD,就建議域名服務器進行遞歸解析,遞歸查詢的支持是可選的。
RA 支持遞歸(Recursion Available) - 這個比特位在應答中設置或取消,用來表明服務器是否支持遞歸查詢。
RCODE 應答碼(Response code) - 這4個比特位在應答報文中設置,表明的含義以下:
0 沒有錯誤。
1 報文格式錯誤(Format error) - 服務器不能理解請求的報文。
2 服務器失敗(Server failure) - 由於服務器的緣由致使沒辦法處理這個請求。
3 名字錯誤(Name Error) - 只有對受權域名解析服務器有意義,指出解析的域名不存在。
4 沒有實現(Not Implemented) - 域名服務器不支持查詢類型。
5 拒絕(Refused) - 服務器因爲設置的策略拒絕給出應答。好比,服務器不但願對某些請求者給出應答,或者服務器不但願進行某些操做(好比區域傳送zone transfer)。
6-15 保留值,暫時未使用。
查詢報文格式
該部分中每一個字段含義以下:
查詢名:通常爲要查詢的域名,有時也會是 IP 地址,用於反向查詢。
查詢類型:DNS 查詢請求的資源類型。一般查詢類型爲 A 類型,表示由域名獲取對應的 IP 地址。
查詢名QNAME要查找的名字,是一個或多個標識符的序列。每一個標識符以首字節的計數值來講明隨後標識符的字節長度,每一個名字以最後字節爲0結束,長度爲0的標識符是根標識符。單個標識符最大長度爲63字節。
查詢類型QTYPE 每一個問題有一個查詢類型。2個字節表示查詢類型,取值能夠爲任何可用的類型值,以及通配碼來表示全部的資源記錄。
DNS的查詢類型有20種,比較經常使用的查詢類型有有A,NS,CNAME,PTR,MX等五種類型。如下分別介紹五種類型:
1)A:由DNS域名到IP地址的查詢,即正向查詢,編程中由函數gethostbyname實現。
2)PTR:由IP到域名的查詢,即逆向查詢,編程中由函數gethostbyaddr。
3)NS:查詢解析的名字服務器(Name server)。
4)CNAME:查詢DNS的別名。
5)MX:郵箱服務器查詢。
應答報文格式
資源記錄部分是指 DNS 報文格式中的最後三個字段,包括回答問題區域字段、權威名稱服務器區域字段、附加信息區域字段。這三個字段均採用一種稱爲資源記錄的格式,格式如圖所示。
資源記錄格式中每一個字段含義以下:
域名:DNS 請求的域名。
類型:資源記錄的類型,與問題部分中的查詢類型值是同樣的。
類:地址類型,與問題部分中的查詢類值是同樣的。
生存時間:以秒爲單位,表示資源記錄的生命週期,通常用於當地址解析程序取出資源記錄後決定保存及使用緩存數據的時間。它同時也能夠代表該資源記錄的穩定程度,穩定的信息會被分配一個很大的值。
資源數據長度:資源數據的長度。
資源記錄部分只有在 DNS 響應包中才會出現。
5 實戰
搭建拓撲環境以下:
HTTP客戶端訪問HTTP服務器時,須要經過DNS服務器將域名解析成IP地址,從而實現訪問。
HTTP客戶端配置:
DNS服務器的配置:
HTTP服務器的配置:
在ENSP模擬客戶端訪問HTTP服務器經過DNS地址解析的過程
一、在HTTP客戶端輸入網址URL: http://www.baidu.com
因爲配置了DNS服務器,客戶端發動DNS請求報文給DNS服務器,請求服務器的IP地址。
二、在接口下抓取到DNS請求報文和應答報文:
三、根據DNS請求報文能夠看到:這個是HTTP客戶端發送給DNS服務器的DNS請求報文,請求域名www.baidu.com的IP地址
四、根據DNS應答報文能夠看到:這個是DNS服務器回送給HTTP客戶端的DNS迴應報文,告訴客戶端域名www.baidu.com的IP地址是192.168.1.2。