37 張圖詳解 DHCP:給你 IP 地址的隱形人

37 張圖詳解 DHCP:給你 IP 地址的隱形人

DHCP 出現

電腦或手機需要

IP 地址

才能上網。大劉有兩臺電腦和兩臺手機,小美有一臺膝上型電腦、一臺平板電腦和兩臺手機,老王、阿麗、敏敏也有幾臺終端裝置。如果為每臺裝置

手動配置

IP 地址,那會非常繁瑣,一點兒也不方便。特別是手機、膝上型電腦、平板電腦等裝置,每移動到一個新的地方,接入不同的網路,都要重新設定 IP 地址,實在是

太麻煩

了。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

於是就有了

DHCP

協議,會

自動配置

裝置的網路引數,包括 IP 地址、子網掩碼、閘道器地址、DNS 伺服器等,替代手動配置。還能統一 IP 地址分配,方便網路管理。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

DHCP 簡介

DHCP

協議是從

BOOTP

協議發展而來。但 BOOTP 執行在相對靜態的環境中,每臺裝置配置專門的 BOOTP 引數檔案,該檔案會在相當長的時間內保持不變。DHCP 從以下兩方面對 BOOTP 進行了擴充套件:

DHCP 允許裝置

動態地獲取

IP 地址,而不是靜態指定每臺主機地址。

DHCP 能夠分配其它的配置引數,客戶端僅用一個訊息就獲取它所需要的

所有配置資訊

37 張圖詳解 DHCP:給你 IP 地址的隱形人

大劉他們的裝置使用 DHCP 功能後,只要連線到網路,就可以進行 TCP/IP 通訊。對於

路由器

交換機

,通常是手動配置 IP 地址等引數。

DHCP 是一種

Client/Server 模式

的網路協議,由 DHCP Client 向 DHCP Server 提出配置申請,DHCP Server 返回為 DHCP Client 分配的配置資訊。這裡的 Client 和 Server 是

應用程式

,可以執行在電腦、伺服器、路由器等裝置上。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

舉個栗子

大劉的電腦開機後,自動執行 DHCP Client ,DHCP Client 主動向其它裝置上的 DHCP Server 提出請求,DHCP Server 根據預先配置的策略,返回相應 IP 配置資訊,DHCP Client 使用獲得的 IP 配置資訊與其它裝置進行通訊。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

DHCP 分配機制

DHCP 提供了兩種地址分配機制,可以根據網路需求為不同的 Client 選擇不同的分配策略。

動態分配機制

:透過 DHCP 為 Client 分配一個有

使用期限

的 IP 地址。如果 Client 沒有及時續約,到達使用期限後,這個地址可能會被其它 Client 使用。絕大多數 Client 使用的都是這種動態分配的地址。

靜態分配機制

:透過 DHCP 為特定的 Client 分配

固定

的 IP 地址。固定 IP 地址可以

永久使用

, Client 通常是印表機、伺服器等裝置。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

在實際情況中,我們發現 DHCP Client 重啟後,也能獲得相同的 IP 地址。DHCP Server 為 DHCP Client

分配 IP 地址

時,採用如下的

順序

DHCP Server 中與 DHCP Client 的 MAC 地址

靜態繫結

的 IP 地址;

DHCP Client

曾經使用過

的 IP 地址;

最先找到的可用 IP 地址。

如果沒找到可用的 IP 地址,就依次查詢

超過租期

發生衝突

的 IP 地址,如果找到就進行分配,否則

報錯

處理。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

DHCP 系統組成

DHCP 系統由

DHCP Server

( DHCP 伺服器)、

DHCP Client

( DHCP 客戶端)、

DHCP Relay

( DHCP 中繼)等組成。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

DHCP Server

DHCP Server 提供

網路引數

給 DHCP Client ,通常是一臺提供 DHCP 服務功能的伺服器或網路裝置(路由器或三層交換機)。比如:家裡用的

無線路由器

37 張圖詳解 DHCP:給你 IP 地址的隱形人

DHCP Client

DHCP Client 透過 DHCP Server

獲取網路引數

,通常是一臺主機或網路裝置。比如:大劉的

電腦

、小美的

手機

37 張圖詳解 DHCP:給你 IP 地址的隱形人

