DNS
什么是DNS
DNS是域名系統(Domain Name System),簡單來說就是平時上網輸入的URL,如 www.baidu.com 就是域名,而DNS就是將這個域名決議成IP地址,如 www.baidu.com 的一個IP地址為 14.215.177.38,DNS使用的埠號為53,使用UDP協議
為什么需要DNS
因為在我們上網的程序中,IP地址很難記住,而域名相對說就簡單很多,所以需要把我們的域名轉換成IP地址
計算機為什么不使用域名和使用IP地址?
因為域名長度可變,計算機處理起來困難,而IP地址是定長的,處理起來簡單很多
為什么需要分不同的域名服務器(如根域名...)
從理論上來講,可以只需要一臺服務器把所有的域名都裝入這臺服務器就可以,大家查詢DNS的時候訪問這個DNS服務器即可,為了安全也可以設定多個服務器,每臺服務器都裝入所有的IP地址,個人認為這樣顯然是可以的(如果擔心訪問量太大導致網路癱瘓就設定多個這樣的服務器,而且同一個IP可以用多臺主機來進行處理),書上的解釋就是所有的主機都訪問這一臺DNS服務器導致癱瘓,期待更合理的解釋
DNS決議程序
- 首先看瀏覽器DNS的快取,如果瀏覽器DNS快取有,那么就直接訪問;
- 如果瀏覽器DNS沒有相應的快取,則看HOST檔案,如果HOST有檔案,則直接訪問即可;
- 如果發現還沒有對應的IP地址,則主機需要向本地DNS服務器(ISP服務器或者自己手動設定的DNS服務器)發起查詢,但是這里有一個問題,本地DNS服務器地址哪里來的?(如果是通過運營商上網的,會自動分配IP與設定DNS,如果是通過路由器上網的,那么就會通過DHCP的方式配置IP與DNS地址,具體可以百度DHCP客戶端請求IP地址的程序,這里暫時還不太清楚,留下這個坑)
- 本地DNS服務器收到請求后,會查看本機的DNS快取,值得注意的是,本地DNS快取需要安裝諸如systemd-resolved,dnsmasq或nscd之類的快取服務,如果沒有安裝,則沒有作業系統級別的DNS快取;
- 本地DNS服務器發起請求(Ubuntu可以通過
cat /etc/resolv.conf和nslookup [host]查看)
,在Ubuntu下,查看本地DNS的服務器的地址為127.0.0.53,顯然這個是一個環回地址(環回地址的意思就是主機向自身發送訊息,環回地址的IP為127.0.0.1 - 127.255.255.254),那么顯然這個資料發送給本機的,本機肯定不能決議這個IP地址,實際上127.0.0.53相當于本地DNS服務器,127.0.0.53還有一個上游DNS服務器的地址(可以通過resolvectl查看)
,如果是通過路由器連接網路的,通常上游DNS的地址為路由器本身的地址,如192.168.1.1,那么這個上游DNS服務器怎么來的?本地主機連接路由器的時候,通過DHCP分配本機的IP地址,同時也會告訴主機DNS服務器地址,具體看DHCP篇,梳理一下這個程序就很好理解了,DNS請求首先發給本地DNS服務器127.0.0.53,本地DNS服務器把DNS請求發給路由器,之后路由器再根據上網方式的不同,比如路由器也可以通過DHCP上網,那么路由器也會獲得DNS服務器的地址,比如進入路由器后臺,查看得到路由器得到的兩個DNS服務器地址,那么就是路由器收到DNS請求就把該請求轉發路由器得到的這兩個DNS服務器地址,之后就是DNS正常決議的流程
- 需要補充的是,主機到本地DNS服務器(127.0.0.53)通常都是遞回的方式進行查詢,而本地DNS服務器與頂級域名服務器···(一級,二級,三級)通常都是迭代,如何從頂級域名到各級域名服務器可以百度,比較簡單;
wireshark抓包分析
- DNS資料報格式

-
事務 ID(2位元組):DNS 報文的 ID 標識,對于請求報文和其對應的應答報文,該欄位的值是相同的,通過它可以區分 DNS 應答報文是對哪個請求進行回應的;
-
標志(2位元組):DNS 報文中的標志欄位;
- QR(Response):查詢請求/回應的標志資訊,查詢請求時,值為 0;回應時,值為 1,
- Opcode:操作碼,其中,0 表示標準查詢;1 表示反向查詢;2 表示服務器狀態請求,
- AA(Authoritative):授權應答,該欄位在回應報文中有效,值為 1 時,表示名稱服務器是權威服務器;值為 0 時,表示不是權威服務器,
- TC(Truncated):表示是否被截斷,值為 1 時,表示回應已超過 512 位元組并已被截斷,只回傳前 512 個位元組,
- RD(Recursion Desired):期望遞回,該欄位能在一個查詢中設定,并在回應中回傳,該標志告訴名稱服務器必須處理這個查詢,這種方式被稱為一個遞回查詢,如果該位為 0,且被請求的名稱服務器沒有一個授權回答,它將回傳一個能解答該查詢的其他名稱服務器串列,這種方式被稱為迭代查詢,
- RA(Recursion Available):可用遞回,該欄位只出現在回應報文中,當值為 1 時,表示服務器支持遞回查詢,
- Z:保留欄位,在所有的請求和應答報文中,它的值必須為 0,
- rcode(Reply code):回傳碼欄位,表示回應的差錯狀態,當值為 0 時,表示沒有錯誤;當值為 1 時,表示報文格式錯誤(Format error),服務器不能理解請求的報文;當值為 2 時,表示域名服務器失敗(Server failure),因為服務器的原因導致沒辦法處理這個請求;當值為 3 時,表示名字錯誤(Name Error),只有對授權域名決議服務器有意義,指出決議的域名不存在;當值為 4 時,表示查詢型別不支持(Not Implemented),即域名服務器不支持查詢型別;當值為 5 時,表示拒絕(Refused),一般是服務器由于設定的策略拒絕給出應答,如服務器不希望對某些請求者給出應答,
-
問題計數(2位元組):DNS 查詢請求的數目;
-
回答資源記錄數(2位元組):DNS 回應的數目;
-
權威名稱服務器計數(2位元組):權威名稱服務器的數目;
-
附加資源記錄數(2位元組):額外的記錄數目(權威名稱服務器對應 IP 地址的數目),
以上,為DNS的頭部,長度固定,為12位元組
- 問題部分

其中,查詢名長度不固定,查詢型別2位元組,查詢類長度2位元組,在DNS請求報文中,只有以上部分,而查詢名長度不固定,所以查詢型別和查詢類是通過DNS報文最后4個位元組來確定的;
以上,就是DNS請求的所有部分
-
在回復報文中,除了以上部分,還有如下三個:

- 域名:DNS 請求的域名,
- 型別:資源記錄的型別,與問題部分中的查詢型別值是一樣的,
- 類:地址型別,與問題部分中的查詢類值是一樣的,
- 生存時間:以秒為單位,表示資源記錄的生命周期,一般用于當地址決議程式取出資源記錄后決定保存及使用快取資料的時間,它同時也可以表明該資源記錄的穩定程度,穩定的資訊會被分配一個很大的值,
- 資源資料長度:資源資料的長度,
- 資源資料:表示按查詢段要求回傳的相關資源記錄的資料,
-
發送的DNS請求包,如圖

分別有以太網首部(14位元組),IP資料報首部(固定部分20位元組),之后是DNS資料報格式
-
接收的DNS資料包

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/501244.html
標籤:其他
