動態主機配置協議——DHCP詳解

来源:https://www.cnblogs.com/liugp/archive/2022/06/21/16398690.html
-Advertisement-
Play Games

一、DHCP簡介 DHCP(Dynamic Host Configuration Protocol),動態主機配置協議,是一個應用層協議。當我們將客戶主機ip地址設置為動態獲取方式時,DHCP伺服器就會根據DHCP協議給客戶端分配IP,使得客戶機能夠利用這個IP上網。 DHCP前身是BOOTP,在L ...


目錄

一、DHCP簡介

DHCP(Dynamic Host Configuration Protocol),動態主機配置協議,是一個應用層協議。當我們將客戶主機ip地址設置為動態獲取方式時,DHCP伺服器就會根據DHCP協議給客戶端分配IP,使得客戶機能夠利用這個IP上網。

DHCP前身是BOOTP,在Linux的網卡配置中也能看到顯示的是BOOTP,DHCP引進一個bootp沒有的概念:租約。bootp分配的地址是永久的,而dhcp分配的地址是可以有期限的。

DHCP分為兩個部分:一個是伺服器端,另一個是客戶端。

二、DHCP作用及特點
  • DHCP可以自動分配IP、子網掩碼、網關、DNS。
  • DHCP客戶端使用的埠68,服務端使用埠67,使用的UDP應用層的協議。
  • DHCP一般不為伺服器分配IP,因為他們要使用固定IP,所以DHCP一般只為辦公環境的主機分配IP。
  • DHCP伺服器和客戶端需要在一個區域網內,在為客戶端分配IP的時候需要進行多次廣播。但DHCP也可以為其他網段內主機分配IP,只要連接兩個網段中間的路由器能轉發DHCP配置請求即可,但這要求路由器配置中繼功能。

三、DHCP伺服器IP分配三種方式

1)自動分配(Automatic Allocation)(MAC地址與IP綁定)

自動分配是當DHCP客戶端第一次成功地從DHCP伺服器端分配到一個IP地址之後,就永遠使用這個地址。

2)動態分配(Dynamic Allocation)常用方式

動態分配是當DHCP客戶端第一次從DHCP伺服器分配到IP地址後,並非永久地使用該地址,每次使用完後,DHCP客戶端就得釋放這個IP地址,以給其他客戶端使用。

3)手動分配

手動分配是由DHCP伺服器管理員專門為客戶端指定IP地址。

三種方式的區別:

1、自動分配和手動分配都是分配靜態ip
2、自動分配需要在配置文件中配置IP與MAC對應關係,在在靜態表中,獲取IP必須通過DHCP伺服器
3、手動分配需要人工操作,不需要通過DHCP伺服器
4、動態分配有時效性

四、DHCP協議中的報文

  • DHCP DISCOVER :客戶端開始DHCP過程發送的包,是DHCP協議的開始
  • DHCP OFFER :伺服器接收到DHCP DISCOVER之後做出的響應,它包括了給予客戶端的IP(yiaddr)、客戶端的MAC地址、租約過期時間、伺服器的識別符以及其他信息
  • DHCP REQUEST :客戶端對於伺服器發出的DHCP OFFER所做出的響應。在續約租期的時候同樣會使用。
  • DHCP ACK :伺服器在接收到客戶端發來的DHCP REQUEST之後發出的成功確認的報文。在建立連接的時候,客戶端在接收到這個報文之後才會確認分配給它的IP和其他信息可以被允許使用。
  • DHCP NAK :DHCP ACK的相反的報文,表示伺服器拒絕了客戶端的請求。
  • DHCP RELEASE :一般出現在客戶端關機、下線等狀況。這個報文將會使DHCP伺服器釋放發出此報文的客戶端的IP地址
  • DHCP INFORM :客戶端發出的向伺服器請求一些信息的報文
  • DHCP DECLINE :當客戶端發現伺服器分配的IP地址無法使用(如IP地址衝突時),將發出此報文,通知伺服器禁止使用該IP地址。

五、DHCP服務工作流程

5.1、工作流程細節

第一步:搜索階段

