...

36 張圖詳解 DNS :網絡世界的導航

2021-07-23


我們平時(shí)在訪問網站時(shí),不使用 IP 地址,而是網站域名。但是抓包發(fā)現:交互報文是以 IP 地址進(jìn)行的。那麼(me) IP 地址是從哪來的呢?這(zhè)是因爲 DNS 把網站域名自動轉換爲 IP 地址



DNS 出現

TCP/IP 是基于 IP 地址進(jìn)行通信的,但是 IP 地址不太好(hǎo)記。于是出現了另一種(zhǒng)方便記憶的标識符,那就(jiù)是主機名。爲計算機配置主機名,在進(jìn)行網絡通信時(shí),直接使用主機名,而不用輸入一大串的 IP 地址。同時(shí),系統通過(guò)一個叫(jiào) hosts 的文件,實現主機名轉換 IP 地址的功能(néng)。hosts 文件包括主機名和 IP 地址的對(duì)應關系。當需要通過(guò)主機名訪問主機時(shí),它就(jiù)會(huì)查看本地的 hosts 文件,從文件中找到相對(duì)應的 IP 地址,然後(hòu)進(jìn)行報文發(fā)送。如果在 hosts 文件中沒(méi)找到相關信息,則主機訪問失敗。

hosts 文件是主機的本地文件,優點是查找響應速度快。它主要用來存儲一些本地網絡的主機名和 IP 地址的對(duì)應信息。這(zhè)樣,主機在以主機名訪問本地網絡主機時(shí),通過(guò) hosts 文件可以迅速獲得相應的 IP 地址。



每台主機的 hosts 文件都(dōu)需要單獨手工更新。随著(zhe)網絡規模的不斷擴大、接入計算機的數量不斷增加,維護難度越來越大,每台主機同步更新,幾乎是一件不可能(néng)完成(chéng)的任務。



爲了解決 hosts 文件維護困難的問題,出現了 DNS 域名系統,一個可以解決主機名和 IP 地址互相轉換的系統。無論網絡規模變得多麼(me)龐大,都(dōu)能(néng)在一個小範圍内通過(guò) DNS 進(jìn)行管理。



DNS 介紹

DNS ,全稱 Domain Name System 。采用 client/server 模式,DNS client 發(fā)出查詢請求,DNS server 響應請求。DNS client 通過(guò)查詢 DNS server 獲得主機的 IP 地址,進(jìn)而完成(chéng)後(hòu)續的 TCP/IP 通信過(guò)程。



當 Windows 系統用戶使用 nslookup hostname/domainname 命令時(shí),DNS 會(huì)自動查找注冊了主機名和 IP 地址的數據庫,并返回對(duì)應的 IP 地址。



DNS 域名

先了解什麼(me)是域名,才能(néng)理解 DNS 。域名是爲了識别主機名或機構的一種(zhǒng)分層的名稱。因爲單獨的一台域名服務器是不可能(néng)知道(dào)所有域名信息,所以域名系統是一個分布式數據庫系統,域名(主機名)到 IP 地址的解析可以由若幹個域名服務器共同完成(chéng)。每一個站點維護自己的信息數據庫,并運行一個服務器程序供互聯網上的客戶端查詢。DNS 提供了客戶端與服務器的通信協議,也提供了服務器之間交換信息的協議。由于是分布式系統,即使單個服務器出現故障,也不會(huì)導緻整個系統失效,消除了單點故障。

DNS 域名組成(chéng)

DNS 域的本質是一種(zhǒng)管理範圍的劃分,最大的域是根域,向(xiàng)下可以劃分爲頂級域二級域三級域四級域等。相對(duì)應的域名是根域名頂級域名二級域名三級域名等。不同等級的域名使用點号分隔,級别最低的域名寫在最左邊,而級别最高的域名寫在最右邊。



舉個栗子:網站域名 http://www.tsinghua.edu.cn 中,從右到左開(kāi)始,cn 是頂級域名,代表中國(guó),edu 是二級域名,代表教育機構,tsinghua 是三級域名,表示清華大學(xué),www 則表示三級域名中的主機,并提供了 web 服務。



除了 www 主機外,常見的主機還(hái)有 arch 、sem 、mail ,域名如下:



