想知道你輸入 www.bilibili.com 后,主機是怎么找到 www.bilibili.com 的 IP 地址嗎?那就跟着這篇博客開始吧!!
博客將按下列順序展開:
一、DNS 解決的問題。
因特網上的主機主要可以用兩種方式進行標識,一種是對人類友好的域名地址(如 www.bilibili.com),另一種就是 IP 地址(例如 120.92.168.51 ,可以用命令 ping + 域名 得到)。
因此需要一個可以將 域名 和 IP 地址相互映射的目錄服務,這就是 域名服務系統(Domain Name System , DNS) 的主要任務,也是它解決的問題。
二、DNS 的定義和提供的服務。
1. DNS 的定義:
1) 由多層的 DNS 服務器實現的 分布式數據庫。
2.)使得主機能夠查詢分布式服務器的 應用層協議。
DNS 是 Internet 核心功能,用應用層協議實現。
這里有一個疑問,DNS 既然是 Internet 核心功能,為什么不在更底層實現,而是在應用層實現呢?
這與互聯網 TCP/IP 協議原則相符,希望端系統復雜,而網絡核心越簡單越好。那么 DNS 在應用層實現,那么就不必再網絡核心實現,降低了網絡核心的復雜性。
2. DNS 提供的服務
1) 域名向 IP 地址的翻譯。
a)同一台主機上運行着 DNS 應用的客戶端。
b)瀏覽器從 URI 中抽取出主機名 www.cnblogs.com ,並將這台主機名傳給 DNS 客戶端。
c)DNS 客戶端向 DNS 服務器發送一個包含主機名的請求。
d)DNS 客戶端最終會收到一份回答報文,其中包含有對應於該主機名的 IP 地址。
e)一旦瀏覽器接收到來自 DNS 的該 IP 地址,它能夠向位於該 IP 地址 80 端口的 HTTP 服務器進程發送一個 TCP 連接。
2) 主機別名。
例如一台名為 relay1.west-coast.enterprise.com 的主機,可能還有兩個別名為 enter-prise.com 和 www.enterprise.com。
3) 郵件服務器別名。
與前者類似,例如 Bob 的雅虎郵件有一個賬號為 bob@yahoo.com ,但是雅虎郵件服務器的主機名可能更為復雜,不像 yahoo.com 這么好記(可能為 relay1.west-coast.enterprise.com,即規范主機名),所以應用程序可以調用更 DNS 來獲取更容易記憶的主機別名對應的規范別名以及主機的 IP 地址。
4) 負載分配。
DNS 也用於冗余的服務器之間進行負載分配。繁忙的站點被冗余分布在多台服務器上,每台服務器均運行不同的端系統上,每一個都有不同的 IP 地址。
例如,假設每天有 30 萬對 bilibili 的訪問請求,如果只有一台服務器回應請求是不是很容易崩掉?這個時候 DNS 就可以進行負載分配。
這是一個 IP 地址集合,對應一個規范主機名的規范。
例如 以上四個服務器的 IP 地址都對應着 www.bilibili.com 的映射,當客戶對映射着 www.bilibili.com 發出一個 DNS 請求時,該服務器用 整個 IP 地址的集合進行相應。但在每個回答中循環這些地址次序,客戶通常向 IP 地址排在最開始的服務器發送 HTTP 請求報文。例如以下是我對 www.bilibili.com 調用 ping 命令得到的結果,可以看到,兩次返回的 IP 地址是不一樣的。
三、DNS 的結構:分布式層次數據庫。
1. 結構
a)根 DNS 服務器
全球的根服務器由 13 個不同的組織管理,而其中沒有一個是中國。
這篇連接會告訴你為什么中國不能增加第 14 個根域名服務器:https://zhidao.baidu.com/question/2202931536625902308.html
b) 頂級域(DNS)服務器
對於每一個頂級域(如 com、org、net、edu 和 gov)和所有國家的頂級域(如 uk、fr、cn、jp),都有 TLD 服務器。
c) 權威 DNS 服務器
在因特網上具有公共可訪問主機的每個組織機構必須提供公共可訪問的 DNS 記錄,這些記錄將這些主機的名字映射為 IP 地址。
2. 查詢
a)遞歸查詢+迭代查詢
首先說明 本地 DNS 服務器 (local DNS server) 概念:
本地 DNS 服務器並不屬該 於該服務器的層次結構。每一個 ISP 都有一台本地 DNS 服務器。當主機與ISP 連接時,該 ISP 提供提供一台主機的 IP 地址,該主機會存有一台或多台本地 DNS 服務器的IP 地址。
當主機發出 DNS 請求時,該請求被發送到本地 DNS 服務器,它起着代理的作用,並將該請求轉發到 DNS 服務器層次結構中。
(上方的圖來自 mooc網 哈爾濱工業大學 計算機網絡課程 聶蘭順老師的ppt內容,這里將訪問主機改了)
下面說說上圖的 DNS 請求過程:
假設 cis.poly.edu 想知道 bilibili.com 的 IP 地址。同時 cis.poly.edu 的本地 DNS 服務器為 dns.poly.edu,www.bilibili.com 通過查詢可知,它的權威域名為 ns3.dnsv5.com
1)主機 cis.poly.edu 首先向它的本地 DNS 服務器發出 DNS 查詢報文,其中包含有要查詢的 bilibili.com 主機名。
2)本地 DNS 服務器將該查詢報文轉發給根 DNS 服務器。
3)根服務器注意到 com 前綴,並返回負責 com 的 TLD 的 IP 地址列表。
4)本地 DNS 服務器再次向這些 TLD 服務器之一發送查詢報文。
5)該 TLD 服務器注意到 dnsv5.com ,並用權威服務器的 IP 地址進行相應,該權威 DNS 服務器是 ns3.dnsv5.com。
6)本地 DNS 服務器之間向 ns3.dnsv5.com 重發查詢報文。
7)ns3.dnsv5.com用 www.bilibili.com 的 IP 地址進行相應。
8)本地 DNS 服務器將收到的回復發回給 主機。
說明:上方的查詢同時用了遞歸查詢和迭代查詢,
從 cis.poly.edu 到 dns.poly.edu 的查詢時遞歸查詢,因為該查詢是以自己的名義請求 dns.poly.edu 來獲得映射。
后三個查詢時迭代查詢,因為所有的回答都是之際返回給 dns.poly.edu 的。
其中還想說明的一點是,由圖可以看出,www.bilibili.com 的規范主機名其實是 interface.biliapi.com。主服務器名是 ns3.dnsvb.com。
b)遞歸查詢
下圖主要采用 遞歸查詢
實踐時,第一種方法用的多。
四、DNS 緩存。
目的:為了改善時延性能並減少在 Internet 上DNS 查詢報文的數量,DNS 廣泛采用 DNS 緩存技術。
原理:在一個請求鏈中,當某一個 DNS 服務器接收到一個 DNS 回答時,它能映射緩存到本地存儲中。
其中,由於主機和主機名與 IP 地址間的映射不是永久的,DNS 服務器在一段時間后(通常為兩天)將丟棄緩存的信息。
五、DNS 記錄與消息格式 (以下簡述較為簡略,圖片來自 mooc網 計算機網絡 聶蘭順老師)
DNS 的傳輸層協議是 UDP
1. 資源記錄
共同實現 DNS 分布式數據庫的所有 DNS 服務器存儲了 資源記錄(Resource Record) RR,RR 提供了主機名到 IP 地址的映射。每一條 DNS 回答報文都包含一條或多條 資源記錄。
資源記錄是一個包含下列字段的 4 元組:
( Name, Value, Type, TTL)
TTL 記錄的生存時間,它決定了資源記錄應當從緩存中刪除的時間。 Name 和 Value 的值取決於 Type。
2. DNS 協議
DNS 協議有 查詢 和 回復 ,兩種消息的格式相同。
1) 前 12 個字節是 首部區域
2)問題區域 :包含正在進行的查詢信息
3)回答區域(來自 DNS 服務器):對最初請求的名字的資源記錄。
4)權威區:包含其他權威服務器的記錄
5)附加信息:包含其他幫助的記錄。
3. 如何注冊一個域名