DHCP Relay

通常情況下,DHCP 採用廣播方式實現報文互動,DHCP 服務僅限在本地網段使用。如果需要

跨網段

實現 DHCP ,那麼使用

DHCP Relay

技術實現。

在 DHCP Server 和 DHCP Client 之間轉發跨網段 DHCP 報文的裝置,通常是

三層網路裝置

37 張圖詳解 DHCP:給你 IP 地址的隱形人

DHCP 基本流程

DHCP 協議報文采用

UDP

方式封裝,DHCP Server 偵聽的埠號是

67

,DHCP Client 的埠號是

68

。DHCP 裝置透過傳送和接收 UDP 67 和 UPD 68 埠的報文進行協議互動。DHCP 的基本工作流程分為

4

個階段,即

發現階段

提供階段

請求階段

確認階段

。我們假設大劉的 PC 是一臺

新電腦

,下面將描述 PC

第一次

是如何透過 DHCP 獲取 IP 地址的。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

為方便描述,

DHCP Server

簡稱

小 S

DHCP Client

簡稱

小 C

1、發現階段

小 C

在本地網段中

廣播

一個

DHCP Discover

報文,目的尋找能夠分配 IP 地址的

小 S

37 張圖詳解 DHCP:給你 IP 地址的隱形人

2、提供階段

本地網段的

小 S

收到 DHCP Discover 報文後,迴應

DHCP Offer

報文。DHCP Offer 報文包含了可用

IP 地址

和其它

網路引數

37 張圖詳解 DHCP:給你 IP 地址的隱形人

小 C 透過

對比

Discover 報文和 Offer 報文中的

xid 欄位

是否相同,來判斷 Offer 報文是不是發給自己的。

3、請求階段

小 C 會收到 小 S 傳送的 DHCP Offer 報文。如果有

多個 小 S

,那麼每個 小 S 都會迴應 DHCP Offer 報文。通常 小 C 會選擇

最先收到

的 Offer 報文,並廣播

DHCP Request

報文來表明哪個 小 S 被選擇,其餘 小 S 就涼涼了。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

如果 小 C 在一定時間後

一直沒收到

DHCP Offer 報文,那麼它就會重新發送 DHCP Discover 報文。

4、確認階段

小 S

收到 DHCP Request 廣播報文後,傳送

DHCP Ack

報文作為迴應,其中包含 小 C 的網路引數。DHCP Ack 報文和之前 DHCP Offer 報文的

引數

不能有

衝突

,否則 小 S 會迴應一個

DHCP Nak

報文。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

當 小 C 收到 DHCP Ack 報文後,會發送

免費 ARP

報文進行探測,目的地址為獲得的 IP 地址,如果探測此地址沒有被使用,那麼 小 C 就會使用這個地址,並完成配置。

DHCP 租期

從 DHCP 協議上看,

小 S

才有 IP 地址的

所有權

,而

小 C

只有 IP 地址的

使用權

。小 S 每次給 小 C 分配一個 IP 地址時,會約定一個 IP 地址的

租期

,通常是 24 小時。在租期內,小 C 才能使用相應的 IP 地址。當租期

到期後

,小 C 將

不能繼續使用

這個 IP 地址。當然了,在租期還沒到期的時候,小 C 是可以

申請續租

這個 IP 地址的。

T1

時刻是租期到

一半

的時候,

T2

時刻是租期到

87.5%

的時候。在 T1 時刻 小 C 會

單播

一個

DHCP Request

報文給 小 S ,

請求續租

IP 地址。如果 小 C 收到了

DHCP Ack

迴應報文,則說明

續租成功

如果直到

T2

時刻,小 C 都未收到 DHCP Ack 迴應報文,那麼會

廣播

傳送一個 DHCP Request 報文,繼續請求續租 IP 地址。如果 小 C 收到了 DHCP Ack 迴應報文,則說明續租成功。

如果直到

租期到期

, 小 C 都未收到 DHCP Ack 迴應報文,那麼必須

停止使用

原來的 IP 地址。 小 C 將從發現階段開始,

重新來申請

一個 IP 地址。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

DHCP Relay

動態獲取 IP 地址的過程中,使用

廣播

