DHCP:IP 並非與生俱來

飛天小牛肉發表於2021-06-18

初識 DHCP

眾所周知,因特網上的每臺裝置都規定了其全世界唯一的地址,也就是說 “IP 地址”,正是由於有了 IP 地址,才保證了使用者在連網的計算機上操作時,能夠高效而且方便地從千千萬萬臺計算機中選出自己所需的物件來。

IP 地址就好像電話號碼(地址碼):有了某人的電話號碼,你就能與他通話了。同樣,有了某臺主機的 IP 地址,你就能與這臺主機通訊了。

But,如果逐一為每一臺主機設計 IP 地址那不得累死,不說全世界可能上百億臺計算機的存在,就說一臺膝上型電腦,每移動到一個地方,就需要重新配置 IP 地址

顯然,手動分配 IP 地址不是我們人類中的那些頂級大腦能夠做出來的事情,為了實現自動配置 IP 地址、統一管理 IP 地址分配,DHCP 協議(Dynamic Host Configuration Protocol,動態主機配置協議)就被創造了出來,這是一個應用層協議

在沒有 DHCP 服務的網路中,計算機接入到網路時必須先被設定 IP 地址、子網掩碼、預設路由等等,並且,為了保證所有的主機 IP 地址都是唯一的,管理員必須清楚的知道該如何分配 IP 地址以避免衝突。

而在提供 DHCP 服務的網路中,管理員的負擔大幅度減輕,只要在 DHCP 伺服器上做一些必要的設定即可,計算機一旦接入到網路,就會自動獲取 TCP/IP 通訊所必須的設定(IP 地址等資訊),並且 DHCP 伺服器會保證其 IP 地址的唯一性。

可以看出,DHCP 實際上提供的是一種即插即用的網路,就是說只要某臺計算機物理上一連通,無需專門的設定,就可以直接使用這臺物理裝置。

DHCP 的工作原理

DHCP 不僅可以為接入網際網路的計算機配置 IP 地址,還可以配置子網掩碼、預設路由等資訊,那這些資訊當然是不會憑空變出來的,它們都需要被提前配置到 DHCP 伺服器上。

從 DHCP 獲取 IP 地址的流程和 ARP 有一點相似不過還是存在不同的,客戶端主機和 DHCP 伺服器之間基於 UDP 協議採用廣播形式進行互動,主機傳送請求訊息到 DHCP 伺服器的 67 號埠,DHCP 伺服器回應應答訊息給主機的 68 號埠。具體流程如下:

1)客戶端主機廣播 DHCP Discover 包:主機請求 DHCP 伺服器為自己設定 IP 地址、子網掩碼等資訊

說的通俗一點,當一臺裝置新加入一個網路的時候,它只知道自己的 MAC 地址,那麼為了獲取一些必要的資訊,它會先大吼一句(廣播,目標地址 255.255.255.255):“我是新來的,我的 MAC 地址是這個,我還沒有 IP 地址(或者說 IP 地址是 0.0.0.0,表示未知),有沒有 DHCP 伺服器能租給我一個 IP 地址呀?”,這個過程稱為 “DHCP Discover”。

想必看到這裡各位也就能知道 MAC 地址的重要性了,它是與生俱來的,而 IP 地址並不是

2)DHCP 伺服器廣播 DHCP Offer 包:DHCP 伺服器通知主機哪些網路設定是可以使用的

如果這個網路中存在多個 DHCP 伺服器,它們都聽到了新人的大吼,並且都願意租給這位新人一個 IP 地址等資訊,那麼這個新人主機就會收到多個可用的 IP 地址等資訊。這個過程稱為 “DHCP Offer”。

3)客戶端主機廣播 DHCP Request 包:主機通知伺服器自己想要使用在(2)中通知的設定

主機在它收到的多個 Offer 中,選擇其中一個,一般是最先到達的那個。並且會向網路廣播一個 DHCP Request 包,包中包含客戶端主機的 MAC 地址、接受的 Offer 中的 IP 地址、提供此 Offer 的 DHCP 伺服器地址等,並告訴所有 DHCP 伺服器,它將要接受哪一臺伺服器提供的 IP 地址,告訴其他的 DHCP 伺服器,撤銷它們提供的 IP 地址,以便提供給下一個 IP 租用請求者。

4)DHCP 伺服器廣播 DHCP ACK 包:伺服器通知主機允許(3)的設定,即正式將 IP 地址等資訊分配給主機

