簡單談談DNS協議

酥風發表於2018-10-14

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.comwww.abc.com是一樣的,按照規定來說,域名有長度限制,這裡就不再細講。

上面提到,com是一個頂級域名(TLD,Top Level Domain),除了com之外,頂級域名還有好多,一般來說可以分為:

  • 國家頂級域名

    cn表示中國,us表示美國,uk表示英國,當然還有一些特殊地區也有所謂的國家頂級域名,比如hk表示香港

  • 通用頂級域名

    com表示公司企業,net表示網路服務機構,org表示非營利組織,edu表示美國教育機構(中國的教育機構一般來說是xxx.edu.cn),gov表示美國政府部門(中國的政府部門一般來說是xxx.gov.cn)等。

  • 基礎結構域名

    不常見,不做敘述。

所以說,在中國,企業的域名一般可以是xxx.comxxx.com.cnxxx.cn

下面這個域名樹,清晰地展示了網際網路的域名空間:

網際網路的域名結構

在圖中,edu.cn下面,劃分除了很多三級域名,如tsinghuapku等,一旦某個單位有了一個域名,它就可以自己決定是否要進一步劃分下屬的子域,域名樹的樹葉節點就是單臺計算機的名字,不能再繼續劃分了,例如mailwww這兩臺計算機的完整域名分別為mail.tsinghua.edu.cnwww.tsinghua.edu.cn(這裡起什麼名字都可以,一般來說,人們願意把用作郵件伺服器的計算機叫做mail,把用作網站的伺服器叫做www)。

到這裡,我們已經知道了為什麼要有域名以及域名的結構,域名就是為了便於人們記憶而產生的,但是域名是方便人們記憶了,計算機反而不好處理了,它更善於處理IP地址這種東西,所以這裡就用到了我們要講的DNS協議,用來把域名對映到IP地址,在瞭解DNS解析域名的過程之前,我們還需要了解一下域名伺服器這種東西(怎麼這麼多東西,寫個部落格好麻煩啊23333)。

2. 域名伺服器(DNS伺服器)

上面說到了域名體系的樹狀結構,為了實現域名系統,我們首先想到的就是在域名樹的每個節點都設定一臺對應的伺服器,這樣就可以了,但是這樣做的後果就是導致域名伺服器太多,域名系統的執行效率太低,所以,通常是將好多個節點劃分為一個區,用分割槽的方式來實現域名系統,如下圖:

DNS分割槽

其中,(a)是abc這個公司只設定了一個分割槽的樣子,(b)是abc公司設定了兩個分割槽的樣子,這兩個區分別為abc.comy.abc.com,這兩個區對應了兩個許可權域名伺服器(後面還會提到)。下圖可以看出域名伺服器的層次結構:

域名伺服器的層次結構

由上圖可以看出,根據域名伺服器起的作用,可以把域名伺服器分為四種不同的型別:

  • 根域名伺服器

    根域名伺服器對應的是域名樹中的根節點,是最高層次的域名伺服器,但是並不是只有一臺,而是有好多臺,總共有13個不同IP地址的根域名伺服器,用a到m來表示,如a.rootservers.net,每個IP地址對應一套裝置,一套裝置在世界不同地點安裝了伺服器,總之,數量很多,當訪問根域名伺服器時,往往就是由路由器找到最近的根域名伺服器訪問。

    一般來說,每臺根域名伺服器都知道所有的頂級域名伺服器的域名以及IP地址,但往往也只知道這些,所以訪問根域名伺服器一般只能得到頂級域名伺服器的IP地址,而不能直接知曉你要找的具體伺服器的IP。一般來講,如果要通過網際網路解析域名,本地域名伺服器首先訪問的就是根域名伺服器,下面還會講到。

  • 頂級域名伺服器

    頂級域名伺服器負責管理在頂級域名下的所有二級域名,例如cn是頂級域名伺服器,管理edugov等二級域名,當接收到查詢請求時,要麼給出最終結果(即具體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地址。如下圖:

域名查詢方式1

當然,我們也可以指定查詢方式讓查詢過程全程使用遞迴查詢,如下圖:

域名查詢方式2
下面以一個例子說說明在無快取的情況下(下面會談到快取),通過DNS來查詢域名的步驟,假設域名為m.xyz.com的主機想要查詢y.abc.com這個域名對應的IP地址,那麼他就會按照域名查詢方式1(上圖)中的方式進行查詢:

  1. 主機m.xyz.com先向本地域名伺服器dns.xyz.com進行遞迴查詢。
  2. 本地域名伺服器無法給出IP地址,所以本地域名伺服器向(離自己最近的)根域名伺服器查詢,這是的查詢已經變為了迭代查詢。
  3. 根域名伺服器根據本地域名伺服器傳送的報文,知道了下一步應該查詢的是哪個頂級域名伺服器,這時根域名伺服器告訴本地域名伺服器,下一步應該查詢的頂級域名伺服器dns.com的IP地址。
  4. 本地域名伺服器向頂級域名伺服器dns.com傳送請求查詢。
  5. 頂級域名伺服器dns.com告訴本地域名伺服器,下一步應該查詢的許可權域名伺服器dns.abc.com的IP地址。
  6. 本地域名伺服器向許可權域名伺服器dns.abc.com傳送請求查詢。
  7. 許可權域名伺服器dns.abc.com告訴本地域名伺服器想要查詢的域名y.abc.com的IP地址。
  8. 本地域名伺服器在拿到IP地址後,將IP地址返回給主機m.xyz.com。 這就是域名查詢的具體過程,因為DNS協議的基於UDP協議,所以上述8個步驟中,總共使用了8個UDP報文。

上面提到,這是在沒有快取的情況下的DNS查詢,實際上,為了提高查詢的效率以及降低根域名伺服器的負荷,一般來說域名伺服器中都有快取記憶體,用來記錄最近查詢過的域名的快取,如果在查詢域名時,有想要的域名到IP的對映快取,並且快取沒有過期,那麼就直接將快取中域名對映的IP地址返回,省去了接下來的查詢。只有在沒有快取或者快取過期了才會進行下一步的查詢。實際上,不知域名伺服器有快取,每臺計算機甚至瀏覽器都會對域名到IP的對映進行快取,這樣一來大大加快的DNS的查詢速度。

上面這些就是DNS協議的大概了,如果覺得有哪裡寫的不對的,還請多多指教。

參考書籍:《計算機網路》謝希仁

相關文章