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的方式以保持兩種協議之間的相容性。訊息格式由一個固定大小的初始部分和一個可變長度的選項部分組成。
欄位說明
初始部分
欄位 | 說明 |
---|---|
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 Offer 、DHCP ACK 報文中顯示,其他報文中顯示為0。 |
Gateway (Relay) IP address | 由DHCP 或BOOTP 中繼器填寫,如果訊息沒有經過中繼器則此欄位為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伺服器新請求一個IP地址的過程:
獲取過程
-
發現階段
- 由於不知DHCP伺服器的IP地址和Mac地址,DHCP客戶機通過向本地網路廣播一個
DHCP DISCOVER
請求報文以向網路中的DHCP伺服器請求網路配置資訊。 - 最後本地網路上每個DHCP伺服器都會接收到DHCP發現報文,而同時其他主機也會收到此報文,只不過當拆包後發現源IP地址是
0.0.0.0
後就會拋棄這個包。
- 由於不知DHCP伺服器的IP地址和Mac地址,DHCP客戶機通過向本地網路廣播一個
-
提供階段
- 當DHCP伺服器收到發現報文,它就從它的地址池中選出一個空閒IP填充到
DHCP OFFER
的**"Your" IP address欄位,並在選項欄位加上子網掩碼,路由器,DNS,伺服器標識,IP地址租用時間**等欄位。再廣播此報文(因為此時還不知客戶機的IP地址)
- 當DHCP伺服器收到發現報文,它就從它的地址池中選出一個空閒IP填充到
-
請求階段
- 最後客戶機可能會收到多個DHCP伺服器的
DHCP OFFER
報文,一般是選最先到達那個報文並作出迴應請求,即廣播發出一個 包含伺服器選項欄位的DHCP REQUEST
報文。這裡還使用廣播的目的是因為要讓所有的DHCP伺服器知道客戶機選擇了哪個伺服器提供的IP。
- 最後客戶機可能會收到多個DHCP伺服器的
-
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地址在租用期間的使用權。
- 如果已經被使用則向DHCP伺服器傳送一個
- 如果伺服器可以分配此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