動態主機配置協議(DHCP)

NAOKO發表於2017-12-21

1. 簡介

  • 計算機要互聯通訊自身肯定需要網路 ,如IP地址、子網掩碼、DNS伺服器地址等。而為了實現IP地址的自動設定與統一分配,DHCP就這樣孕育而生了。
  • 動態主機配置協議(DHCP)是一個應用層協議,也就是位於TCP/IP 5層協議模型的第5層,同時它也是一個客戶機-伺服器協議。
  • DHCP的設計基於早期的Internet載入程式協議(BOOTP),使用UDP/IP協議,客戶端使用埠68,服務端使用埠67。
  • DHCP伺服器可提供三種地址分配:
    • 手動分配 由網路管理員在DHCP伺服器手工配置DHCP客戶機的IP地址。
    • 自動分配 當DHCP客戶機第一次向DHCP伺服器請求到IP地址後,這個地址就永久地分配給了該DHCP客戶機,不可撤銷。
    • 動態分配(最常見) 與自動分配採用相同的方法,只不過獲得的IP地址是有租約期限的,一旦租約到期,地址就會被回收,不過可以通過續訂租約以延長期限。

2. 訊息格式

DHCP擴充套件了BOOTP,DHCP訊息格式的定義也採用了擴充套件BOOTP的方式以保持兩種協議之間的相容性。訊息格式由一個固定大小的初始部分和一個可變長度的選項部分組成。

DHCP訊息格式

欄位說明

初始部分

欄位 說明
Op 訊息型別,1表示請求,2表示響應
HW Type 硬體地址型別,1表示乙太網
HW Len 硬體地址長度,如乙太網地址長度6個位元組值就為6
Hops 儲存訊息傳輸過程中繼的的次數,預設為0
Transaction ID 事物ID。客戶機所選擇的一個隨機數,伺服器把它複製到響應訊息中,用於將應答和請求匹配
Secs 獲取到IP地址或者續約過程開始到現在所消耗的時間,以秒為單位。在沒有獲得IP地址前該欄位始終為0
Flags 標誌欄位。該16位位元欄位的最左邊的位為 0 ,表示單播,為 1 表示廣播
Client IP address 客戶機IP地址
"Your" IP address DHCP伺服器為客戶機提供的IP地址存放在此欄位
(Next) Server IP address 下一個為DHCP客戶端分配IP地址等資訊的DHCP伺服器IP地址。僅在DHCP OfferDHCP ACK報文中顯示,其他報文中顯示為0。
Gateway (Relay) IP address DHCPBOOTP中繼器填寫,如果訊息沒有經過中繼器則此欄位為0
Client Hardware address 客戶機硬體地址
Server Name 可選的伺服器主機名,是一個null結尾的字串,由伺服器填寫
Boot File Name 引導檔名。是一個null結尾的字串,DHCP OFFER 報文中提供有效的檔案路徑,其他訊息中不顯示, 一般不使用
Options 選項欄位。可變欄位,格式為"程式碼+長度+資料",是DHCP訊息和BOOTP訊息的區別之處

選項部分

程式碼 欄位名稱
1 子網掩碼
3 路由器地址
6 域名伺服器
15 域名
50 請求的IP地址
51 地址租用期
53 DHCP訊息型別
54 伺服器識別符號
55 引數請求列表
56 DHCP錯誤資訊
58 租約更新時間
59 租約重新繫結時間
61 客戶機識別符號
119 域搜尋列表
255 結束

其中53(DHCP訊息型別選項)有多個可能的值:

  • DHCP DISCOVER
  • DHCP OFFER
  • DHCP REQUEST
  • DHCP ARK
  • DHCP NAK
  • DHCP DECLINE
  • DHCP RELEASE
  • DHCP INFORM
  • DHCP FORCERENEW
  • DHCP LEASEQUERY
  • DHCP LEASEUNASSIGNED
  • DHCP LEASEUNKNOWN
  • DHCP LEASEACTIVE

3. 操作和狀態

操作過程

DHCP協議操作過程

上圖顯示的是當一個DHCP客戶端向DHCP伺服器新請求一個IP地址的過程:

Wireshark抓包結果

獲取過程

  1. 發現階段

    • 由於不知DHCP伺服器的IP地址和Mac地址,DHCP客戶機通過向本地網路廣播一個DHCP DISCOVER請求報文以向網路中的DHCP伺服器請求網路配置資訊。
    • 最後本地網路上每個DHCP伺服器都會接收到DHCP發現報文,而同時其他主機也會收到此報文,只不過當拆包後發現源IP地址是0.0.0.0後就會拋棄這個包。
  2. 提供階段

    • 當DHCP伺服器收到發現報文,它就從它的地址池中選出一個空閒IP填充到DHCP OFFER的**"Your" IP address欄位,並在選項欄位加上子網掩碼,路由器,DNS,伺服器標識,IP地址租用時間**等欄位。再廣播此報文(因為此時還不知客戶機的IP地址)
  3. 請求階段

    • 最後客戶機可能會收到多個DHCP伺服器的DHCP OFFER報文,一般是選最先到達那個報文並作出迴應請求,即廣播發出一個 包含伺服器選項欄位的DHCP REQUEST報文。這裡還使用廣播的目的是因為要讓所有的DHCP伺服器知道客戶機選擇了哪個伺服器提供的IP。
  4. DHCP伺服器收到來自客戶機的DHCP REQUEST報文,而只有符合伺服器標識這個選項欄位的DHCP伺服器才會對此作出響應:

    • 如果伺服器可以分配此IP則以DHCP ACK報文進行響應。
    • 如果伺服器無法分配此IP則以DHCP NAK報文進行響應。

    其他DHCP伺服器則清除與此請求相關的狀態。響應方式還是跟提供階段一樣廣播此報文。

    • 當DHCP客戶機收到的響應是DHCP NAK報文,則會重新傳送 DHCP DISCOVER報文。
    • 若收到的是DHCP ACK報文則會執行地址衝突檢測(ACD)探測獲得的IP地址是否未被使用。
      • 如果已經被使用則向DHCP伺服器傳送一個DHCP DECLINE報文以通知該地址已經不能被使用。之後經過預設的10秒延時後客戶機可再次重試。
      • 如果未被使用則獲得了該IP地址在租用期間的使用權。

成功獲取後的所有網路配置資訊可以通過一條命令檢視 Windows下:

ipconfig /all

Linux下:

ifconfig

租約更新過程

因為實在獲得可以使用是IP地址的基礎上進行租約時間的更新,所以不必向獲取過程那麼麻煩,只需要向DHCP伺服器傳送DHCP REQUEST報文,DHCP伺服器收到請求報文如果響應一個DHCP ACK則更新成功。 同樣這個更新租約時間的過程也可以用一條命令來實現 Windows下:

ipconfig /renew

Linux下:

dhclient

租約的釋放

如果想在租約結束前釋放以獲取的IP地址,可以向DHCP伺服器傳送DHCP RELEASE報文。同樣這個釋放操作也可以用一條命令來實現 Windows下:

ipconfig /release

Linux下:

dhclient -r

相關文章