一、寫在開頭
在OSI七層協議模型中應用層是距離我們最近,且日后開發使用到最多的一層,在上一篇博文中我們已經學習了應用層中的HTTP協議,在本文中我們再一起來學一下DNS。啥?DNS不是很了解?那還不快往下看!
?其實早幾年和一個朋友聊天,當時,他是一個網絡條線的技術經理,向我吐槽說,現在來面試的很多都是學不好編程語言的,轉來搞網絡了,結果問一個DNS,他都整不明白,就這還好意思干網絡?我當時嚇得不敢說話,因為我自己對于網絡編程也是那種淺嘗輒止的心態,生怕他回頭問我一個問題,哈哈。
?
二、DNS的定義
DNS(Domain Name System)域名管理系統,是當用戶使用瀏覽器訪問網址之后,使用的第一個重要協議。DNS 要解決的是域名和 IP 地址的映射問題。
DNS是一個聯機的分布式數據庫系統,它具有分布式、層次化、模塊化等特點,它屬于應用層的協議,基于UDP傳輸,端口為53。
三、DNS服務器類別
我們上面說到DNS具有層次化結構,而這個層次化主要體現在它的服務器部署之上,DNS的域名層次結構是一棵樹,從「根域名服務器」到「頂級域名服務器」、「權威域名服務器」,再到「本地域名服務器」,而我們所有遇到的DNS服務器,都囊括在這四類之中。
「根域名DNS服務器」:是為提供TLD服務器的IP地址,目前世界上僅有13組根服務器,我國境內仍然沒有,不過后來任播應用后,DNS分解出1089個根域名服務器節點,而在我國便有了26個根域名服務器節點。
「頂級域名服務器(TLD服務器)」:頂級域名指的域名的后綴,像com、org、net等都是,不同國家也有自己的域名,如uk、ca、fr這些,我國的是cn。而頂級域名系統則是提供權威DNS服務器IP地址的。
「權威域名DNS服務器」:所有在因特網上具有公共可訪問主機的組織機構,必須提供可訪問的DNS記錄,而這些記錄里則保存著域名與IP映射等信息,而這些記錄則存儲在權威DNS服務器上。
「本地域名服務器」:每個 ISP(互聯網服務提供商)都有一個自己的本地 DNS 服務器。當主機發出 DNS 請求時,該請求被發往本地 DNS 服務器,它起著代理的作用,并將該請求轉發到 DNS 層次結構中。
那么了解了DNS的底層服務器結構,它們是如何合作的,或者說是通過怎樣的機制,達到解析域名,響應到對應的IP上的呢?繼續往下看!
四、DNS的解析過程
開局先上一張圖:
現在假設我們用瀏覽器去訪問“ www.baidu.com.cn” 的IP地址,那么DNS解析系統的整個解析過程大致可以分為如下這幾步:
第一步:客戶端向本地DNS服務器發送DNS請求報文,報文中包含域名 www.baidu.com.cn ,若本地DNS中有相應的記錄,直接反饋客戶端,若沒有則訪問根DNS服務器,繼續處理請求;
第二步:本地DNS服務器向根域名服務器發送請求,根域名服務器是域名系統的最頂層,它負責管理所有頂級域名(如.com、.net、.org以及國家和地區代碼如.cn)。根域名服務器會返回所查詢域(在這個例子中是“.cn”域)的主域名服務器的地址;
第三步:本地DNS在接收到根服務器返回的地址后,便向cn頂級域名服務器發送請求,一般到這里是有可能找到了對應的域名映射的IP地址的,但若還沒有,它會查詢自己的記錄以找到“.com.cn”域的主域名服務器(權威DNS服務器)地址返回;
第四步:本地DNS服務器只得繼續向權威DNS服務器發去請求,終于,www.baidu.com.cn已經向權威域名DNS備案過了,在這里找到了它對應的記錄,便把記錄返回給本地DNS;
第五步:本地dns服務器將收到的返回地址發給客戶端,同時寫入自己的緩存,以便下次查詢;
「需要注意的是:」 從請求主機到本地 DNS 服務器的查詢是遞歸的,其余的查詢時迭代的;當找不到相應記錄,會返回空結果,而不是超時信息。
五、DNS報文格式
DNS報文格式是DNS協議中用于客戶端和服務器之間通信的一種結構化數據格式。DNS報文主要分為兩種:查詢報文和回答報文,它們具有相同的格式。
DNS(Domain Name System,域名系統)報文是在域名解析過程中,DNS客戶端和DNS服務器之間傳輸的消息,其報文格式主要包括以下幾個部分:
「我們可以將其分成三個部分來看:」
報文頭部
「標識」:16位的標識符,用于標識該DNS報文,客戶端發送請求時會生成一個隨機的標識,服務器在響應時會使用相同的標識,以便客戶端能夠將響應與請求對應起來。
「標志」:16位的標志字段,包含多個標志位,用于表示報文的類型、操作碼、響應狀態等信息。例如,QR位表示是查詢報文(0)還是響應報文(1);OPCODE位表示操作碼,通常為標準查詢(0)等。
「問題數量」:16位的字段,指明報文中包含的問題記錄數量。
「回答數量」:16位的字段,指明報文中包含的回答記錄數量。
「權威機構數量」:16位的字段,指明報文中包含的權威機構記錄數量。
「附加信息數量」:16位的字段,指明報文中包含的附加信息記錄數量。
問題部分
回答部分、權威機構部分和附加信息部分
這三個部分的格式基本相同,每個部分都可以包含多個資源記錄,每個資源記錄的格式如下:
「域名」:與問題部分的查詢名稱格式相同,通常是被查詢域名或相關域名。
「類型」:16位的字段,與問題部分的查詢類型相對應,表示該資源記錄的類型。
「類」:通常為1,表示Internet類。
「生存時間」:32位的字段,以秒為單位,表示該資源記錄在緩存中的有效時間。
「資源數據長度」:16位的字段,指明后面的資源數據的長度。
「資源數據」:可變長度字段,包含與該資源記錄類型相關的具體數據,如A記錄的IP地址、NS記錄的域名服務器名稱等。
轉自https://www.cnblogs.com/JavaBuild/p/18613789
該文章在 2024/12/19 10:26:01 編輯過