DNS協議詳解
1、URL構成和域名體系
URL構成
URL:(Uniform Resource Locator)統一資源定位符。一條符合規範的URL對應的是伺服器的一個特定的資源(如HTML頁面,一張圖片等)。
結構如下:
scheme://hostname[:port]/path/[;parameters][?query]#fragment
scheme:通訊協議,常用的有http、https、ftp、mailto等。
hostname:主機域名或IP地址。
port:埠號,可選。省略時使用協議的預設埠,如http預設埠為80。
path:路徑由零或多個"/"符號隔開的字串組成,一般用來表示主機上的一個目錄或檔案地址。
fragment:資訊片斷字串,也稱為錨點。用於指定網路資源中的片斷。
比如:
https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9230366566950910677%22%7D&n_type=0&p_from=1
其中mbd.baidu.com為主機域名。
域名體系
域名(Domain Name)通常是使用者所在的主機名。域名格式是由若干部分組成,每個部分又稱子域名,它們之間用“.”分開,每個部分最少由兩個字母或數字組成。城名通常按分層結構來構造,每個子域名都有其特定的含義。從右到左,子域名分別表示不同的國家或地區的名稱(只有美國可以省略表示國家的頂級域名)、組織型別、組織名稱、分組織名稱和計算機名稱等。
2、DNS伺服器體系
域名伺服器實際上就是裝有域名系統的主機。由高向低進行層次劃分,可分為以下幾大類:
- 根域名伺服器:最高層次的域名伺服器,也是最重要的域名伺服器,本地域名伺服器如果解析不了域名就會向根域名伺服器求助。全球共有13個不同IP地址的根域名伺服器,它們的名稱用一個英文字母命名,從a一直到m。這些伺服器由各種組織控制,並由 ICANN(網際網路名稱和數字地址分配公司)授權,每個根伺服器都有映象伺服器,每個根伺服器與它的映象伺服器共享同一個 IP 地址,中國大陸地區內只有6組根伺服器映象(F,I(3臺),J,L)。當你對某個根伺服器發出請求時,請求會被路由到該根伺服器離你最近的映象伺服器。所有的根域名伺服器都知道所有的頂級域名伺服器的域名和地址,如果向根伺服器發出對
“jocent.me”
“jocent.me”
匹配的記錄。但是它會找到“me”
的頂級域名記錄,並把負責“me”
地址的頂級域名伺服器的地址發回給請求者。- 為什麼根域名伺服器只能有13個?
通過UDP協議傳輸的DNS訊息最大長度需要限制在512位元組(不包括IP頭部、UDP頭部),超出部分要被截斷。有了最大長度限制後,一個UDP協議傳輸的DNS響應能夠返回的資源記錄數量就是有限的。512位元組的限制是在RFC 1035中規定的,為了更好的效能我們需要將響應限制在一個響應報文中完成,也就是隻有512位元組可以用了。當我們查詢根域的NS記錄時,512位元組只夠返回包含13個由A-M命名的根域名伺服器的NS記錄和A記錄的響應。NS記錄在回答區段中,A記錄在額外資訊區段中,A記錄用於幫助你接下來向根域名伺服器進一步查詢。
- 為什麼根域名伺服器只能有13個?
- 頂級域名伺服器:負責管理在該頂級域名伺服器下注冊的二級域名。當根域名伺服器告訴查詢者頂級域名伺服器地址時,查詢者緊接著就會到頂級域名伺服器進行查詢。比如還是查詢
"jocent.me"
,根域名伺服器已經告訴了查詢者“me”
頂級域名伺服器的地址,“me”
頂級域名伺服器會找到“jocent.me”
的域名伺服器的記錄,域名伺服器檢查其區域檔案,並發現它有與“jocent.me”
相關聯的區域檔案。在此檔案的內部,有該主機的記錄。此記錄說明此主機所在的 IP 地址,並向請求者返回最終答案。 - 許可權域名伺服器:負責一個區的域名解析工作
- 本地域名伺服器:當一個主機發出DNS查詢請求的時候,這個查詢請求首先就是發給本地域名伺服器的。
3、域名解析過程
域名解析總體可分為兩大步驟,第一個步驟是本機向本地域名伺服器發出一個DNS請求報文,報文裡攜帶需要查詢的域名;第二個步驟是本地域名伺服器向本機迴應一個DNS響應報文,裡面包含域名對應的IP地址。從下面對jocent.me
進行域名解析的報文中可明顯看出這兩大步驟。注意:第二大步驟中採用的是迭代查詢,其實是包含了很多小步驟的,詳情見下面的流程分析。
其具體的流程可描述如下:
- 主機10.74.36.90先向本地域名伺服器10.74.1.11進行遞迴查詢
- 本地域名伺服器採用迭代查詢,向一個根域名伺服器進行查詢
- 根域名伺服器告訴本地域名伺服器,下一次應該查詢的頂級域名伺服器
dns.me
的IP地址 - 本地域名伺服器向頂級域名伺服器
dns.me
進行查詢 - 頂級域名伺服器
me
告訴本地域名伺服器,下一步查詢許可權伺服器dns.jocent.me
的IP地址 - 本地域名伺服器向許可權伺服器
dns.jocent.me
進行查詢 - 許可權伺服器
dns.jocent.me
告訴本地域名伺服器所查詢的主機的IP地址 - 本地域名伺服器最後把查詢結果告訴 10.74.36.90
其中有兩個概念遞迴查詢和迭代查詢,其實在整個描述的過程中已經體現的很明顯,這裡再說明一下:
- 遞迴查詢:本機向本地域名伺服器發出一次查詢請求,就靜待最終的結果。如果本地域名伺服器無法解析,自己會以DNS客戶機的身份向其它域名伺服器查詢,直到得到最終的IP地址告訴本機
- 迭代查詢:本地域名伺服器向根域名伺服器查詢,根域名伺服器告訴它下一步到哪裡去查詢,然後它再去查,每次它都是以客戶機的身份去各個伺服器查詢