每一級的域名都(dōu)由英文字母數字組成(chéng),域名不區分大小寫,長(cháng)度不能(néng)超過(guò) 63 字節,一個完整的域名不能(néng)超過(guò) 255 個字節。根域名用 “ . ”(點)表示。目前我們看到的域名例子都(dōu)是完全合格域名( FQDN ),FQDN 的完整格式是以點結尾的域名。接入互聯網的主機、服務器或其它網絡設備都(dōu)可以擁有一個唯一的 FQDN 。與 FQDN 對(duì)應的,系統中的默認域名是非合格域名,會(huì)把當前的區域域名添加到尾部。例如,tsinghua 域内的主機上查找 mail ,本地解析器就(jiù)會(huì)將(jiāng)這(zhè)個名稱轉換爲 FQDN ,即 http://mail.tsinghua.edu.cn ,然後(hòu)解析出 IP 地址。



DNS 域名空間

域名空間結構像是一棵倒過(guò)來的樹,也叫(jiào)做樹形結構根域名就(jiù)是樹根( root ),用點号表示,往下是這(zhè)棵樹的各層枝葉。根域名的下一層叫(jiào)頂級域名,頂級域名包括三大類:



  • 國(guó)家頂級域名

國(guó)家頂級域名采用 ISO3166 的規定。比如:.cn 表示中國(guó),.us 表示美國(guó),.uk表示英國(guó)等。現在使用的國(guó)家頂級域名大約在 200個左右。



  • 國(guó)際頂級域名

國(guó)際頂級域名采用 .int 。國(guó)際性的組織可以在 .int 下注冊。

  • 通用頂級域名



最早的頂級域名共有 6 個。分别爲:

.com 表示公司企業,

.net 表示網絡服務機構,

.org 表示非盈利組織,

.edu 表示教育機構(僅限美國(guó)),

.gov 表示政府部門(僅限美國(guó)),

.mil 表示軍事(shì)部門(僅限美國(guó))。

随著(zhe)互聯網用戶不斷增加,又增加了 7 個通用頂級域名。分别爲:

.aero 用于航空運輸業,

.biz 用于公司和企業,

.coop 用于合作團體,

.info 用于各種(zhǒng)情況,

.museum 用于博物館,

.name 用于個人,

.pro 用于自由職業者。

頂級域名下面(miàn)是二級域名。國(guó)家頂級域名下注冊的二級域名均由國(guó)家自行确定。我國(guó)二級域名分爲類别域名行政域名兩(liǎng)大類,類别域名如:.com ,.edu ,.gov 等分别代表不同的機構;行政域名如:.bj 表示北京,.sh 表示上海,代表我國(guó)各省、自治區及直轄市等。



二級域名下面(miàn)是三級域名四級域名等。命名樹上任何一個節點的域名就(jiù)是從這(zhè)個節點到最高層的域名串起(qǐ)來,中間以 “ . ” 分隔。



在域名結構中,節點在所屬域中的主機名标識可以相同,但是域名必須不同。比如:清華大學(xué)和新浪公司下都(dōu)有一台主機的标識是 mail ,但是兩(liǎng)者的域名卻是不同的,前者爲 http://mail.tsinghua.edu.cn ,而後(hòu)者爲 http://mail.sina.com.cn 。



DNS 域名解析

將(jiāng)域名轉換爲對(duì)應的 IP 地址的過(guò)程叫(jiào)做域名解析。在域名解析過(guò)程中,DNS client 的主機調用解析器( Resolver ),向(xiàng) DNS server 發(fā)出請求,DNS server 完成(chéng)域名解析。



域名解析是按照 DNS 分層結構的特點,自頂向(xiàng)下進(jìn)行的。但是如果每一個域名解析都(dōu)從根域名服務器開(kāi)始,那麼(me)根域名服務器有可能(néng)無法承載海量的流量。在實際應用中,大多數域名解析都(dōu)是在本地域名服務器完成(chéng)。通過(guò)合理設置本地域名服務器,由本地域名服務器負責大部分的域名解析請求,提高域名解析效率。



DNS 解析器

從應用程序的角度看,訪問 DNS 是通過(guò)一個叫(jiào)解析器( Resolver )的應用程序來完成(chéng)的。發(fā)送一個 TCP 或 UDP 數據包之前,解析器必須將(jiāng)域名(主機名)轉換爲 IP 地址。一個解析器至少要注冊一個域名服務器的 IP 地址。通常,它至少包括本地域名服務器的 IP 地址。



DNS 域名服務器

DNS 域名空間的層次結構,允許不同的域名服務器管理域名空間的不同部分。域名服務器是指管理域名的主機及軟件,它可以管理所在分層的域。其所管理的分層叫(jiào)做區域( zone )。一個 zone 是 DNS 域名空間的一棵子樹,它可以單獨管理而不受其它 zone 影響。每層都(dōu)設有一個域名服務器。



