1. 程式人生 > >DNS協議概述

DNS協議概述

《Linux高效能伺服器程式設計》閱讀筆記:

1. DNS工作原理

  通常情況下我們要訪問某個網站,使用的是該網站所在機器的域名,而不是直接使用其IP地址。將機器域名轉換為IP地址的過程,這就需要域名查詢服務。常見的域名查詢服務有NIS(Network Information Service, 網路資訊服務)、本地靜態檔案和DNS。

  DNS是一套分散式的域名服務系統,即有多個DNS伺服器遍佈於世界。每個DNS伺服器上存放著大量的機器域名和IP地址的對映,並且是動態更新。眾多網路客戶端程式都使用DNS協議來向DNS伺服器查詢目標主機的IP地址。舉例:有時候電腦的DNS伺服器的地址沒有設定好時,出現瀏覽器不可以訪問網站,但是騰訊QQ可以上網聊天的情況。這是因為騰訊QQ客戶端訪問騰訊伺服器時用的是IP地址而非域名,因此不需要DNS伺服器進行域名查詢服務,而瀏覽器上通過域名訪問網站自然需要DNS伺服器了。

  DNS協議屬於應用層的協議,它既可以使用TCP服務,也可以使用UDP服務:

這裡寫圖片描述

  (乙太網幀中)DNS的查詢和應答報文如下:

這裡寫圖片描述

  (1) 16位標識: 標記一堆DNS查詢和應答,以區分哪一個DNS應答對應哪個DNS查詢的迴應
  (2) 16位標誌: 協商具體的通訊方式和反饋通訊狀態。具體位如下:

這裡寫圖片描述

a. QR: 查詢/應答標誌位,0表這是一個查詢報文,1表示應答報文

b. opcode: 定義查詢/應答的型別,0表標準查詢,1表反向查詢(由IP地址獲得主機域名),2表請求伺服器狀態

c. AA: 授權應答標誌,僅被應答報文使用。1表示該DNS服務商是授權伺服器

d. TC: 截斷標誌,僅被應答報文使用。因為UDP資料報是有長度限制的,過長的DNS報文將被截斷。為1表DNS報文超過512位元組並被截斷

e. RD: 遞迴查詢標誌,1表執行遞迴查詢:若目標DNS伺服器無法解析某個主機名,則它將向其他DNS伺服器繼續查詢,如此遞迴,直至獲得結果並返回給客戶端;0表示迭代查詢:若目標DNS伺服器無法解析某個主機名,則將它自己知道的其他DNS伺服器的IP地址返回給客戶端,讓客戶端決定是否繼續往向其他DNS傳送請求。

f. RA:允許遞迴標誌,僅被應答報文使用。1表示DNS支援伺服器遞迴查詢
g. ZERO: 這3位未使用,須設定為0

h. rcode: 4位返回碼,表應答狀態。0表無錯誤,3表域名不存在

  對於查詢報而言:
  (3) 16位問題個數: 一般包含一個查詢問題
  (4) 16位應答資源個數、16位授權資源記錄數目、16位額外資源記錄資料: 查詢報中至少為1;

  對於應答報而言:
  (3) 應答報文的應答資源記錄數:至少為1,
  (4) 授權資源、額外資源記錄資料:可為0或非0

  (5) 查詢問題的格式為:

這裡寫圖片描述

  查詢名以一定的格式封裝了要查詢的主機名,查詢型別表如何執行查詢操作:

a. 型別A,值是1:表獲取目的主機的IP地址

b. 型別CNAME,值是5:表獲得目標主機的別名

c. 型別PTR,值為12,表反向查詢(通過IP地址獲取域名)

查詢類一般為1,表獲取IP地址。

  (6) 應答、授權和額外資訊欄位都使用資源記錄(Resource Record, RR)格式:

這裡寫圖片描述

  (7) 域名、型別、類:資源對應的名字,格式和查詢問題的格式一樣

  (8) 生存時間: 表該查詢記錄結果可被本地客戶端快取多長時間,單位是S

  (9) 資源資料長度、資源資料:取決於型別欄位。對於型別A,資源資料是32位的IPv4地址,資源資料長度為4位元組

2. Linux下訪問DNS伺服器

  要訪問DNS伺服器,就需要先知道DNS伺服器的IP地址。在Linux中,DNS伺服器的IP地址存放在/etc/resolv.conf檔案中。

這裡寫圖片描述

  IP地址分別表示首選DNS伺服器地址(還可以多設定一個備用DNS伺服器地址)。Linux系統中常用的訪問DNS服務的客戶端程式是host,利用host命令向首選DNS伺服器查詢www.baidu.com的IP:

$ host -t A www.baidu.com

這裡寫圖片描述

  可見,機器碼www.baidu.com是www.a.shifen.com的別名,且該機器名對應兩個IP地址。

  命令-t選項是告訴DNS協議使用哪種查詢型別,這裡指定為A型別,即通過機器的域名獲得其IP地址。

3. 通過tcpdump抓取DNS資料包

  在Linux系統中執行host命令以查詢www.baidu.com對應的IP地址,並在另一終端抓取這一過程中LAN上傳輸的乙太網幀。

$ sudo tcpdump -i eth0 -nt -s 500 port domain

這裡寫圖片描述

  在另一終端中,向DNS伺服器傳送請求:

$ host -t A www.baidu.com

這裡寫圖片描述

  回到tcpdump的終端下:
這裡寫圖片描述

  (1) 兩個資料包開始的”IP”表明他們後面的內容描述的是IP資料包
  (2) tcpdump是以”IP地址.埠號”的形式來描述通訊的一端,”源端 > 目的端”。第一個資料包是請求包,第二個則是應答包
  (3) DNS伺服器使用的埠號是53
  (4) 數值18482是DNS查詢報文的標識值,因此該值也出現在應答包中,形成對應
  (5) +表示啟用遞迴查詢,A?表示使用A類查詢方式
  (6) “www.baidu.com”是DNS查詢問題中的查詢名,數值31表查詢報文的長度為31位元組
  (7) 3/0/0表示該應答包中有3個應答資源記錄、0個授權記錄和0個額外資訊記錄。
  (8) “www.a.shifen.com., A 14.215.177.39, A 14.215.177.38”表3個應答資源記錄的內容,其中CNAME表其後記錄是及其的別名,A表其後記錄的是IP地址,數值的90表應答報文長度為90位元組

  tcpdump命令還可以開啟-x選項,這樣能看到DNS報文中的每一個位元組:
這裡寫圖片描述