計算機網絡我也連載了很多篇了,大家可以在我的公眾號「程序員cxuan」 或者我的 github
系統學習。
計算機網絡第一篇,聊一聊網絡基礎 :計算機網絡基礎知識總結
計算機網絡第二篇,聊一聊 TCP/IP 基礎:TCP/IP 基礎知識總結
計算機網絡第三篇,這些應用層協議你也應該知道:拿下計網協議后,我就是公園里最靚的仔
計算機網絡第四篇,這篇文章寫的時間很長了,圖文精美,非常值得花時間閱讀:40 張圖帶你搞懂 TCP 和 UDP
計算機網絡第五篇,網絡層之路由器的基本概念:路由器你竟然是這樣的...
計算機網絡第六篇,了解一下 IP 基礎知識的概念:IP 基礎知識總結
計算機網絡第七篇,全方位了解一下網絡層的知識:我畫了 40 張圖就是為了讓你搞懂計算機網絡層
計算機網絡第八篇,了解一下 ARP 協議是什么:ARP,這個隱匿在計網背后的男人
計算機網絡第九篇,DNS 協議是面試經常會考到的點,這篇帶你深入了解一下 DNS 協議:萬字長文爆肝 DNS 協議!
計算機網絡第十篇 Ping 的工作原理你懂了,那 ICMP 你懂不懂?
哈嘍小伙伴們大家好啊,這里是 cxuan 計算機網絡連載系列的文章第 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 認證這些都是需要你了解並掌握的。
另外,添加我的微信 becomecxuan,加入每日一題群,每天一道面試題分享,更多內容請參見我的 Github,成為最好的 bestJavaer,已經收錄此篇文章,詳情見原文鏈接。
我自己肝了六本 PDF,微信搜索「程序員cxuan」關注公眾號后,在后台回復 cxuan ,領取全部 PDF,這些 PDF 如下