DHCP協議工作流程分析

ZHONGCAI0901 發表於 2020-10-17

1.前言

DHCP,Dynamic Host Configuration Protocol,動態主機配置協議,簡單來說就是主機獲取IP地址的過程,屬於應用層協議。DHCP採用UDP68(客戶端)67(伺服器)(伺服器)埠進行通訊。

2.DHCP工作過程

為了動態獲取並使用一個合法的IP地址,需要經歷以下幾個階段:

  1. 發現階段:即 DHCP 客戶端尋找 DHCP 伺服器的階段。
  2. 提供階段:即 DHCP 伺服器提供 IP 地址的階段。
  3. 選擇階段:即 DHCP 客戶端選擇某臺 DHCP 伺服器提供的 IP 地址的階段。
  4. 確認階段:即 DHCP 伺服器確認所提供的 IP 地址的階段。
    DHCP協議工作流程分析

IP地址的動態獲取過程如圖2所示,下面將詳細介紹每個階段的工作過程。

2.1 發現階段

在發現階段,DHCP客戶端通過傳送DHCP-DISCOVER報文來尋找DHCP伺服器。由於DHCP伺服器的IP地址對於客戶端來說是未知的,所以DHCP客戶端以廣播方式傳送DHCP-DISCOVER報文。所有收到DHCP-DISCOVER報文的DHCP伺服器都會傳送回應報文,DHCP客戶端據此可以知道網路中存在的DHCP伺服器的位置。

2.2 提供階段

網路中接收到DHCP-DISCOVER報文的DHCP伺服器,會選擇一個合適的IP地址,連同IP地址租約期限和其他配置資訊(如閘道器地址,域名伺服器地址等)一同通過DHCP-OFFER報文傳送給DHCP客戶端。

DHCP伺服器通過地址池儲存可供分配的IP地址和其他配置資訊。當DHCP伺服器接收到DHCP請求報文後,將從IP地址池中取得空閒的IP地址及其他的引數,傳送給DHCP客戶端。

DHCP伺服器為客戶端分配IP地址的優先次序如下:

  1. 與客戶端 MAC 地址或客戶端 ID 靜態繫結的 IP 地址;
  2. DHCP 伺服器記錄的曾經分配給客戶端的 IP 地址;
  3. 客戶端傳送的 DHCP-DISCOVER 報文中 Option 50 欄位指定的 IP 地址;
  4. 在 DHCP 地址池中,順序查詢可供分配的 IP 地址,最先找到的 IP 地址;
  5. 如果未找到可用的 IP 地址,則依次查詢租約過期、曾經發生過沖突的 IP 地址,如果找到則進行分配,否則將不予處理。

DHCP伺服器為客戶端分配IP地址時,伺服器首先需要確認所分配的IP沒有被網路上的其他裝置所使用。DHCP伺服器通過傳送ICMP Echo Request(ping)報文對分配的IP進行探測。如果在規定的時間內沒有應答,那麼伺服器就會再次傳送ping報文。到達規定的次數後,如果仍沒有應答,則所分配的IP地址可用。否則將探測的IP地址記錄為衝突地址,並重新選擇IP地址進行分配。

2.3 選擇階段

如果有多臺DHCP伺服器向DHCP客戶端回應DHCP-OFFER報文,則DHCP客戶端只接受第一個收到的DHCP-OFFER報文。然後以廣播方式傳送DHCP-REQUEST請求報文,該報文中包含Option 54(伺服器標識選項),即它選擇的DHCP伺服器的IP地址資訊。

以廣播方式傳送DHCP-REQUEST請求報文,是為了通知所有的DHCP伺服器,它將選擇Option 54中標識的DHCP伺服器提供的IP地址,其他DHCP伺服器可以重新使用曾提供的IP地址。

2.4 確認階段