方式發生報文,因此 DHCP 只適用於 小 C 和 小 S 在

同一個子網

內的情況。如果為每個網段配置一個 小 S ,這顯然太浪費了。

實際上還有

DHCP Relay

這種角色。小 C 透過 DHCP Relay 實現

跨網段

與 小 S 通訊,獲取 IP 地址。這樣,多個子網上的 小 C 可以使用同一個 小 S ,既節省成本,又方便集中管理。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

DHCP Relay 的

工作原理

如下:

小 C 傳送 DHCP Discover 或 DHCP Request

廣播報文

,具有 DHCP Relay 功能的網路裝置收到後,根據配置將報文

單播

給指定的 小 S ;

小 S 進行 IP 地址的分配,

單播

傳送給 DHCP Relay ,DHCP Relay 再將配置資訊

廣播

給 小 C ,完成對 小 C 的動態配置。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

DHCP 協議報文

前面的內容有提到 DHCP 的一些

報文型別

,現在講講 DHCP 主要的

8 種

報文型別。常見的 5 種報文型別有:

DHCP Discover

DHCP Offer

DHCP Request

DHCP Ack

DHCP Release

,用得少的 3 種報文型別有:

DHCP Nak

DHCP Decline

DHCP Inform

DHCP Discover 報文

它是 DHCP Client 首次接入網路,DHCP 互動過程的

第一個報文

,用來尋找 DHCP Server的請求報文。

DHCP Offer 報文

它是 DHCP Server 用來回應 DHCP Discover 報文的,並攜帶

網路引數

,包括:IP 地址、子網掩碼、預設閘道器、DNS 伺服器等。

DHCP Request 報文

它是 DHCP Client 傳送的報文,有三種使用場景:根據策略

選擇相應的 DHCP Server

,並回應 DHCP Offer 報文;DHCP Client 非首次接入網路,直接傳送 DHCP Request 報文來

申請之前使用過

的 IP 地址等引數;當 IP 地址的租約到期後,傳送 DHCP Request 進行

租期更新

DHCP Ack 報文

它是 DHCP Server 對 DHCP Request 報文的迴應報文,進行

最終確認

。DHCP Client 收到這個報文後,才能獲得 IP 地址和相應網路引數。

DHCP Nak 報文

它也是 DHCP Server 對 DHCP Request 報文的

迴應報文

,當 DHCP Request 報文中的各個引數都正確時,迴應

DHCP Ack 報文

,否則迴應

DHCP Nak 報文

,告訴 DHCP Client 禁止使用獲得的 IP 地址。

DHCP Decline 報文

當 DHCP Client 收到 DHCP Ack 報文後,還會發送

免費 ARP

報文,確認申請的 IP 地址是否已經在網路上使用了。如果 IP 地址已經被其它 Client 使用,那麼 DHCP Client 傳送 DHCP Decline 報文,

拒絕

分配的 IP 地址,並重新向 DHCP Server 申請地址。

DHCP Release 報文

當 DHCP Client 想要

釋放獲得的 IP 地址

時,向 DHCP Server 傳送 DHCP Release 報文,DHCP Server 收到報文後,可將這個 IP 地址分配給其它的 Client 。

DHCP Inform 報文

DHCP Client 透過手動方式獲得 IP 地址後,還想向 DHCP Server

獲取更多網路引數

時,比如:預設閘道器地址、DNS 伺服器地址,DHCP Client 就向 DHCP Server 傳送 DHCP Inform 報文進行申請。

DHCP 狀態機

如果把

功能各異

的 8 種報文串起來,就是整個 DHCP

協議互動

流程。前面講的 4 種階段(發現、提供、請求、確認)不能完全展現出來,這就需要使用 DHCP 協議的

狀態機

。狀態指出

下一步

使用的報文型別,

狀態轉換

是透過報文的接收、傳送或超時。下面是 Client 的狀態機。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

Client 從

INIT

狀態開始,廣播 DHCP Discover 報文。在

選擇

狀態時,它收到 DHCP Offer 報文,並決定使用哪個地址和 Server 。做出選擇後,透過 DHCP Request 報文進入

請求

狀態。如果分配的地址和曾使用過的地址不一致,那麼迴應 DHCP Nak 報文進行拒絕,並返回

INIT

