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