標籤:

DNS域名解析解剖

DNS:Domain Name System(域名服務系統)

DNS的常見用法:將伺服器名稱和 IP 地址進行關聯,但它還可以將郵件地址和郵件伺服器進行關聯,以及為各種信息關聯相應的名稱。

為什麼需要ip地址

TCP/IP 網路是通過 IP 地址來確定通信對象的,不知道 IP 地址就無法將消息發送給對方,因此,在委託操作系統發送消息時,必須要先查詢好對方 的 IP 地址。

TIP:如果 Web 伺服器使用了虛擬主機功能,有可能無法通過 IP 地址來訪問。因為虛擬主機是寄存在伺服器上的一個或多個沒有實體的伺服器,訪問虛擬主機的域名的時候,先根據DNS解析的IP訪問到實體主機,然後實體主機再根據域名把連接轉發給對應的虛擬主機,DNS解析的IP只是實體主機的IP(並不是要訪問的web應用伺服器IP地址)。

域名和 IP 地址並用的理由

  • 不用IP 地址,而是用名稱來確定通信對象?

    IP 地址的長度 為 32 比特( 4 位元組),使用域名最少也要幾十個位元組,最長可達到255位元組,增加了路由器的負擔,傳送數據也會花費更長的時間 ,運行效率較低。(路由轉發包傳輸數據)
  • 瀏覽器網址中不寫伺服器的名字,直接寫IP 地址?

    用IP地址來代替伺服器名稱也是能夠正常工作的 。然而,要記住一串由數字組成的 IP 地址也非常困難
  • 讓人來使用名稱,讓路由器來使用IP地址。

    為了填補兩者之間的障礙,需要有一個機制能夠通過名稱來查詢IP地址,或者通過IP 地址來查詢名稱,這個機制就是DNS

TCP/IP 的結構

TCP/IP是是由一些小的子網,通過路由器連接起來組成一個大的網路(子網:用集線器連接起來的幾台計算機),在網路中所有的設備都會被分配一個地址,這個地址就相當於現實中某條路上的「×× 號 ×× 室」,(號:分配給整個子網的,室:分配給子網中的計算機的,「號」對應的號碼稱為網路號,「室」對應的號碼稱為主機號)這個地址的整體稱為IP地址 。通過IP地址我們可以判斷出訪問對象伺服器的

位置,從而將消息發送到伺服器

發送者發出的消息先經過子網中的集線器,轉發到最近的路由器,接下來路由器會根據消息的目的地判斷下一個路由器的位置,然後將消息發送到下一個路由器(即消息再次經過子網內的集線器被轉發到下一個路由器),前面的過程不斷重複,最終消息被傳送到了目的地。

實際的IP地址

實際的 IP 地址是一串 32 比特的數字,按照 8 比特(1 位元組)為一組分成 4 組,分別用十進位表示,然後再用圓點隔開。

在 IP 地址的規則中,網路號和主機號連起來總共 32 比特,但這兩部分的具體結構是不固定的(在組建網路時,用戶可以自行決定它們之間的分配關係),無法區分哪部分是網路號,哪部分是主機號。因此:需要另外的附加信息來表示 IP 地址的內部結構。這就需要用到子網掩碼,子網掩碼的格式是一 串與IP地址長度相同的32比特數字,左邊一半都是1,右邊一半都是0。子網掩碼為1的部分表示網路號,子網掩碼為0的部分表示主機號。

IP 地址的主機號:

  • 全 0:表示整個子網
  • 全 1:表示向子網上所有設備發送包,即「廣播」

瀏覽器是如何向 DNS 伺服器發出查詢

  • 瀏覽器搜索自身的DNS緩存:

    首先瀏覽器會去搜索自身的DNS緩存,看緩存有沒有過期,過期的話緩存的解析就結束了(chrome緩存的時間只有一分鐘,查看chrome的緩存可打開:chrome://net-internals/#dns )。
  • 搜索操作系統自身的DNS緩存:

    如果瀏覽器沒有找到緩存或者緩存過期失效,瀏覽器就會搜索操作系統自身的緩存,沒有找到或者失效,解析結束(操作系統的緩存:window系統是一天,mac系統嚴格根據DNS協議中的TTL)。
  • 讀取本地的hosts文件:

    若操作系統的緩存也沒有找到或失效,瀏覽器就會去讀取本地的hosts文件(Hosts文件也可以建立域名到IP地址的綁定關係,可以通過編輯Hosts文件來達到名稱解析的目的。 例如,我們需要屏蔽某個域名時,就可以將其地址指向一個不存在IP地址,以達到屏蔽的效果)。
  • 瀏覽器發起一個DNS的系統調用:

    hosts中沒有找到對應的配置項的話,瀏覽器發起一個DNS的調用(向本地主控DNS服務,一般來說是你的運營商提供的)。

解析器與DNS伺服器之間的交互過程

通過 DNS 查詢 IP 地址的操作稱為域名解析,負責執行解析這一操作的就叫解析器。 解析器實際上是一段程序,它包含在操作系統的 Socket 庫中 (Socket 庫可以讓其他的應用程序調用操作系統的網路功能 )。

解析器的用法非常簡單,編寫應用程序(這裡也就是指瀏覽器)時,如下圖寫上解析器的程序名稱(gethostbyname)以及web服務的域名(lab.glasscom.com/)進行調用就可以了,這樣就完成了對解析器的調用。

應用程序調用解析器圖:

整個解析器的工作流程圖:

  • 調用解析器後,解析器會向 DNS 伺服器(運營商提供的)發送查詢消息。
  • 運營商服務會先查找自身緩存找到對應條目,沒有過期,解析成功,若沒找到對應條目,主控伺服器會代替瀏覽器發起一個迭代的DNS解析的請求,先查找根域的),運營商伺服器拿到域名的IP,返回給操作系統的內核,同時緩存在了自己的緩存區,操作系統內核從DNS服務商拿來的IP地址返回給瀏覽器。
  • 瀏覽器再向 Web 伺服器發送消息時,只要從該內存地址取出 IP地址,將它與 HTTP 請求消息一起交給操作系統 .