狀態;如果分配的地址已經被佔用,那麼迴應 DHCP Decline 報文進行拒絕,也返回到

INIT

狀態。通常是收到一個需要的地址,迴應 DHCP Ack 報文,獲得租期超時值 T1 和 T2 ,並進入

繫結

狀態,這個時候就可以使用這個地址直到租期到期。當 T1 到期時,進入

更新

狀態並進行續租申請。如果續租成功,那麼可以收到 DHCP Ack 報文,並返回到

繫結

狀態;如果續租不成功,那麼在 T2 到期時,再次進行續租申請。如果租期最終到期,那麼 Client 將禁止使用所租用的地址,並返回到

INIT

狀態。

DHCP 網路實戰

DHCP 協議是為解決網路問題而生,現在我們就來模擬實際環境,

動手操作

,驗證下 DHCP 的功能。

DHCP Server 示例

網路拓撲

37 張圖詳解 DHCP:給你 IP 地址的隱形人

實驗要求

RT(路由器)配置

DHCP Server

,PC

動態獲取

IP 地址等網路引數

操作步驟

配置思路:

在 RT 上開啟 DHCP 功能,

建立一個地址池,

配置地址池的相關引數,

在 RT 的介面下引用地址池,實現 DHCP Server 功能。

配置命令:

使用 DHCP 功能之前,先要開啟 DHCP 功能。系統檢視下,使用命令

dhcp enable

啟動 DHCP 功能。

動態分配 IP 地址,就需要有多個可分配的 IP 地址,使用

ip pool

ip-pool-name

命令來建立全域性地址池,

ip-pool-name

表示地址池的名稱。

在全域性地址池檢視下,透過命令

network

ip-address

mask

{

mask

|

mask-length

} ] 配置可分配的 IP 地址段。

mask

{

mask

|

mask-length

} 表示子網掩碼,通常根據裝置數量來確定掩碼長度。

有了 IP 地址和子網掩碼,再加上預設閘道器,終端裝置就能網路互通了。在全域性地址池檢視下,使用命令

gateway-list

ip-address

配置閘道器 IP 地址。

網路互通,還不能正常訪問網站,需要配置 DNS 伺服器,用於域名解析。在全域性地址池檢視下,使用

dns-list

ip-address

配置 DNS 伺服器的 IP 地址。

地址池配置中,常用的可選命令如下,可根據需求進行選擇性設定。

lease

{

day

day

hour

hour

minute

minute

] ] |

unlimited

} :配置 IP 地址的租期,預設租期是 1 天。

excluded-ip-address

start-ip-address

end-ip-address

] :在可分配的地址池中,設定不分配的 IP 地址。比如:地址池是 192。168。100。0/24 ,可設定 192。168。100。1 - 192。168。100。10 不參與地址分配。

static-bind

ip-address

ip-address

mac-address

mac-address

:為 Client 固定分配一個 IP 地址。

配置完地址池,還需要進行引用,DHCP Server 功能就能正常使用了。在 RT 的介面下配置引用,命令為

dhcp select global

37 張圖詳解 DHCP:給你 IP 地址的隱形人

功能驗證

配置完成後,理論上是 DHCP 功能正常工作了,實際情況的話,可透過命令

display ip pool name

pool-name

used

,檢視地址池的配置情況,和地址分配情況。

RT

上檢視 DHCP Server 地址分配狀態。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

同時也在

PC

上檢視動態獲取地址情況,進行雙向驗證。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

抓包還可以看到 DHCP

報文互動

的詳細過程,同時也是

檢驗理論知識

是否正確。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

這裡我們發現抓包看到的是 DHCP Offer

單播

報文,而前面介紹的時候,DHCP Offer 是

廣播

報文。其實 DHCP Offer 報文有可能是單播,也有可能是廣播。DHCP 在報文的標誌欄位有一個

廣播位

,如果 Client 支援接收 Offer 單播報文,那麼 Client 就會將傳送報文中的廣播位設為 0 ,否則為 1 。

DHCP Relay 示例

網路拓撲

37 張圖詳解 DHCP:給你 IP 地址的隱形人

實驗要求

DHCP Client 和 DHCP Server 在

不同網段

,DHCP Client 透過

DHCP Relay