收到DHCP客戶端傳送的DHCP-REQUEST請求報文後,DHCP伺服器根據DHCP-REQUEST報文中攜帶的MAC地址來查詢有沒有相應的租約記錄。如果有,則傳送DHCP-ACK報文作為應答,通知DHCP客戶端可以使用分配的IP地址。

DHCP客戶端收到DHCP伺服器返回的DHCP-ACK確認報文後,會以廣播的方式傳送免費ARP報文,探測是否有主機使用伺服器分配的IP地址,如果在規定的時間內沒有收到回應,客戶端才使用此地址。否則,客戶端會傳送DHCP-DECLINE報文給DHCP伺服器,通知DHCP伺服器該地址不可用,並重新申請IP地址。

如果DHCP伺服器收到DHCP-REQUEST報文後,沒有找到相應的租約記錄,或者由於某些原因無法正常分配IP地址,則傳送DHCP-NAK報文作為應答,通知DHCP客戶端無法分配合適IP地址。DHCP客戶端需要重新傳送DHCP-DISCOVER報文來請求新的IP地址。

3. DHCP報文格式

DHCP報文格式如下圖所示:

DHCP協議工作流程分析
DHCP報文的各個欄位的具體說明如下:
  • op:報文的操作型別,分為請求報文和響應報文,1 為請求報文;2 為響應報文。具體的報文型別在 option 欄位中標識。
  • htype:硬體地址型別。
  • hlen:硬體地址長度。系統目前只對乙太網支援,硬體地址長度固定為 6。
  • hops:DHCP 報文經過的 DHCP 中繼的數目。DHCP 請求報文每經過一個DHCP 中繼,該欄位就會增加 1。
  • xid:由客戶端軟體產生的隨機數,用於匹配請求和應答報文。
  • secs:客戶端進入 IP 地址申請程式的時間或者更新 IP 地址程式的時間;由客戶端軟體根據情況設定。目前沒有使用,固定為 0。
  • flags:標誌欄位。第一個位元為廣播響應標識位,用來標識 DHCP 伺服器響應報文是採用單播還是廣播方式傳送,0 表示採用單播方式,1 表示採用廣播方式。其餘位元保留不用。
  • ciaddr:DHCP 客戶端的 IP 地址。
  • yiaddr:DHCP 伺服器分配給客戶端的 IP 地址。
  • siaddr:DHCP 客戶端獲取 IP 地址等資訊的伺服器 IP 地址。
  • giaddr:DHCP 客戶端發出請求報文後經過的第一個 DHCP 中繼的 IP 地址。
  • chaddr:DHCP 客戶端的硬體地址。
  • sname:DHCP 客戶端獲取 IP 地址等資訊的伺服器名稱。
  • file:DHCP 伺服器為 DHCP 客戶端指定的啟動配置檔名稱及路徑資訊。
  • options:可選變長選項欄位,包含報文的型別、有效租期、DNS 伺服器的IP 地址、WINS 伺服器的 IP 地址等配置資訊。

4.使用Wireshark抓包分析

通過Wireshark抓取DHCP獲取IP過程的資料包文:

  1. 開Wireshark抓包
  2. PC當前已有IP,使用cmd命令釋放IP(ipconfig /release),並重新獲取IP(ipconfig /renew
DHCP協議工作流程分析
3. 停止抓包,使用bootp過濾報文。
DHCP協議工作流程分析
4. 根據DHCP報文格式分析抓取的報文,這裡舉例DHCP Offer報文的分析,如下:
DHCP協議工作流程分析

5.參考資料

  1. DHCP技術白皮書:
    http://www.h3c.com/cn/d_200802/333443_30003_0.htm#download

  2. DHCP協議原理及其實現流程:
    https://blog.csdn.net/wuruixn/article/details/8282554

  3. DHCP完整過程詳解及Wireshark抓包分析:
    https://bbs.huaweicloud.com/blogs/158906

  4. DHCP協議原理及抓包分析:
    https://blog.csdn.net/andy_93/article/details/78238931