TIP:向 DNS 伺服器發送消息時,我們當然也需要知道 DNS 服 務器的 IP 地址。只不過這個 IP 地址是作為 TCP/IP 的一個設置項目事先設 置好的,不需要再去查詢了。

DNS伺服器的基本工作

DNS 伺服器的基本工作就是接收來自客戶端的查詢消息,然後根據消息的內容返迴響應

來自客戶端的查詢消息包含以下 3 種信息

  • 域名:伺服器、郵件伺服器(郵件地址中@後面的部分)的名稱 。
  • Class:用來識別網路的信息(在最早設計 DNS 方案時,DNS 在互聯網以外的其他網路中的應用也被考慮到了。不過,如今除了互聯網並沒有其他的網路了,因此 Class 的值永遠是代表互聯網的 IN )。
  • 記錄類型 :表示域名對應何種類型的記錄(例如,A :表示域名對應的是 IP 地址,MX :表示域名對應的是郵件伺服器。對於不同的記錄類型,伺服器向客戶端返回的信息也會不同 )。

DNS 伺服器上事先保存有前面這 3 種信息對應的記錄數據,DNS 伺服器的基本工作就是根據需要查詢的:域名和記錄類型查找相關的記錄,並向客戶端返迴響應消息。

DNS服務上的信息是如何在 DNS 伺服器上註冊並保存的

DNS 伺服器中的所有信息都是按照域名以分層次的結構來保存的,層次有點號來劃分:主機名.次級域名.頂級域名.根域名(host.sld.tld.root),越靠近右邊級別越高,所有域名後面都是帶有根域的,但是一般都省略掉了。

次級域名域名是用戶可以註冊的,再下一級是主機名(host),又稱為"三級域名",這是用戶在自己的域裡面為伺服器分配的名稱,是用戶可以任意分配的。

前面說過若運營商服務里沒有找到對應的條目,就會發起一個DNS迭代請求,首先就是查找根域伺服器,那麼運營商的服務了一定要保存有根域服務的IP地址。因為全球共有13台根邏輯域名伺服器:A-M,2014年統計的真實的根伺服器有386台,將根域的 DNS 伺服器信息保存在互聯網中所有的 DNS 伺服器中也不是什麼難事。如何實現呢:根域 DNS 伺服器的相關信息已經包含在 DNS 伺服器程序的配置文件中了,因此只要安裝了 DNS 伺服器程序,這些信息也就被自動配置好了。

運營商DSN伺服器發起的迭代請求

首先運營商服務從已經配置好的信息中拿到根域名的IP地址(這裡假設根域只有一個,實際是想13個根域發起請求),然後像根域發起請求群問:"請問lab.glasscom.com的IP地址是多少?",根域名查詢記錄數據後沒有找到,回答:"我不知道它的IP地址,不過我知道.com的權威伺服器(ns)的地址,它是xxx.xxx.xxx.xxx,你去問它吧"。運營商服務運營商服務拿到.com的IP地址,根據IP地址發起另一個請求去詢問.com伺服器問:"請問lab.glasscom.com的ns的IP地址是多少?",.com域伺服器查找自身記錄數據後回答:「我不知道,我只知道.glasscom.com的IP地址」。 以此類推,只要重複前面的步驟,就可以順藤摸瓜找到目標DNS伺服器,只要向目標DNS 伺服器發送查詢消息,就能夠得到我們需要的答案,也就是 lab.glasscom.com 的 IP 地址了。

通過緩存加快 DNS 伺服器的響應

  • 真實互聯網中:一台 DNS 伺服器可以管理多個域的信息,上下級域共享同一 台 DNS 伺服器,訪問上級 DNS 伺服器時就可以向下跳過一級 DNS 伺服器,直接返回再下一級 DNS 伺服器的相關信息。
  • DNS 伺服器有緩存功能:並不需要從根域開始查找,通過緩存可以直接返迴響應,接下來的查詢可以從緩存的位置開始向下進行。相比每次都從根域找起來說,緩存可以減少查詢所需的時間。
  • 信息被緩存後,原本的註冊信息可能會發生改變,這時緩存中的信息就有可能是不正確的,因此緩存信息會設置有效期,當緩存中的信息超過有效期後,數據就會從緩存中刪除。

命令來查看整個DNS請求過程:

顯示整個查詢過程:dig baidu.com dig +short baidu.com

其它更多查詢命令可以參考阮一峰老師的文章:DNS 原理入門 - 阮一峰的網路日誌


推薦閱讀:

Cobalt Strike的特殊功能(external_C2)探究
從Chrome源碼看DNS解析過程
我所在地區DNS為202.100.64.68,路由器中默認的是118.118.118.11?
顯性URL和隱性URL有什麼區別?

TAG:DNS |