趣談 DHCP 協議,有點意思。
阿新 • • 發佈:2021-03-09
計算機網路我也連載了很多篇了,大家可以在我的公眾號「程式設計師cxuan」 或者我的 [github](https://github.com/crisxuan/bestJavaer#%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E7%B3%BB%E5%88%97)
系統學習。
計算機網路第一篇,聊一聊網路基礎 :[計算機網路基礎知識總結](https://mp.weixin.qq.com/s?__biz=MzI0ODk2NDIyMQ==&mid=2247486242&idx=1&sn=fac49b0b79515a5ed6afd4b341aff87b&chksm=e999fe30deee772637e1c52fb9001c60e60a772e7adba6701329c81974e76c57bb7b2e570225&scene=21#wechat_redirect)
計算機網路第二篇,聊一聊 TCP/IP 基礎:[TCP/IP 基礎知識總結](https://mp.weixin.qq.com/s?__biz=MzI0ODk2NDIyMQ==&mid=2247486408&idx=1&sn=c332ae7ae448f3eb98865003ecade589&chksm=e999fedadeee77cc6281d1b170bd906b58220d6cd83054bc741821f4167f1f18ceee9ba0e449&scene=21#wechat_redirect)
計算機網路第三篇,這些應用層協議你也應該知道:[拿下計網協議後,我就是公園裡最靚的仔](https://mp.weixin.qq.com/s?__biz=MzI0ODk2NDIyMQ==&mid=2247486507&idx=1&sn=622cc363b34bce54f4953076faa1cad6&chksm=e999f939deee702f2444df83ad9805de8c70fb88b89d299fdf0a82b3463e253f32372963c039&scene=21#wechat_redirect)
計算機網路第四篇,這篇文章寫的時間很長了,圖文精美,非常值得花時間閱讀:[40 張圖帶你搞懂 TCP 和 UDP](https://mp.weixin.qq.com/s?__biz=MzI0ODk2NDIyMQ==&mid=2247487108&idx=1&sn=7b47f421bb1dee4edb357a10399b7fec&chksm=e999fb96deee7280a17bfff44c27ef11a60e93e48f9da738670a779ecf6accb5a6a4ebd3cbcc&scene=21#wechat_redirect)
計算機網路第五篇,網路層之路由器的基本概念:[路由器你竟然是這樣的...](https://mp.weixin.qq.com/s?__biz=MzI0ODk2NDIyMQ==&mid=2247487351&idx=1&sn=9aa613589f85ce4c0c4142274e2a287d&chksm=e999fa65deee73732f97267db0e58d28925f4c57f7850d1e3b4633275385ac844e204fd03f03&scene=21#wechat_redirect)
計算機網路第六篇,瞭解一下 IP 基礎知識的概念:[IP 基礎知識總結](https://mp.weixin.qq.com/s?__biz=MzI0ODk2NDIyMQ==&mid=2247487569&idx=1&sn=b3a34ddd6cc99bc205a9bf7629a7753c&chksm=e999e543deee6c5528f275cdcf8da569ded23a79c926dd8310c3d14389f2c01a49519d96d88e&scene=21#wechat_redirect)
計算機網路第七篇,全方位瞭解一下網路層的知識:[我畫了 40 張圖就是為了讓你搞懂計算機網路層](https://mp.weixin.qq.com/s?__biz=MzI0ODk2NDIyMQ==&mid=2247487683&idx=1&sn=e0949e72e039759545450852d8bc0ada&chksm=e999e5d1deee6cc7ab9e42b50329924fee39c45955516b406046605d27928825a0f628d13e7c&scene=21#wechat_redirect)
計算機網路第八篇,瞭解一下 ARP 協議是什麼:[ARP,這個隱匿在計網背後的男人](https://mp.weixin.qq.com/s?__biz=MzI0ODk2NDIyMQ==&mid=2247487804&idx=1&sn=f001a24a308053b3723dfb12d36045ee&chksm=e999e42edeee6d383fbb411792e22e4028bb8c2441255786f50cf848443af7b1bd5e382078dc&scene=21#wechat_redirect)
計算機網路第九篇,DNS 協議是面試經常會考到的點,這篇帶你深入瞭解一下 DNS 協議:[萬字長文爆肝 DNS 協議!](https://mp.weixin.qq.com/s?__biz=MzI0ODk2NDIyMQ==&mid=2247487880&idx=1&sn=fd38ce30ae82fa7d08e5f83fabb9d497&chksm=e999e49adeee6d8c1adacbfe27dc59097e4cb9d39c6a04802b0fe61877653330e75721cbde0b&scene=21#wechat_redirect)
計算機網路第十篇 [Ping 的工作原理你懂了,那 ICMP 你懂不懂?](https://www.cnblogs.com/cxuanBlog/p/14445393.html)
![](https://s3.ax1x.com/2021/03/09/61oaQS.png)
哈嘍小夥伴們大家好啊,這裡是 cxuan 計算機網路連載系列的文章第 11 篇,本篇文章我們來聊一聊 DHCP 協議。在聊之前,先想象一個場景。
你現在站在地鐵上或者坐在辦公室中,你的手機也好,電腦也好都有一個 `IP 地址`,**假如這個 IP 地址是你動輸入的**,你需要寫下面這些東西 ......
![](https://s3.ax1x.com/2021/03/09/61oiqJ.png)
電腦配置這些還好,直接咔咔咔的配置完了,如果你用的是手機,那麼你需要點到 IP 地址,輸入 IP 地址,點到子網掩碼,輸入子網掩碼,點到預設路由,輸入路由,點到 DNS 伺服器,輸入 DNS 伺服器 ...... 這玩意這麼麻煩啊,恰好你剛配置完,領導叫你開會,得嘞,剛配置好的地址白瞎了。換了一個環境,需要重新配置 IP 地址,於是你把上面的步驟再重複了一遍,這時候散會了,然後你炸了。。。。。。
>我們還省去了你有可能配置錯誤的時候。
上面這段描述最讓人惱火的就是你需要手動配置 IP 地址,woc,為啥不能設定成自動配置 IP 地址呢?誰說不能的,能!那就是用 `DHCP`, 這也是我們下面要聊的內容。
## 認識 DHCP
`DHCP` 的全稱是 `Dynamic Host Configuration Protocol` 動態主機配置協議。使用 DHCP 就能實現自動設定 IP 地址、統一管理 IP 地址分配。也就是不管你是在開會還是在工位幹活,都省去了手動配置 IP 地址這一步繁瑣的操作,同時 DHCP 也大大減少了可能由於你手動分配 IP 地址導致錯誤的機率。
DHCP 與 IP 密切相關,它是 IP 網路上所使用的協議。如果你想要使用 DHCP 提供服務的話,那麼在整條通訊鏈路上就需要 `DHCP 伺服器`的存在,連線到網路的裝置使用 DHCP 協議從 DHCP 伺服器請求 IP 地址。DHCP 伺服器會為裝置分配一個唯一的 IP 地址。
![](https://s3.ax1x.com/2021/03/09/61okZ9.png)
> 除了 IP 地址外,DHCP 伺服器還會把子網掩碼,預設路由,DNS 伺服器告訴你。
### DHCP 伺服器
現在,你不需要手動配置 IP 地址,也不再需要管理 IP 地址了,管理權已經移交給了 DHCP 伺服器,DHCP 伺服器會維護 IP 地址池,在網路上啟動時會將地址租借給啟用 DHCP 的客戶端。
由於 IP 地址是**動態的(臨時分配)**而不是**靜態的(永久分配)**,因此不再使用的 IP 地址會自動返回 IP 地址池中進行重新分配。
>那麼 DHCP 伺服器由誰維護呢?
網路管理員負責建立 DHCP 伺服器,並以租約的形式向啟用 DHCP 的客戶端提供地址配置,啊,既然不需要我管理,那就很舒服了~
好了,現在你能舒舒服服的開發了,你用 postman 配了一條 192.168.1.4/x/x 的介面進行請求,請求能夠順利進行,但是過了一段時間後,你發現 192.168.1.4/x/x 這個介面請求不通了,這是為啥呢?然後你用 `ipconfig` 查詢了一下自己的 IP 地址,發現 IP 地址變成了 192.168.1.7,怎麼我用著用著 IP 地址還改了?DHCP 是個垃圾,破玩意!!@#¥%¥%……¥%
其實,這也是一個 DHCP 伺服器的一個功能,DHCP 伺服器通常為每個客戶端分配一個**唯一的動態 IP 地址**,當該 IP 地址的**客戶端租約到期**時,該地址就會更改。
唯一意思說的就是,如果你手動設定了一個靜態 IP,同時 DHCP 伺服器分配了一個動態 IP,這個動態 IP 和靜態 IP 一樣,那麼必然會有一個客戶端無法上網。
>我就遇到過這種情況,我使用虛擬機器配置的靜態 IP 是192.168.1.8,手機使用 DHCP 也同樣配置了 192.168.1.8 的 IP 地址,此時我的虛擬機器還沒有接入網路,當我接入網路時,我怎樣也連不上虛擬機器了,一查才發現 IP 地址衝突了 ......
雖然 DHCP 伺服器能提供 IP 地址,但是他怎麼知道哪些 IP 地址空閒,哪些 IP 地址正在使用呢?
實際上,這些資訊都配置在了`資料庫`中,下面我們就來一起看一下 DHCP 伺服器維護了哪些資訊。
* 網路上所有有效的 TCP/IP 配置引數
這些引數主要包括**主機名(Host name)、DHCP 客戶端(DHCP client)、域名(Domain name)、IP 地址IP address)、閘道器(Netmask)、廣播地址(Broadcast address)、預設路由(default rooter)**。
* 有效的 IP 地址和排除的 IP 地址,儲存在 IP 地址池中等待分配給客戶端
* 為某些特定的 DHCP 客戶端保留的地址,這些地址是靜態 IP,這樣可以將單個 IP 地址一致地分配給單個DHCP 客戶端
好了,現在你知道 DHCP 伺服器都需要儲存哪些資訊了,並且看過上面的內容,你應該知道一個 DHCP 的元件有哪些了,下面我們就來聊一聊 DHCP 中都有哪些元件,這些元件缺一不可。
### DHCP 的元件
使用 DHCP 時,瞭解所有的元件很重要,下面我為你列出了一些 DHCP 的元件和它們的作用都是什麼。
* `DHCP Server`,DHCP 伺服器,這個大家肯定都知道,因為我們上面就一直在探討 DHCP 伺服器的內容,使用 DHCP ,是一定要有 DHCP 伺服器的,要不然誰給你提供服務呢?
* `DHCP Client`,DHCP 客戶端,這個大家應該也知道,畢竟只有一個服務端不行啊,沒有客戶端你為誰服務啊?DHCP 的客戶端可以是**計算機、移動裝置或者其他需要連線到網路的任何裝置,預設情況下,大多數配置為接收 DHCP 資訊**。
* `Ip address pool`: 你得有 IP 地址池啊,雖然說你 DHCP 提供服務,但是你也得有工具啊,沒有工具玩兒啥?IP 地址池是 DHCP 客戶端可用的地址範圍,這個地址範圍通常由最低 -> 最高順序傳送。
* `Subnet`:這個元件是子網,IP 網路可以劃分一段一段的子網,子網更有助於網路管理。
* `Lease`:租期,這個表示的就是 IP 地址續約的期限,同時也代表了客戶端保留 IP 地址資訊的時間長度,一般租約到期時,客戶端必須續約。
* `DHCP relay`:DHCP 中繼器,這個一般比較難想到,DHCP 中繼器一般是路由器或者主機。DHCP 中繼器通常應對 DHCP 伺服器和 DHCP 客戶端不再同一個網斷的情況,如果 DHCP 伺服器和 DHCP 客戶端在同一個網段下,那麼客戶端可以正確的獲得動態分配的 IP 地址;如果不在的話,就需要使用 DHCP 中繼器進行中繼代理。
現在 DHCP 的元件你瞭解後,下面我就要和你聊聊 DHCP 的工作機制了。
## DHCP 工作機制
在聊 DHCP 工作機制前,先來看一下 DHCP 的報文訊息
### DHCP 報文
DHCP 報文共有一下幾種:
- **DHCP DISCOVER** :客戶端開始 DHCP 過程傳送的包,是 DHCP 協議的開始
- **DHCP OFFER** :伺服器接收到 DHCPDISCOVER 之後做出的響應,它包括了給予客戶端的 IP 租約過期時間、伺服器的識別符以及其他資訊
- **DHCP REQUEST** :客戶端對於伺服器發出的 DHCPOFFER 所做出的響應。在續約租期的時候同樣會使用。
- **DHCP ACK** :伺服器在接收到客戶端發來的 DHCPREQUEST 之後發出的成功確認的報文。在建立連線的時候,客戶端在接收到這個報文之後才會確認分配給它的 IP 和其他資訊可以被允許使用。
- **DHCP NAK** :DHCPACK 的相反的報文,表示伺服器拒絕了客戶端的請求。
- **DHCP RELEASE** :一般出現在客戶端關機、下線等狀況。這個報文將會使 DHCP 伺服器釋放發出此報文的客戶端的 IP 地址
- **DHCP INFORM** :客戶端發出的向伺服器請求一些資訊的報文
- **DHCP DECLINE** :當客戶端發現伺服器分配的 IP 地址無法使用(如 IP 地址衝突時),將發出此報文,通知伺服器禁止使用該 IP 地址。
DHCP 的工作機制比較簡單,無非就是客戶端向伺服器租借 IP ,伺服器提供 IP 給客戶端的這個過程唄。嗯,你很聰明,大致是這樣的,不過有一些細節需要注意下,下面我通過兩張圖來和你聊一下。
關於從 DHCP 中獲取 IP 地址的流程,主要分為兩個階段。
第一個階段是 DHCP 查詢包的階段
![](https://s3.ax1x.com/2021/03/09/61oAaR.png)
查詢包的階段主要分為兩步:第一步是 DHCP 發現包,第二步是 DHCP 提供包。
DHCP 客戶端在通訊鏈路上發起`廣播`,看看鏈路上有沒有能提供 DHCP 包的伺服器,然後通訊鏈路上的各個節點會檢查自己是否能夠提供 DHCP 包,這時 DHCP 伺服器說它能夠提供 DHCP 包,然後 DHCP 就發出一個 DHCP 包沿著通訊鏈路返回給 DHCP 客戶端。
第二個階段是 DHCP 的請求階段。
![](https://s3.ax1x.com/2021/03/09/61oPr4.png)
DHCP 的請求包也分為兩步:第一步是 DHCP 請求包,第二步是 DHCP 確認包。
DHCP 客戶端在通訊鏈路上發起 DHCP 請求包,請求包主要是告訴 DHCP 伺服器,它想要用上一步提供的網路設定,然後 DHCP 伺服器向 DHCP 客戶端傳送確認包,表示允許 DHCP 客戶端使用第二步傳送的網路設定。
至此,DHCP 的網路設定就結束了,然後通訊鏈路上的主機之間就可以進行 TCP/IP 通訊了。
當不需要 IP 地址時,可以傳送 `DHCP 解除包(DHCP RELEASE)`進行解除。另外,DHCP 的設定中通常會有一個租期時間的設定,DHCP 客戶端在這個時限內可以傳送 DHCP 請求包通知想要延長這個期限。
### DHCP 狀態機
我們上面知道 DHCP 會發送幾種請求包,我們知道,動作肯定伴隨著狀態的更改,DHCP 也是一樣的,在 DHCP 傳送/接收各種包的時候,其狀態也在發生相應的改變。DHCP 協議可以在客戶端和伺服器上執行狀態機。狀態決定了協議接下來要處理的訊息型別。
狀態之間的轉換(箭頭)是由於接收和傳送訊息或者計時器到期才發生的轉換。下面是 DHCP 的狀態輪轉圖。
![](https://s3.ax1x.com/2021/03/09/61oCMF.png)
客戶端在開始時沒有訊息,此時處於 `INIT` 狀態,然後客戶端會在通訊鏈路上發起一個廣播 `DHCP DISCOVER`。
在 `Selecting` 選擇狀態下,客戶端會收集 DHCPOFFER 訊息,直到確定要使用的地址和伺服器為止。
一旦 DHCP 客戶端做好選擇後,它就會發送 DHCPREQUEST 訊息並進入 `Requesting 狀態`,在這個狀態下它很可能收到並不需要的 ACK 響應,如果這個狀態下沒有找到合適的地址的話,那麼客戶端就會發送`DHCPDECLINE` 並恢復為 INIT 狀態,但是這種發生的概率比較小。
在處於 Requesting 狀態下的客戶端很可能接受傳送過來的 DHCPACK 訊息,獲取超時時間 `T1` 和 `T2`,然後進入 `Bound` 繫結狀態,在這個狀態下可以使用地址直到地址過期。
在第一個計時器 T1 到期時,客戶端會進入 `renewing` 續訂狀態,並重新嘗試建立租約時間,如果收到新的 ACK 訊息就表示續訂成功,然後就恢復為 Bound 狀態。
如果沒有收到 ACK 那麼 T2 會最終過期進入 `Rebinding` 狀態,進入這個狀態的客戶端會重新嘗試獲取地址,如果最終的租約到期,那麼客戶端必須放棄租約地址,並且如果沒有其他地址或網路連線要使用,客戶端將斷開連線。
### DHCP 衝突
現在我們討論一下 DHCP 衝突的問題,DHCP 衝突其實就是 IP `重了`,當一個子網中兩個或者更多主機配置了相同的 IP 地址時,就會發生 IP 衝突的現象。發生這種情況可能導致的後果是兩個衝突的主機混在一起,一臺主機可能接收了另一臺主機的資料包。
>那麼造成這種情況的原因是啥呢?
造成這種情況的原因有很多,這裡我列舉兩個可能出現的情況:
* 第一種情況是一臺主機配置了靜態 IP 地址,這臺主機聯網後,其 IP 地址不會在 DHCP 伺服器中,然後另外一個主機入網,DHCP 伺服器給這臺主機自動分配了相同的 IP 地址,這兩個地址就產生了 IP 衝突。
* 第二種情況是,客戶端從 DHCP 伺服器獲得了 IP 地址,然後這臺主機下線了,隨著租約到期,DHCP 會將這個 IP 地址又分配給了其他主機,等到這個主機重新上線後,由於某種原因,計算機無法訪問 DHCP 伺服器,這種情況下會造成 IP 衝突。
當檢測到 IP 衝突時,通常 Windows 系統和 Mac 系統會彈出 IP 衝突的彈窗。
![](https://s3.ax1x.com/2021/03/09/61oEI1.png)
## DHCP 中繼代理
常規家庭網路(土豪除外)中大多數都只有一個`乙太網`,也就是 LAN 網段,一個 DHCP 伺服器完全可以滿足 LAN 中的客戶機使用。但是,在更復雜的網路中,比如企業或者學校,一臺 DHCP 伺服器顯然就無法滿足了。因此,這種情況下,往往需要 DHCP 的統一管理,具體實現方式可以通過 `DHCP 中繼代理` 來轉發 DHCP 流量,如下圖所示。
![](https://s3.ax1x.com/2021/03/09/61oZPx.png)
如上圖所示,存在兩個網段 A 和網段 B,DHCP 客戶機和 DHCP 伺服器不在一個網段內,所以我們在通訊鏈路上架設了一箇中繼代理,DHCP 客戶機通過訪問中繼代理以達到訪問 DHCP 伺服器的目的。
使用這種方式,我們不再需要在每個網段都設定一個 DHCP 伺服器,只需要在每個網段架設一箇中繼代理即可。它可以設定 DHCP 伺服器的 IP 地址,從而可以在 DHCP 伺服器上為每個網段註冊 IP 地址的分配範圍。
DHCP 客戶端會向 DHCP 中繼代理髮送 DHCP 請求包,而 DHCP 中繼代理在收到這個廣播包之後再以單播的形式傳送給 DHCP 伺服器。伺服器收到該包以後再向 DHCP 中繼代理返回應答,並由 DHCP 中繼代理將此包傳送給 DHCP 客戶端。
## DHCP 認證
**我們總是假想所有情況都能夠順利進行,害怕出問題,這也許意味著我永遠只是個初級程式設計師吧**。我們上面探討的 DHCP 伺服器都是合理的、合法的,但是網際網路是一把雙刃劍,不是所有人都是合法公民。如果假設了一個未經授權的 DHCP 伺服器怎麼辦?它很可能會對網路造成影響。
為了避免這些問題,在 [RFC3118] 中指定了一種認證 DHCP 訊息的方法。 它定義了一個 DHCP 選項,即Authentication 選項,如下所示
![](https://s3.ax1x.com/2021/03/09/61oeG6.png)
認證選項的主要目的就是**確定 DHCP 訊息是否來自一個授權的傳送方**。
身份驗證的程式碼(code)屬性值是 90,而長度(Length)給出了選項中的位元組數(不包括程式碼和長度欄位的位元組)。如果協議(Protocol)和演算法(Algorithm)屬性被設定為 0 ,則`認證資訊`欄位將儲存一個簡單的共享配置的 token,token 大家開發應該都接觸過把,就是一條認證資訊。只要配置令牌在客戶端和伺服器上匹配,這條訊息就會被接受。
我們上面聊到的只是其中的一種,還有一種更安全的方法是涉及所謂的`延遲身份認證`,如果協議和演算法都被設定為 1,就表示使用了延遲身份認證。在這種情況下,客戶端的 DHCPDISCOVER 訊息或 DHCPINFORM 訊息包括身份驗證選項,並且伺服器以其 DHCPOFFER 或 DHCPACK 訊息中包含的身份驗證資訊進行響應。這個認證資訊中包括一個`訊息認證碼`,它提供對傳送方的認證和訊息的完整性校驗。RDM 表示中繼檢測,中繼檢測包括一個單項遞增的值,只要經過一個代理中繼,那麼這個中繼檢測的值就會 + 1。
雖然 DHCP 認證能夠確保安全性,但是它沒有被廣泛使用,原因有兩點:
* 首先,該方法要求在 DHCP 伺服器和每個需要身份驗證的客戶端之間分配共享金鑰。
* 其次,在 DHCP 已經被廣泛使用之後,才指定了 Authentication 選項。
## 總結
這篇文章我和你探討了計算機網路中一個比較容易忽視的概念,為什麼說他容易忽視呢?因為我們平常開發過程中基本上不會管 IP 地址的配置的,也就是環境搭建的時候會用到一些,但是要系統學習計算機網路的話,DHCP 的重要性不可忽視,DHCP 包括工作機制、DHCP 報文訊息,DHCP 狀態機、DHCP 認證這些都是需要你瞭解並掌握的。
**另外,新增我的微信 becomecxuan,加入每日一題群,每天一道面試題分享,更多內容請參見我的 Github,成為最好的 bestJavaer,已經收錄此篇文章,詳情見原文連結**。
**我自己肝了六本 PDF,微信搜尋「程式設計師cxuan」關注公眾號後,在後臺回覆 cxuan ,領取全部 PDF,這些 PDF 如下**
[六本 PDF 連結](https://s3.ax1x.com/2020/11/30/DgOK6f.png)
![](https://img2020.cnblogs.com/blog/1515111/202011/1515111-20201130090550310-10329982