實驗環(huán)境如下:客戶端計算機名:LSH-PC。客戶端硬件地址:00:23:5A:A6:97:4C。接入交換機:RGS3760E-24。
配置VLAN10(網關:192.168.10.252 ;DHCP地址池192.168.1 0.1-192.168.10.100)。
配置VLAN100(網關:192.168.100.1;DHCP地址池192.168.100.1-192.168.100.100)。
曾在文獻上對DHCP服務過程有詳細描述,形成的共識是四個過程,客戶端兩個廣播包,服務端兩個單播包。但這種描述并不完整。下面筆者將從不同的環(huán)境來深度剖析下DHCP服務詳細過程。
圖1 約租過程圖示
圖2 數(shù)據(jù)包解析
客戶端從服務器獲取IP的六個租約過程,如圖1所示。限于篇幅,如圖2所示的數(shù)據(jù)包都隱藏了相同的數(shù)據(jù)包,共保留了6種數(shù)據(jù)包,解析如下:
(1)客戶端發(fā)出發(fā)現(xiàn)報文:客戶端初始化TCP/IP,通過UDP端口67向網絡中發(fā)送一個DHCP發(fā)現(xiàn)廣播包,請求租用IP地址。
該廣播包中的源IP地址為0.0.0.0,目標IP地址為255.255.255.255;包中還包含客戶端的MAC地址和計算機名。
(2)DHCP回應提供報文:任何接收到DHCP發(fā)現(xiàn)廣播包并且能夠提供IP地址的DHCP服務器,都會通過UDP端口68給客戶端回應一個DHCP提供單播包以及提供一個IP地址。
該廣播包的源IP地址為192.168.10.252,目 標IP地 址為192.168.10.1; 包 中還包含提供的IP地址(192.168.10.1)、子網掩碼及租期等信息。
注意:這個地方很多資料顯示目標IP是255.255.255.255的廣播地址。其實這個提供報文里已經知道了客戶端的MAC地址,是通過二層轉發(fā)的,目標IP地址填為192.168.10.1是為了避免大量的廣播包在網上轉發(fā)。
通過查詢微軟的RFC中關于DHCP的文檔也證實了這一點。提供報文的目標IP是廣播還是單播是由客戶端的發(fā)現(xiàn)報文的FLAGS標志位來確定的,將RFC的英文文檔翻譯過來如下:
一個服務器或中繼代理發(fā)送或轉發(fā)DHCP消息直接為DHCP客戶端(即不在指定的中繼代理“giaddr”字段)應審查標志的廣播比特位即FLAGS標志位最高位。如果該位被設置為1,DHCP消息應該發(fā)送使用IP廣播地址的IP廣播(最好0xffffffff)作為IP目的地址,鏈路層廣播地址作為鏈路層目標地址。如果廣播位設置為0,該消息應作為IP單播發(fā)送到IP地址。
通過實驗也可證明這一點:在交換機上停掉所有DHCP服務,然后抓包發(fā)現(xiàn)客戶端默認發(fā)送發(fā)現(xiàn)數(shù)據(jù)包的FLAGS標志位是0X0000(即0000 0000 0000 0000)最高位置0,表示要求DHCP回應的提供數(shù)據(jù)包是單播。
如果沒有收到回應后才是發(fā)送廣播發(fā)現(xiàn)數(shù)據(jù)包,即0X8000(1000 0000 0000 0000)最高位置1(如圖3所示)。這樣DHCP服務器都會響應第一個默認要求單播的數(shù)據(jù)包。
圖3 抓包發(fā)現(xiàn)客戶端發(fā)送數(shù)據(jù)包
圖4 客戶端配置成功后發(fā)出報文
(3)客戶端發(fā)送請求IP租用報文:客戶端從DHCP服務器接收到提供之后,會選擇第一個收到的DHCP提供包,并向網絡中廣播一個DHCP(請求)消息包,表明自己已接受了一個DHCP服務器提供的IP地址。
該廣播包中包含所接受的IP地址和服務器的IP地址。所有其他的DHCP服務器撤消它們的提供,以便將IP地址提供給下一次IP租用請求。
(4)DHCP服 務 器 發(fā) 出IP租用確認報文:被客戶端選擇的DHCP服務器在收到DHCP(請求)廣播后,會單播返回給客戶端一個DHCP(確認)消息包,表明已接受客戶端的選擇,并將這一IP地址的合法租用以及其他的配置信息都放入該單播包發(fā)給客戶端。
(5)客戶端配置成功后發(fā)出的消息(公告)報文:客戶端在收到DHCP(確認)包,會發(fā)送一個免費ARP數(shù)據(jù)包來檢測本網段內該IP是否有沖突。
如果發(fā)現(xiàn)有客戶端在使用就會重新重復以上過程。如果沒有沖突就會使用該廣播包中的信息來配置自己的TCP/IP,并向本網段廣播自己的配置信息。
如圖4所示,根據(jù)絕對時間就可以判斷客戶端是在收到DHCP服務器發(fā)出IP租用確認報文后進行IP地址沖突檢測的。
(6)DHCP服務器再次回應確認包:DHCP服務器在收到DHCP(消息)廣播后表示IP可正式使用,則租用過程完成,客戶端可以在網絡中通信。
上面提到的都是在客端第一次接入網絡VLAN10(192.168.10.252)獲取IP的完整過程。當計算機重新啟動第二次接入網絡時報文如圖5所示。
(1)客戶端直接發(fā)送請求包:客戶端重新啟動時,如果租用期未超過50%,就會跳過前兩步,并以第一次曾經獲得的 IP(192.168.10.1)去向DHCP服務器進行廣播請求繼續(xù)使用。
(2)服務器回應確認數(shù)據(jù)包:服務器收到客戶端請求包后,會查看其IP登記表(如圖6所示),發(fā)現(xiàn)有分配過的記錄,如果該IP地址仍然可用的話,該DHCP服務器將給這臺客戶端返回一個確認消息。同樣,DHCP服務器上也會保留(在租用期內的)客戶端的地址。
如果你的DHCP服務器中租用期設得足夠長,則重啟一臺客戶端后,客戶端總是得到同一個地址。這正是由于客戶端和服務器能保存已分配地址所造成的。
(3)客戶配置成功后發(fā)出的消息(公告)報文:這個與上面的第5個數(shù)據(jù)包一樣,在公告之前同樣會發(fā)送一個免費ARP來檢測IP是否有沖突。
(4)DHCP服務器再次回應確認包:DHCP服務器在收到DHCP(消息)廣播后表示IP可正式使用,則租用過程完成,客戶端可以在網絡中通信。
圖5 第二次接入網絡的報文
圖6 IP登記表
圖7 獲取的IP數(shù)據(jù)包
當系統(tǒng)更換網卡后(這里更改客戶端LSH-PC的MAC(000000000001)即可),得到以下獲取IP的數(shù)據(jù)包(如圖7所示)。
從以上過程可以知道,客戶端仍然會用曾經獲取過的IP(192.168.10.1)去廣播一個請求數(shù)據(jù)包(除非把網卡刪掉重裝這個IP就會清除了),這個時候DHCP服務器收到請求包后檢查自己的IP分配記錄,沒有找到對應的MAC(000000000001)記錄,就廣播一個未確認包。
注意:這里不是單播包,因為DHCP服務器不確認客戶端是否希望從自己獲取IP了。
當客戶端沒有收到確認包,就會重復當?shù)谝淮谓尤刖W絡時的過程去獲取IP(192.168.10.2)。然后在DHCP服務器里就有了2條IP分配記錄了。
當客戶端接入另外一個網絡時,但這時已經在VLAN10中獲取過IP了,那么實質跟更換網卡有點類似。只不過是客戶端用曾經獲取過的 IP(192.168.10.1)去廣播一個請求數(shù)據(jù)包,但在VLAN100的DHCP地址分配池中沒有找到對應記錄。所以客戶端就會重復第一次接入網絡的過程獲取192.168.100.2的IP。這時在DHCP服務器里就有了3條IP分配記錄。