趣聊 DHCP ,有點意思

哈嘍小夥伴們大家好啊,這裏是計算機網絡連載系列的文章第 11 篇,本篇文章我們來聊一聊 DHCP 協議。在聊之前,先想象一個場景。

你現在站在地鐵上或者坐在辦公室中,你的手機也好,電腦也好都有一個 IP 地址假如這個 IP 地址是你手動輸入的,你需要寫下面這些東西 ……

電腦配置這些還好,直接咔咔咔的配置完了,如果你用的是手機,那麼你需要點到 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 地址。

除了 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 查找包的階段

查找包的階段主要分爲兩步:第一步是 DHCP 發現包,第二步是 DHCP 提供包。

DHCP 客戶端在通信鏈路上發起廣播,看看鏈路上有沒有能提供 DHCP 包的服務器,然後通信鏈路上的各個節點會檢查自己是否能夠提供 DHCP 包,這時 DHCP 服務器說它能夠提供 DHCP 包,然後 DHCP 就發出一個 DHCP 包沿着通信鏈路返回給 DHCP 客戶端。

第二個階段是 DHCP 的請求階段。

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 的狀態輪轉圖。

客戶端在開始時沒有消息,此時處於 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 衝突的彈窗。

DHCP 中繼代理

常規家庭網絡(土豪除外)中大多數都只有一個以太網,也就是 LAN 網段,一個 DHCP 服務器完全可以滿足 LAN 中的客戶機使用。但是,在更復雜的網絡中,比如企業或者學校,一臺 DHCP 服務器顯然就無法滿足了。因此,這種情況下,往往需要 DHCP 的統一管理,具體實現方式可以通過 DHCP 中繼代理 來轉發 DHCP 流量,如下圖所示。

如上圖所示,存在兩個網段 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 選項,如下所示

認證選項的主要目的就是確定 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 認證這些都是需要你瞭解並掌握的。

本文分享自微信公衆號 - 武培軒(wupeixuan404)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章