根所設置的 DNS 叫(jiào)做根域名服務器,它對(duì) DNS 的檢索數據功能(néng)起(qǐ)著(zhe)至關重要的作用。根域名服務器中注冊了頂級域名服務器的 IP 地址。如果想要新增一個一級域名,或者修改已有的頂級域名,就(jiù)要在根域名服務器中進(jìn)行新增或變更。

類似的,頂級域名服務器中注冊了二級域名服務器的 IP 地址。如果域名服務器下面(miàn)沒(méi)有其它分層,就(jiù)可以自由地指定主機名稱。如果想重新設置域名服務器的 IP 地址或修改域名,必須在上一層的域名服務器中進(jìn)行修改。

域名和域名服務器都(dōu)需要按照分層進(jìn)行設置。如果域名服務器出現故障,那麼(me)針對(duì)這(zhè)個域的 DNS 查詢就(jiù)無法正常工作。因此,爲了提高可用性,至少設置兩(liǎng)台域名服務器。一旦第一台域名服務器無法提供查詢時(shí),就(jiù)會(huì)自動轉到第二個甚至第三個域名服務器上進(jìn)行。

DNS 域名服務器類型

  • 本地域名服務器

互聯網接入服務運營商或者一個大的網絡機構,像公司、大學(xué)等都(dōu)有一台或多台可以自行管理的域名服務器,這(zhè)類域名服務器稱爲本地域名服務器,也稱爲默認域名服務器。本地域名服務器離客戶端較近。當一個 DNS客戶端發(fā)出 DNS 查詢時(shí),首先送到本地域名服務器。如果本地域名服務器數據庫中有對(duì)應的域名信息,會(huì)將(jiāng)查詢的域名轉換爲 IP 地址返回客戶端。如果沒(méi)有,它會(huì)以 DNS 客戶端的身份向(xiàng)根域名服務器進(jìn)行查詢。根域名服務器收到本地域名服務器的查詢後(hòu),會(huì)返回相關域名服務器的 IP 地址,本地域名服務器再向(xiàng)相關域名服務器發(fā)送查詢請求。



  • 根域名服務器

通常根域名服務器用來管理頂級域,本身并不對(duì)域名進(jìn)行解析,但它知道(dào)相關域名服務器的 IP 地址。IPv4 根域名服務器全球有 13 台,主機名分别爲 A ~ M 。1 台爲主根服務器在美國(guó),其餘 12 個均爲輔根服務器,其中 9 個在美國(guó),2 個在歐洲,位于英國(guó)和瑞典,1 台在亞洲,位于日本。所有的域名服務器都(dōu)必須注冊根域名服務器的 IP 地址,因爲 DNS 根據 IP 地址進(jìn)行檢索時(shí),需要按順序從根域名服務器開(kāi)始。



  • 授權域名服務器

互聯網上的主機在域名服務器上進(jìn)行注冊,這(zhè)個域名服務器就(jiù)是主機的授權域名服務器。通常,主機的授權域名服務器就(jiù)是本地域名服務器。實際上,主機會(huì)有兩(liǎng)個授權域名服務器,防止單點故障。授權域名服務器上有注冊主機域名與 IP 地址的映射信息,當查詢注冊主機域名時(shí),它會(huì)返回相應主機的 IP 地址。如果主機域名和 IP 地址需要進(jìn)行變更,隻需要在授權域名服務器處理即可,不用再向(xiàng)其它域名服務器進(jìn)行申請或報告。



  • 主域名服務器

主域名服務器是完成(chéng)一個或多個區域域名解析工作的主要域名服務器,通常也是一個或多個區域的授權域名服務器。主域名服務器有區域内主機地址信息的源數據文件,并且是區域傳送中區域數據的唯一來源。

  • 輔助域名服務器

輔助域名服務器可以協助主域名服務器提供域名查詢服務,在主機很多的情況下,可以有效分擔主域名服務器的壓力。輔助域名服務器也有冗餘功能(néng),當主域名服務器故障時(shí),輔助域名服務器能(néng)夠在數據有效期内繼續爲主機提供域名解析服務。



一台主域名服務器可以有多台輔助域名服務器,一台輔助域名服務器也可以是其它區域的主域名服務器。輔助域名服務器中包含區域内主機地址數據的授權信息,通過(guò)區域配置文件副本的方式存儲。輔助域名服務器也是區域的授權域名服務器,可以完成(chéng)本區域内域名查詢的授權回答。

