DHCP:Dynamic Host Configurtion Protocol
DHCP的工作原理(UDP)
1.客戶端:首先會發送給一個dhcp discovery(廣播)報文,報文中的2層和3層都是廣播地址。
2.服務器:收到客戶端發來的discovery報文后,單播回復一個dhcp offer(單播)報文(包含IP地址、租約信息、dns等),同時dhcp服務器也會生成一個租期表格(ip地址、租期、mac)。ps:此處為單播主要是原因是交換機有這client的mac列表,所以可以單播回復,減少資源消耗。
3.客戶端:收到服務器來的dhcp offer報文后,廣播發送一個dhcp request報文。包含自己的IP地址信息,目的是為了①:告訴別的DHCP服務器,我已經有地址了,你們之前准備分給我的地址,你們可以收回了。②告訴選中的DHCP,我選擇你了,你的地址我准備用了。
4.服務器:收到客戶端發來的dhcp request報文后,會發送一個dhcp ack或dhcp nak.服務器檢測后可以用,就回復ACK,如果地址沖突或者無效就回復NAK,客戶端重新獲取地址。
5.客戶端:獲取地址成功后,會發送1~3個DAD(免費ARP),確保地址在廣播網中可以使用。
DHCP租期
客戶端:當客戶端的地址租期到50%的時候,會主動發送一個dhcp request(單播),請求續租地址。如果服務器不回復,時間到達87.5%的時候,客戶端會再發送一個dhcp request(廣播)報文,請求續租地址。華為默認是1天(24h)。
dhcp報文
-
discovery:client發現DHCPserver報文
-
offer:server給客戶端分配的地址
-
request:client請求報文(①一開始請求地址②后來續租地址)
-
ack:server對client報文的確認
- nak:Server對Client的DHCPREQUEST報文的拒絕響應報文,Client收到此報文后,一般會重新開始新的DHCP過程。
-
release:client釋放地址發送的報文
- inform:client獲取更多的地址信息,例如后期需要獲取DNS(之前手動)。
- decline:Client發現Server分配給它的IP地址無法使用,如IP地址沖突時,將發出此報文,通知Server禁止使用IP地址
DHCP-request發送時間
從抓包來看,應該是0s、2s、5s、10s
DHCP中繼
原理:
-
發現階段
DHCP中繼接收到DHCP客戶端廣播發送的DHCP DISCOVER報文后,進行如下處理:- 檢查DHCP報文中的hops字段,如果大於16,則丟棄DHCP報文;否則,將hops字段加1(表明經過一次DHCP中繼),並繼續下面的操作。
DHCP報文中的hops字段表示DHCP報文經過的DHCP中繼的數目,該字段由客戶端或服務器設置為0,每經過一個DHCP中繼時,該字段加1。hops字段的作用是限制DHCP報文所經過的DHCP中繼的數目。目前,設備最多支持DHCP客戶端與服務器之間有存在16個中繼。 - 檢查DHCP報文中的giaddr字段。如果是0,將giaddr字段設置為接收DHCP DISCOVER報文的接口IP地址。如果不是0,則不修改該字段,繼續下面的操作。
DHCP報文中的giaddr字段標識客戶端網關的IP地址。如果服務器和客戶端不在同一個網段且中間存在多個DHCP中繼,當客戶端發出DHCP請求時,第一個DHCP中繼會把自己的IP地址填入此字段,后面的DHCP中繼不修改此字段內容,DHCP服務器會根據此字段來判斷出客戶端所在的網段地址,從而為客戶端分配該網段的IP地址。 - 將DHCP報文的目的IP地址改為DHCP服務器或下一跳中繼的IP地址,源地址改為中繼連接客戶端的接口地址,通過路由轉發將DHCP報文單播發送到DHCP服務器或下一跳中繼。
如果DHCP客戶端與DHCP服務器之間存在多個DHCP中繼,后面的中繼接收到DHCP DISCOVER報文的處理流程同前面所述。
- 檢查DHCP報文中的hops字段,如果大於16,則丟棄DHCP報文;否則,將hops字段加1(表明經過一次DHCP中繼),並繼續下面的操作。
- 提供階段
DHCP服務器接收到DHCP DISCOVER報文后,選擇與報文中giaddr字段為同一網段的地址池,並為客戶端分配IP地址等參數,然后向giaddr字段標識的DHCP中繼單播發送DHCP OFFER報文。
DHCP中繼收到DHCP OFFER報文后,會進行如下處理:
- 檢查報文中的giaddr字段,如果不是接口的地址,則丟棄該報文;否則,繼續下面的操作。
- DHCP中繼檢查報文的廣播標志位。如果廣播標志位為1,則將DHCP OFFER報文廣播發送給DHCP客戶端;否則將DHCP OFFER報文單播發送給DHCP客戶端。
報文格式
重點關注2個字段
Giaddr:該字段表示第一個DHCP中繼的IP地址(注意:不是地址池中定義的網關)。當客戶端發出DHCP請求時,如果服務器和客戶端不在同一個網絡中,那么第一個DHCP中繼在轉發這個DHCP請求報文時會把自己的IP地址填入此字段。服務器會根據此字段來判斷出網段地址,從而選擇為用戶分配地址的地址池。服務器還會根據此地址將響應報文發送給此DHCP中繼,再由DHCP中繼將此報文轉發給客戶端。若在到達DHCP服務器前經過了不止一個DHCP中繼,那么第一個DHCP中繼后的中繼不會改變此字段,只是把Hops的數目加1。
chaddr:該字段表示客戶端的MAC地址,此字段與前面的"Hardware Type"和"Hardware Length"保持一致。當客戶端發出DHCP請求時,將自己的硬件地址填入此字段。對於以太網,當"Hardware Type"和"Hardware Length"分別為"1"和"6"時,此字段必須填入6字節的以太網MAC地址。