當DHCP客戶端第一次登錄網路的時候,電腦發現本機上沒有任何IP地址設定,將以廣播方式發送DHCP discover發現信息來尋找DHCP伺服器,即向255.255.255.255發送特定的廣播信息。網路上每一臺安裝了TCP/IP協議的主機都會接收這個廣播信息,但只有DHCP伺服器才會做出響應。(DHCP DISCOVER

第二步:提供階段

在網路中接收到DHCP discover發現信息的DHCP伺服器就會做出響應,它從尚未分配的IP地址池中挑選一個分配給DHCP客戶機,向DHCP客戶機發送一個包含分配的IP地址和其他設置的DHCP offer提供信息。因為此時客戶端還沒有IP,所以返回信息也是以廣播的方式返回的。(DHCP OFFER

第三步:選擇階段

DHCP客戶端接受到DHCP offer提供信息之後,選擇第一個接收到的提供信息,然後以廣播的方式回答一個DHCP request請求信息,該信息包含向它所選定的DHCP伺服器請求IP地址的內容。(DHCP REQUEST

第四步:確認階段

當DHCP伺服器收到DHCP客戶端回答的DHCP request請求信息之後,便向DHCP客戶端發送一個包含它所提供的IP地址和其他設置的DHCP ack確認信息,確認租約,並指定租約時長。告訴DHCP客戶端可以使用它提供的IP地址。然後,DHCP客戶機便將其TCP/IP協議與網卡綁定,另外,除了DHCP客戶機選中的DHCP伺服器外,其他的DHCP伺服器將收回曾經提供的IP地址。(DHCP ACK

5.2、重新登錄

以後DHCP客戶端每次重新登錄網路時,就不需要再發送DHCP discover發現信息了,而是直接發送包含前一次所分配的IP地址的DHCP request請求信息。當DHCP伺服器收到這一信息後,它會嘗試讓DHCP客戶機繼續使用原來的IP地址,並回答一個DHCP ack確認信息。如果此IP地址已無法再分配給原來的DHCP客戶機使用時,則DHCP伺服器給DHCP客戶機回答一個DHCP nack否認信息。當原來的DHCP客戶機收到此DHCP nack否認信息後,它就必須重新發送DHCP discover發現信息來請求新的IP地址

5.2、續租

DHCP伺服器向DHCP客戶機出租的IP地址一般都有一個租借期限,期滿後DHCP伺服器便會收回出租的IP地址。如果DHCP客戶機要延長其IP租約,則必須更新其IP租約。DHCP客戶機啟動時和IP租約期限到達租約的50%時,DHCP客戶機都會自動向DHCP伺服器發送更新其IP租約的信息。

續租的過程(只有最後兩步請求):

Client--> DHCPREQUEST              # 單播:繼續請求使用提供的IP
          DHCPACK <-- Server       # 單播:確認續租

兩個租約表:

  • 靜態租約表:對應一個靜態租約存儲文件,server運行時從文件中讀取靜態租約表。
  • 動態租約表:對應一個周期存儲文件,server周期性將租約表存進該文件,在程式開始時將會讀取上次存放的租約表。(租約表記錄了當前所有分配的租約,包括靜態鏈接的)。

5.3、DHCP伺服器要跨網段提供服務

如果DHCP伺服器要跨網段提供服務,一樣是四步請求,只不過是每一步中間都多了一個路由器和DHCP伺服器之間的單播通信。

1)客戶端廣播方式發送報文,搜索DHCP伺服器。所有機器包括路由器都收到報文,路由器配置了中繼,知道搜索消息後單播給DHCP伺服器;

2)DHCP伺服器單播返回信息給路由器,路由器再廣播給客戶端;

3)客戶端選擇DHCP伺服器提供的IP,並廣播信息告訴它我選好了,路由器單播給DHCP伺服器;

4)DHCP伺服器收到信息將確認信息單播給路由器,路由器單播給客戶端。

5.4、小結:

  • 當電腦從一個子網移到另一個子網,找的DHCP伺服器不同,因為舊的租約還存在,會先續租,新的DHCP伺服器肯定拒絕它的續租請求,這時將重新開始四步請求。
  • 有些機器希望一直使用一個固定的IP,也就是靜態IP(static),除了手動進行配置,DHCP伺服器也可以實現這個功能。DHCP伺服器可以根據MAC地址來分配這台機器固定IP地址(保留地址),即使重啟或重裝了系統也不會改變根據MAC地址分配的地址(MAC地址跟IP綁定)。
  • 當收到客戶端的首次請求時,DHCP伺服器先查找靜態租約表;若存在請求的表項,返回這個客戶的靜態IP地址;否則,從IP地址池中選擇可用的IP分配給客戶,並添加信息到動態資料庫中。此外,伺服器將會周期性的刷新租約表寫入文件存檔,在這個過程中會順便對動態租約表進行租期檢查。

六、安裝和配置DHCP服務

6.1、安裝

$ yum -y install dhcp

常用的幾個配置文件

/etc/dhcp/dhcpd.conf    # DHCP配置文件
/usr/sbin/dhcpd         # DHCP服務程式
/usr/sbin/dhcrelay      # 中繼命令程式,用於跨網段提供DHCP服務
/var/lib/dhcpd/dhcpd.leases    # 存放租借信息(如IP)和租約信息(如租約時長)
/usr/share/doc/dhcp-4.2.5/dhcpd.conf.example # 配置文件的範例文件

6.2、首先關閉虛擬機自帶的DHCP功能

6.3、配置文件