獲取到 IP 地址等網路引數。

操作步驟

PC

( DHCP Client )開啟 DHCP 功能;

37 張圖詳解 DHCP:給你 IP 地址的隱形人

RT1

( DHCP Relay )使用

dhcp select relay

命令開啟 DHCP Relay 功能,在 G0/0/1 口下使用

dhcp relay server-ip

ip-address

命令,配置 DHCP Server 的 IP 地址;

37 張圖詳解 DHCP:給你 IP 地址的隱形人

RT2

(DHCP Server)開啟 DHCP 功能,建立地址池並配置相關引數,在介面下引用地址池,實現 DHCP Server 功能。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

功能驗證

PC 端能獲取到 IP 配置,並且獲取的配置正確。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

在 RT1 的 G0/0/1 抓包,檢視

DHCP Client

和 DHCP Relay 的報文互動過程。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

在 RT1 的 G0/0/0 抓包,檢視

DHCP Server

和 DHCP Relay 的報文互動過程。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

DHCP 報文格式

如果想要更深入的瞭解 DHCP 協議,那就要看它的報文格式。DHCP 裝置透過識別報文內容,實現協議功能。

37 張圖詳解 DHCP:給你 IP 地址的隱形人

op

(操作型別):表示報文的格式。當值為 1 時,表示客戶端的請求報文;當值為 2 時,表示伺服器的響應報文。

htype

(硬體型別):不同的硬體型別取不同的值,最常見的乙太網,值是 1 。

hlen

(硬體地址長度):表示硬體地址長度,乙太網的值是 6 ,也就是 MAC 地址的長度。

hops

(跳數):DHCP 報文經過的 DHCP 中繼的數量。

xid

(互動 ID ):DHCP 客戶端取的隨機值,收到 DHCP 伺服器的響應報文時,檢視 xid 值是否相同,來判斷報文是否是傳送給自己的。

secs

(客戶端啟動秒數):記錄 IP 地址的使用時間。

flags

(標誌):廣播響應標誌位,當值為 0 時,表示伺服器以單播形式傳送響應報文;當值為 1 時,伺服器以廣播形式傳送響應報文。

ciaddr

(客戶端 IP 地址):客戶端的 IP 地址,可以是分配的地址,也可以是正在使用的地址,還可以是的 0。0。0。0 。0。0。0。0 是客戶端初始狀態沒有地址的時候,僅用於臨時通訊,不是有效的地址。

yiaddr

(你的 IP 地址):當伺服器傳送響應報文時,將分配給客戶端的 IP 地址填入這個欄位。

siaddr

(伺服器 IP 地址):用來標識伺服器的 IP 地址。

giaddr

(中繼裝置 IP 地址):表示 DHCP 中繼的 IP 地址,伺服器透過識別這個欄位來判斷出客戶端的網段地址,從而選擇合適的地址池,為客戶端分配該網段的 IP 地址。

chaddr

(客戶端硬體地址):用來標識客戶端的硬體地址,當客戶端傳送廣播發現報文時,這個欄位就是自己的硬體地址。

sname

(伺服器名):可選項,DHCP 伺服器填寫這個欄位。

file

(引導檔名):可選項,DHCP 伺服器填寫這個欄位。

options

(可選項):可選項,DHCP 客戶端獲取網路引數,DHCP 伺服器提供網路引數,都是使用的這個欄位。內容有很多,例如:租期、子網掩碼、預設閘道器地址、DNS 伺服器地址等。

拿著 DHCP

報文格式

,就可以看懂抓包獲取的

報文內容

DHCP Discover 報文

37 張圖詳解 DHCP:給你 IP 地址的隱形人

DHCP Offer 報文

37 張圖詳解 DHCP:給你 IP 地址的隱形人

DHCP Request 報文

37 張圖詳解 DHCP:給你 IP 地址的隱形人

DHCP Ack 報文

37 張圖詳解 DHCP:給你 IP 地址的隱形人

飲水思源:

HCNA網路技術學習指南 - 華為技術有限公司

路由交換技術 - 杭州華三通訊技術有限公司

TCP/IP詳解 卷1:協議 - Kevin R。Fall

高階網路技術 - 田果

圖解TCP/IP - 竹下隆史