輔助域名服務器并不建立數據文件,它獲得區域數據的唯一途徑就(jiù)是通過(guò)區域傳送的方式,從主域名服務器上獲得區域數據的最新副本。獲得數據副本的方式有兩(liǎng)種(zhǒng),第一種(zhǒng)是輔助域名服務器定期主動獲得主域名服務器的副本,或更新副本中的數據。第二種(zhǒng)是主域名服務器在區域數據發(fā)生變化時(shí),及時(shí)通知輔助域名服務器更新副本中的數據。

DNS 域名完整解析過(guò)程



DNS 客戶端進(jìn)行域名 http://www.tsinghua.edu.cn 的解析過(guò)程如下:

  1. DNS 客戶端向(xiàng)本地域名服務器發(fā)送請求,查詢 http://www.tsinghua.edu.cn 主機的 IP 地址;

  2. 本地域名服務器查詢數據庫,發(fā)現沒(méi)有域名爲 http://www.tsinghua.edu.cn 的主機,于是將(jiāng)請求發(fā)送給根域名服務器;

  3. 根域名服務器查詢數據庫,發(fā)現沒(méi)有這(zhè)個主機域名記錄,但是根域名服務器知道(dào) cn 域名服務器可以解析這(zhè)個域名,于是將(jiāng) cn 域名服務器的 IP 地址返回給本地域名服務器;

  4. 本地域名服務器向(xiàng) cn 域名服務器查詢 http://www.tsinghua.edu.cn 主機的 IP 地址;

  5. cn 域名服務器查詢數據庫,也沒(méi)有相關記錄,但是知道(dào) http://edu.cn 域名服務器可以解析這(zhè)個域名,于是將(jiāng) http://edu.cn 域名服務器的 IP 地址返回給本地域名服務器;

  6. 本地域名服務器再向(xiàng) http://edu.cn 域名服務器查詢 http://www.tsinghua.edu.cn 主機 IP 地址;

  7. http://edu.cn 域名服務器查詢數據庫,也沒(méi)有相關記錄,但是知道(dào) http://tsinghua.edu.cn 域名服務器可以解析這(zhè)個域名,于是將(jiāng) http://tsinghua.edu.cn 的域名服務器 IP 地址返回給本地域名服務器;

  8. 本地域名服務器向(xiàng) http://tsinghua.edu.cn 域名服務器查詢 http://www.tsinghua.edu.cn 主機的 IP 地址;

  9. http://tsinghua.edu.cn 域名服務器查詢數據庫,發(fā)現有主機域名記錄,于是給本地域名服務器返回 http://www.tsinghua.edu.cn 對(duì)應的 IP 地址;

  10. 最後(hòu)本地域名服務器將(jiāng) http://www.tsinghua.edu.cn 的 IP 地址返回給客戶端,整個解析過(guò)程完成(chéng)。

DNS 傳輸層協議

DNS 域名服務器使用的端口号是 53 ,并且同時(shí)支持 UDP 和 TCP 協議。爲什麼(me)同時(shí)使用兩(liǎng)種(zhǒng)協議呢?

因爲 DNS 響應報文中有一個删減标志位,用 TC 表示。當響應報文使用 UDP 封裝,且報文長(cháng)度大于 512 字節時(shí),那麼(me)服務器隻返回前 512 字節,同時(shí) TC 标志位置位,表示報文進(jìn)行了删減。當客戶端收到 TC 置位的響應報文後(hòu),將(jiāng)采用 TCP 封裝查詢請求。DNS 服務器返回的響應報文長(cháng)度大于 512 字節。



UDP 報文最大長(cháng)度是 512 字節,最多可以包含 13 台根域名服務器數據,因此 ipv4 根域名服務器隻能(néng)限制在 13 個,且每個服務器使用單個字母命名,也是 IPv4 根服務器是從 A ~ M 命名的原因。



當輔助域名服務器啓動時(shí),將(jiāng)從主域名服務器執行區域傳送。正常運行過(guò)程中,輔助域名服務器也會(huì)定時(shí)向(xiàng)主域名服務器進(jìn)行查詢,以便了解主域名服務器數據是否發(fā)送變化。如果有變化,將(jiāng)執行一次區域傳送。因爲區域傳送的數據多,所以傳送的數據采用 TCP 封裝



因此,UDP 用于 client 和 server 的查詢和響應TCP 用于主從 server 之間的傳送

DNS 查詢方式

DNS 域名解析包括兩(liǎng)種(zhǒng)查詢( query )方式,一種(zhǒng)是遞歸查詢,另一種(zhǒng)是叠代查詢

遞歸查詢

DNS 服務器如果不能(néng)直接響應解析請求,它將(jiāng)繼續請求其它的 DNS 服務器,直到查詢域名解析的結果。查詢的結果可以是域名主機的 IP 地址,或者是域名無法解析。無論哪種(zhǒng)結果,DNS 服務器都(dōu)會(huì)將(jiāng)結果返回給客戶端。