cp  -r  /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf

dhcpd.conf中部分配置項:

# 每行分號結束
ddns-update-style none;      # 動態dns相關,幾乎不開啟它。也就是不管它。
ignore client-updates;       # 和上面的相關,也不管它
authoritative                # 聲明為權威伺服器
next-server marvin.redhat.com;    # PXE環境下指定的提供引導程式的文件伺服器
# DHCP配置文件里必須配置一個地址池,其和DHCP伺服器自身IP在同一網段
subnet 192.168.182.0 netmask 255.255.255.0 {
  range 192.168.182.100 192.168.182.150;             # 地址池
  option domain-name-servers ns1.internal.example.org;     # 為客戶端指明DNS伺服器地址,可以是多個,最多三個
  option domain-name "internal.example.org";               # 為客戶端指明DNS名字,定義了它會覆蓋客戶端/etc/resolv.conf里的配置
  option routers 192.168.182.2;               # 預設路由,其實就是網關
  option broadcast-address 192.168.182.255;    # 廣播地址,不設置時預設會根據A/B/C類地址自動計算
  default-lease-time 600;                # 預設租約時長
  max-lease-time 7200;                   # 最大租約時長
}

#下麵的是綁定MAC地址設置保留地址,保留地址不能是地址池中的地址
host fantasia {            # 固定地址的配置,host後面的是標識符,沒意義
  hardware ethernet 00:0c:29:ac:fa:91;
  fixed-address 192.168.182.10;      # 根據MAC地址分配的固定IP 
}

如果不讓dhcp修改/etc/resolv.conf里的內容,就在網卡配置文件/etc/sysconfig/network-scripts/ifcfg-ethX里添加一行選項:PEERDNS=no。
6.4、客戶端dhclient

dhclient是一個DHCP協議客戶端

語法格式:

dhclient [參數] [網路介面]

常用參數:

-p	指定dhcp客戶端監聽的埠號(預設埠號86)
-d	總是以前臺方式運行程式
-q	安靜模式,不列印任何錯誤的提示信息
-r	釋放ip地址
-n	不配置任何介面
-x	停止正在運行的DHCP客戶端,而不釋放當前租約,殺死現有的dhclient
-s	在獲取ip地址之前指定DHCP伺服器
-w	即使沒有找到廣播介面,也繼續運行

dhclient簡單使用:
1)在指定網路介面上發出DHCP請求

$ dhclient ens37

2)釋放IP地址(這裡註意一點,靜態ip也會被釋放,小心操作)

# 釋放所有網卡綁定的ip
$ dhclient -r
# 指定釋放哪個網卡
$ dhclient -r ens37

3)從指定的DHCP伺服器獲取ip地址

$ dhclient -s 192.168.182.149 ens37

4)停止運行dhclient(這裡也會釋放所有ip,包括靜態ip,謹慎操作)

$ dhclient -x

5)恢復:

重啟網卡(systemctl restart network),會恢復靜態ip和動態獲取ip
執行dhclient,不會恢復靜態ip,只會動態獲取一個ip

6.5、在客戶端如何獲取動態分配的地址呢?

方法1:systemctl restart network

但是每次重啟網路很麻煩,可以使用客戶端命令dhclient。

方法2:接執行dhclient命令

這種方法下會顯示4部請求中需要顯示的步驟信息,以及最終分配的地址,所以是一個很好的理解dhcp工作的工具。
但是這種方法只能使用一次,第二次執行命令會提示該進程已經在執行,因為dhclient是一個進程。可以kill掉該進程再執行dhclient,或者使用dhclient -d選項。

方法三:dhclient -d

6.5、如何重新獲取IP地址?
每次重啟網卡預設都獲取的同一個ip,有時候想換個ip都很麻煩。在/var/lib/dhclient/目錄下有".leases"文件,將它們清空或者刪除這些文件中對應網卡的部分,再重啟網路就可以獲取新的動態ip。

