初識 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 可以獲取配套教程,目前尚在更新中。