舉個栗子:當本地域名服務器接收了客戶端的查詢請求,本地域名服務器將(jiāng)代表客戶端來找答案,而在本地域名服務器執行工作時(shí),客戶端隻是等待,直到本地域名服務器將(jiāng)最終查詢結果返回客戶端。



叠代查詢

如果 DNS 服務器查不到相應記錄,會(huì)向(xiàng)客戶端返回一個可能(néng)知道(dào)結果的域名服務器 IP 地址,由客戶端繼續向(xiàng)新的服務器發(fā)送查詢請求。對(duì)域名服務器的叠代查詢隻得到一個提示,則繼續查詢。

舉個栗子:本地域名服務器發(fā)送請求到根域名服務器,根域名服務器并沒(méi)有相應記錄,它隻是給本地域名服務器返回一個提示,引導本地域名服務器到另一台域名服務器進(jìn)行查詢。



客戶端在查詢 IP 地址時(shí),向(xiàng)本地域名服務器進(jìn)行遞歸查詢。如果本地域名服務器的數據庫有相應數據,則直接返回相應數據。如果沒(méi)有,則本地域名服務器向(xiàng)根域名服務器進(jìn)行叠代查詢。從根開(kāi)始對(duì)這(zhè)棵樹按照順序進(jìn)行遍曆,直到找到指定的域名服務器,并由這(zhè)個域名服務器返回相應的數據。客戶端和本地域名服務器會(huì)將(jiāng)收到的信息保存在緩存裡(lǐ),這(zhè)樣可以減少每次查詢時(shí)的性能(néng)消耗。

DNS 反向(xiàng)查詢

在 DNS 查詢中,客戶端希望知道(dào)域名對(duì)應的 IP 地址,這(zhè)種(zhǒng)查詢稱爲正向(xiàng)查詢。大部分的 DNS 查詢都(dōu)是正向(xiàng)查詢。與正向(xiàng)查詢對(duì)應的,是反向(xiàng)查詢它允許 DNS 客戶端通過(guò) IP 地址查找對(duì)應的域名。



爲實現反向(xiàng)查詢,在 DNS 标準中定義了特色域 in-addr.arpa 域,并保留在域名空間中,以便執行反向(xiàng)查詢。爲創建反向(xiàng)域名空間,in-addr.arpa 域中的子域是按照 IP 地址相反的順序構造的。

舉個栗子:http://www.tsinghua.edu.cn 的 IP 地址是 166.111.4.100 ,那麼(me)在 in-addr.arpa 域中對(duì)應的節點就(jiù)是 100.4.111.166 。



DNS 應用場景

靜态域名解析

域名解析分爲動态域名解析靜态域名解析。在解析域名時(shí),首先采用靜态域名解析,如果靜态解析不成(chéng)功,再采用動态域名解析。

靜态域名解析是通過(guò)靜态域名解析表進(jìn)行的,手動建立域名和 IP 地址之間的對(duì)應關系表,該表的作用類似于 Windows 操作系統下的 hosts 文件,可以將(jiāng)一些常用的域名放入表中。當 DNS client 需要域名所對(duì)應的 IP 地址時(shí),即到靜态域名解析表中去查找指定的域名,從而獲得所對(duì)應的 IP 地址,提高域名解析的效率。



動态域名解析

動态域名解析需要專用的域名服務器( DNS server )運行域名解析服務器程序,提供從域名到 IP 地址的映射關系,負責接收客戶端( DNS client)提出的域名解析請求。



DNS 代理

在使用了 DNS 代理( DNS proxy )功能(néng)的組網中,DNS client 將(jiāng) DNS 請求報文直接發(fā)送給 DNS proxy 。DNS proxy 會(huì)先查找本地域名解析表,如果未查詢到對(duì)應的解析表項,會(huì)將(jiāng) DNS 請求報文轉發(fā)給 DNS Server ,并在收到 DNS server 的應答報文後(hòu)將(jiāng)其返回給 DNS client ,從而實現域名解析。



因此,當 DNS server 的地址發(fā)生變化時(shí),隻需改變 DNS proxy 上的配置,無需逐一改變局域網内每個 DNS client 的配置,從而簡化了網絡管理。


飲水思源:

DNS與BIND - Paul Albitz

TCP/IP詳解 卷1:協議 - Kevin R.Fall

圖解TCP/IP - 竹下隆史

路由交換技術 - 杭州華三通信技術有限公司


來源:知乎