简单谈谈DNS协议
DNS協議也可以稱為DNS服務,全稱是Domain Name System,即域名系統,和HTTP協議一樣,也是一個位于應用層的協議(服務),它是基于運輸層的UDP協議的,關于網絡協議的分層介紹,見這里(還沒有寫好,先放這里一個空鏈接)。
從DNS的名字我們就可以知道,它提供域名映射到IP地址的服務,那么在我們詳細說DNS協議之前,先來大致講講互聯網的域名結構。
1. 域名結構
我們都知道,在互聯網中,每一臺計算機想要訪問互聯網,都需要一個IP地址來進行網絡通信,可以是形如192.168.1.1這樣的點分十進制的IPv4地址,也可以是形如[0:0:0:0:0:0:0:1]這樣方括號包圍的十六進制的IPv6地址,但是這些地址不便于記憶,所以就產生了域名這種方便人們記住的東西(當然你要是記憶力好能記住IP地址,在瀏覽器地址欄輸入URL的時候,也可以直接用IP地址替換掉域名,效果是一樣的)。
域名也可以叫做主機名。這里我們先給出一個域名,例如www.abc.com,以這個域名為例,來看一下域名的結構。
域名采用層次化的結構,其中com是頂級域名,abc是二級域名,www是三級域名,從語法上來說,每個域名都是幾個不同層級的名字用.連接起來的組合,域名不區分大小寫字母,所以www.ABC.com和www.abc.com是一樣的,按照規定來說,域名有長度限制,這里就不再細講。
上面提到,com是一個頂級域名(TLD,Top Level Domain),除了com之外,頂級域名還有好多,一般來說可以分為:
國家頂級域名
如cn表示中國,us表示美國,uk表示英國,當然還有一些特殊地區也有所謂的國家頂級域名,比如hk表示香港
通用頂級域名
如com表示公司企業,net表示網絡服務機構,org表示非營利組織,edu表示美國教育機構(中國的教育機構一般來說是xxx.edu.cn),gov表示美國政府部門(中國的政府部門一般來說是xxx.gov.cn)等。
基礎結構域名
不常見,不做敘述。
所以說,在中國,企業的域名一般可以是xxx.com、xxx.com.cn、xxx.cn。
下面這個域名樹,清晰地展示了互聯網的域名空間:
在圖中,edu.cn下面,劃分除了很多三級域名,如tsinghua、pku等,一旦某個單位有了一個域名,它就可以自己決定是否要進一步劃分下屬的子域,域名樹的樹葉節點就是單臺計算機的名字,不能再繼續劃分了,例如mail和www這兩臺計算機的完整域名分別為mail.tsinghua.edu.cn和www.tsinghua.edu.cn(這里起什么名字都可以,一般來說,人們愿意把用作郵件服務器的計算機叫做mail,把用作網站的服務器叫做www)。
到這里,我們已經知道了為什么要有域名以及域名的結構,域名就是為了便于人們記憶而產生的,但是域名是方便人們記憶了,計算機反而不好處理了,它更善于處理IP地址這種東西,所以這里就用到了我們要講的DNS協議,用來把域名映射到IP地址,在了解DNS解析域名的過程之前,我們還需要了解一下域名服務器這種東西(怎么這么多東西,寫個博客好麻煩啊23333)。
2. 域名服務器(DNS服務器)
上面說到了域名體系的樹狀結構,為了實現域名系統,我們首先想到的就是在域名樹的每個節點都設置一臺對應的服務器,這樣就可以了,但是這樣做的后果就是導致域名服務器太多,域名系統的運行效率太低,所以,通常是將好多個節點劃分為一個區,用分區的方式來實現域名系統,如下圖:
其中,(a)是abc這個公司只設置了一個分區的樣子,(b)是abc公司設置了兩個分區的樣子,這兩個區分別為abc.com和y.abc.com,這兩個區對應了兩個權限域名服務器(后面還會提到)。下圖可以看出域名服務器的層次結構:
由上圖可以看出,根據域名服務器起的作用,可以把域名服務器分為四種不同的類型:
根域名服務器
根域名服務器對應的是域名樹中的根節點,是最高層次的域名服務器,但是并不是只有一臺,而是有好多臺,總共有13個不同IP地址的根域名服務器,用a到m來表示,如a.rootservers.net,每個IP地址對應一套裝置,一套裝置在世界不同地點安裝了服務器,總之,數量很多,當訪問根域名服務器時,往往就是由路由器找到最近的根域名服務器訪問。
一般來說,每臺根域名服務器都知道所有的頂級域名服務器的域名以及IP地址,但往往也只知道這些,所以訪問根域名服務器一般只能得到頂級域名服務器的IP地址,而不能直接知曉你要找的具體服務器的IP。一般來講,如果要通過互聯網解析域名,本地域名服務器首先訪問的就是根域名服務器,下面還會講到。
頂級域名服務器
頂級域名服務器負責管理在頂級域名下的所有二級域名,例如cn是頂級域名服務器,管理edu、gov等二級域名,當接收到查詢請求時,要么給出最終結果(即具體IP地址),要么給出下一步應該訪問的權限域名服務器的IP地址。
權限域名服務器
權限域名服務器上面已經提到過一次了,就是每個域名分區對應一個服務器就叫做權限域名服務器。當接收到DNS查詢請求時,如果可以給出具體的IP地址就給出(例如前面的abc.com可以給出v.x.abc.com的IP地址,所以直接返回),如果不可以,就把下一步要訪問的權限域名服務器的IP地址返回(如abc.com不能給出t.y.abc.com的IP,就會把y.abc.com這個權限域名服務器的IP地址返回)。
本地域名服務器
可能有人已經發現了,上面的圖中并沒有本地域名服務器這一層級結構,這是因為本地域名服務器(有時候也叫作首選域名服務器或者默認域名服務器)不屬于域名樹的層次結構,但是相當重要。當一臺計算機要進行DNS查詢的時候,就會將查詢的請求發給本地域名服務器。
一般來說,一個互聯網服務提供商(ISP)或者是一個大學(甚至是一個系)都有一個本地域名服務器,也就是說,當你再學校內使用校園網時,你的本地域名服務器并不是指你自己的電腦,因為你的系或者你的學校,都共用一個本地域名服務器。
3. 域名解析過程
在了解了上面的域名結構以及域名服務器之后,我們來看一下域名的解析過程,總的來講,主機向本地域名服務器的域名查詢一般采用遞歸查詢,而本地域名服務器向根域名服務器的查詢一般采用迭代查詢。
概念其實很簡單,遞歸查詢就是如果主機向本地域名服務器查詢IP,本地域名服務器不知道IP地址,這是本地域名服務器就代替主機稱為DNS客戶,向根域名服務器進行下一步查詢。而迭代查詢就是,在本地域名服務器向根域名服務器查詢時,根域名服務器要么給出最終的IP地址,要么給出下一步本地域名服務器要訪問的頂級域名服務器的IP地址,之后本地域名服務器再去訪問相應的頂級域名服務器(而不是讓根域名服務器代替本地域名服務器去進行下一步查詢)。簡單來說,遞歸查詢返回具體IP地址或者報錯沒找到,迭代查詢返回具體IP地址或者返回下一步的IP地址。如下圖:
當然,我們也可以指定查詢方式讓查詢過程全程使用遞歸查詢,如下圖:
下面以一個例子說說明在無緩存的情況下(下面會談到緩存),通過DNS來查詢域名的步驟,假設域名為m.xyz.com的主機想要查詢y.abc.com這個域名對應的IP地址,那么他就會按照域名查詢方式1(上圖)中的方式進行查詢:
主機m.xyz.com先向本地域名服務器dns.xyz.com進行遞歸查詢。
本地域名服務器無法給出IP地址,所以本地域名服務器向(離自己最近的)根域名服務器查詢,這是的查詢已經變為了迭代查詢。
根域名服務器根據本地域名服務器發送的報文,知道了下一步應該查詢的是哪個頂級域名服務器,這時根域名服務器告訴本地域名服務器,下一步應該查詢的頂級域名服務器dns.com的IP地址。
本地域名服務器向頂級域名服務器dns.com發送請求查詢。
頂級域名服務器dns.com告訴本地域名服務器,下一步應該查詢的權限域名服務器dns.abc.com的IP地址。
本地域名服務器向權限域名服務器dns.abc.com發送請求查詢。
權限域名服務器dns.abc.com告訴本地域名服務器想要查詢的域名y.abc.com的IP地址。
本地域名服務器在拿到IP地址后,將IP地址返回給主機m.xyz.com。
這就是域名查詢的具體過程,因為DNS協議的基于UDP協議,所以上述8個步驟中,總共使用了8個UDP報文。
上面提到,這是在沒有緩存的情況下的DNS查詢,實際上,為了提高查詢的效率以及降低根域名服務器的負荷,一般來說域名服務器中都有高速緩存,用來記錄最近查詢過的域名的緩存,如果在查詢域名時,有想要的域名到IP的映射緩存,并且緩存沒有過期,那么就直接將緩存中域名映射的IP地址返回,省去了接下來的查詢。只有在沒有緩存或者緩存過期了才會進行下一步的查詢。實際上,不知域名服務器有緩存,每臺計算機甚至瀏覽器都會對域名到IP的映射進行緩存,這樣一來大大加快的DNS的查詢速度。
上面這些就是DNS協議的大概了,如果覺得有哪里寫的不對的,還請多多指教。
參考書籍:《計算機網絡》謝希仁
總結
- 上一篇: python内置作用域_python中的
- 下一篇: lombok插件_lombok插件,让代