[root@centos7-1 ~]# cat /var/lib/dhclient/dhclient.leases 
lease {
  interface "ens33";
  fixed-address 192.168.182.178;
  option subnet-mask 255.255.255.0;
  option routers 192.168.182.2;
  option dhcp-lease-time 1800;
  option dhcp-message-type 5;
  option domain-name-servers 192.168.182.2;
  option dhcp-server-identifier 192.168.182.254;
  option broadcast-address 192.168.182.255;
  option domain-name "localdomain";
  renew 0 2021/07/11 04:11:04;
  rebind 0 2021/07/11 04:11:04;
  expire 0 2021/07/11 04:11:04;
}
lease {
  interface "ens37";
  fixed-address 192.168.182.248;
  option subnet-mask 255.255.255.0;
  option dhcp-lease-time 1800;
  option routers 192.168.182.2;
  option dhcp-message-type 5;
  option dhcp-server-identifier 192.168.182.254;
  option domain-name-servers 192.168.182.2;
  option broadcast-address 192.168.182.255;
  option domain-name "localdomain";
  renew 0 2021/07/11 04:10:50;
  rebind 0 2021/07/11 04:10:50;
  expire 0 2021/07/11 04:10:50;
}
lease {
  interface "ens37";
  fixed-address 192.168.182.10;
  option subnet-mask 255.255.255.0;
  option routers 192.168.182.2;
  option dhcp-lease-time 600;
  option dhcp-message-type 5;
  option domain-name-servers 120.240.95.33,120.240.95.33;
  option dhcp-server-identifier 192.168.182.244;
  option broadcast-address 192.168.182.255;
  option domain-name "example.org";
  renew 0 2021/07/11 04:23:24;
  rebind 0 2021/07/11 04:27:51;
  expire 0 2021/07/11 04:29:06;
}

或者,在/etc/sysconfig/network-scripts/ifcfg-ens37加入"DHCPRELEASE=yes"。
當運行ip link set ens37 down的時候就會發出dhcprelase報文,查看/etc/sysconfig/network-scripts/ifdown-ens37腳本中實際上是調用dhclient命令,用下麵這個命令應該也可以。

# 釋放ip
$ /sbin/dhclient -r ens37
# 停掉網卡
$ ip link set ens37 down
# 啟動網卡
$ ip link set ens37 up
七、DHCP中繼代理

DHCP中繼被稱為DHCP Relay;是為了實現不同子網和物理網段之間處理和轉發dhcp信息

工作過程:

  1. DHCP客戶機申請IP租約,發送DHCP-Discover包。
  2. 中繼代理收到該包,並轉發給另一個網段的DHCP伺服器。
  3. DHCP伺服器收到該包,將DHCP-Offer包發送給中繼代理。
  4. 中繼代理將地址租約(DHCP-Offer)轉發給DHCP客戶端。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 還有多少人不會python的控制結構,在評論區告訴我,讓我一個個點名提問。今天,就教會你python的控制結構… 分行與縮進 分行 •一條語句占用一行 •過長的語句可以占用多行,使用\或()控制換行 •[]、{}、()可以直接跨越多行,在列表、字典、元組中需要換行的時候也可以不用添加續行符 a ...
  • 3 Skywalking源碼導入 接上文,已經學習了Skywalking的應用,接下來我們將剖析Skywalking源碼,深度學習Skywalking Agent。 3.1 源碼環境搭建 當前最新版本是8.3.0,我們首先找到8.3.0的版本,然後下載並導入到IDEA,下載地址 https://gi ...
  • 《乘風破浪的姐姐3》王心凌一騎絕塵,破收視率,多年後再次全網爆火,某音截止現在差不多3500W粉絲,五月份熱門女星排名,弔打其它所有人,不愧是我女神! 但是這個熱度,感覺她的歌曲和MV,已經離收費越來越近了,於是我連夜用Python把所有MV 和歌曲離線,今天先給大家分享MV的方法。 女神鎮樓! 話 ...
  • 序列號 序列號是序列化和反序列化的唯一標識,是一個長整型數值; 如果類中不自己定義序列號,系統會自動生成一個序列號; 當一方實體類發生改變,而調用方的序列號是不會跟著改變的,不知道對象已修改,會導致兩邊序列號不一致,反序列化失敗; 所以要求必須手動生成一個序列號; 手動生成序列號後,可以解決目標類發 ...
  • 在我國自動化控制領域應用較廣泛的工業自動化組態軟體有Wonderware公司InTouch、西門子公司Wincc、GE公司iFix。國內也有一些傳統組態軟體廠商,使用的功能和形式基本上十分類似,受當時開發環境和組態軟體框架的限制,也很難做較大的改變。 ...
  • 什麼是JORM框架? 全稱 :Json Object Relational Mapping ,它是通過JSON 對象 去實現資料庫的一個關係映射 ,我理想中完整的JORM包含功能有 ·1、表權授權 2、欄位級別授權 3、查詢返回備註 4、可以配置化 5、支持豐富的SQL語法 6、數據驗證 7、JSO ...
  • 一:背景 1. 一個很好奇的問題 我們在學習 C# 的過程中,總會聽到一個詞叫做 內核態 ,比如說用 C# 讀寫文件,會涉及到代碼從 用戶態 到 內核態 的切換,用 HttpClient 獲取遠端的數據,也會涉及到 用戶態 到 內核態 的切換,那到底這是個什麼樣的交互流程?畢竟我們的程式是無法操控 ...
  • async和await詳解 1.非UI線程中執行 Test()函數帶有async 和await ,返回值寫成Task。 1 using System; 2 using System.Threading; 3 using System.Threading.Tasks; 4 5 namespace _0 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...