在完成第(4)步之前,主機還沒有得到 DHCP 伺服器的最後確認,所以它還沒有 IP 地址,DHCP 伺服器想
要給這個主機傳送訊息,仍然只能採取廣播的方式,廣播包中包含分配給這臺主機的 IP 地址等資訊。

至此,DHCP 的網路設定結束,可以進行正常的 TCP/IP 通訊了。


DHCP 設定中通常會有一個時間的限制,租期到了,分配的這個 IP 就會被收回。當然,就這好比租房子,你要續約也是可以的,只要你提前說就行,客戶端主機可以在這個時間限之前,傳送 DHCP Request 包通知想要延長租用時間

另外,當客戶端主機不再需要這個 IP 地址的時候,隨時可以通過傳送 DHCP Release 報文釋放自己的 IP 地址,DHCP 伺服器收到 DHCP Release 報文後,會回收相應的 IP 地址並重新分配。

DHCP 的三種機制

我們上述所說的工作機制是一種動態分配 IP 地址的方式,事實上,DHCP 有三種機制分配 IP 地址:

1)自動分配方式(Automatic Allocation),DHCP 伺服器為主機指定一個永久性的 IP 地址,一旦 DHCP 客戶端第一次成功從 DHCP 伺服器端租用到 IP 地址後,就可以永久性的使用該地址。

2)動態分配方式(Dynamic Allocation),DHCP 伺服器給主機指定一個具有時間限制的 IP 地址,時間到期或主機明確表示放棄該地址時,該地址可以被其他主機使用。

3)手工分配方式(Manual Allocation),客戶端的 IP 地址是由網路管理員指定的,DHCP 伺服器只是將指定的 IP 地址告訴客戶端主機。

很明顯,三種地址分配方式中,只有動態分配可以重複使用客戶端不再需要的地址。

DHCP 伺服器如何保證分配的 IP 地址不衝突

可以看出,DHCP 服務的正常運轉極度依賴於 DCHP 伺服器,如果 DHCP 伺服器發生故障了,將導致無法自動分配 IP 地址,也就是說該網段內所有主機之間都無法進行正常的 TCP/IP 通訊。

為此,人們通常會在一個網段內設定兩臺或以上的 DHCP 伺服器,這不可避免的產生一個問題:每個 DHCP 伺服器內記錄的都是這個網段的 IP 地址分配情況的資訊,各自分配的 IP 地址相互衝突在所難免。

為了避免衝突,DHCP 伺服器具備這樣的功能:

  • 在分配 IP 地址之前傳送 ICMP 回送請求包(關於 ICMP 協議詳見 所謂 ICMP,不過將軍與士卒而已),如果收到了返回應答報文,那不用說,這個 IP 地址已經被人用了。

同樣的,客戶端主機也得確認下 DCHP 伺服器分配的 IP 地址是否正在被人使用:

  • 針對從 DHCP 那裡獲得的 IP 地址傳送 ARP 請求報文(關於 ARP 協議詳見 5 幅圖拿下 ARP 協議),如果收到了返回應答,那顯然,根據這個 IP 地址都能找到 MAC 地址了,你說這個 IP 我還能不能用?

? 關注公眾號 | 飛天小牛肉,即時獲取更新

  • 博主東南大學碩士在讀,攜程 Java 後臺開發暑期實習生,利用課餘時間運營一個公眾號『 飛天小牛肉 』,2020/12/29 日開通,專注分享計算機基礎(資料結構 + 演算法 + 計算機網路 + 資料庫 + 作業系統 + Linux)、Java 技術棧等相關原創技術好文。本公眾號的目的就是讓大家可以快速掌握重點知識,有的放矢。關注公眾號第一時間獲取文章更新,成長的路上我們一起進步
  • 並推薦個人維護的開源教程類專案: CS-Wiki(Gitee 推薦專案,現已累計 1.7k+ star), 致力打造完善的後端知識體系,在技術的路上少走彎路,歡迎各位小夥伴前來交流學習 ~ ?
  • 如果各位小夥伴春招秋招沒有拿得出手的專案的話,可以參考我寫的一個專案「開源社群系統 Echo」Gitee 官方推薦專案,目前已累計 800+ star,基於 SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ... 並提供詳細的開發文件和配套教程。公眾號後臺回覆 Echo 可以獲取配套教程,目前尚在更新中。

相關文章