簡介
DHCP是DynamicHostConfigurationProtocol之縮寫﹐它的前身是BOOTP。BOOTP原本是用於無磁碟主機連線的網路上面的﹕網路主機使用bootrom而不是磁碟起動並連線上網路﹐BOOTP則可以自動地為那些主機設定TCP/IP環境。但BOOTP有一個缺點:您在設定前須事先獲得客戶端的硬體位址,而且,與IP的對應是靜態的。換而言之,BOOTP非常缺乏"動態性",若在有限的IP資源環境中,BOOTP的一對一對應會造成非常可觀的浪費。
DHCP可以說是BOOTP的增強版本﹐它分為兩個部份﹕一個是伺服器端﹐而另一個是客戶端。所有的IP網路設定資料都由DHCP伺服器集中管理﹐並負責處理客戶端的DHCP要求﹔而客戶端則會使用從伺服器分配下來的IP環境資料。比較起BOOTP,DHCP透過"租約"的概念,有效且動態的分配客戶端的TCP/IP設定,而且,作為兼容考量,DHCP也完全照顧了BOOTPClient的需求。
DHCP的分配形式
首先﹐必須至少有一台DHCP工作在網路上面﹐它會監聽網路的DHCP請求﹐並與客戶端搓商TCP/IP的設定環境。它提供兩種IP定位方式﹕
AutomaticAllocation
自動分配﹐其情形是﹕一旦DHCP客戶端第一次成功的從DHCP伺服器端租用到IP位址之後﹐就永遠使用這個位址。
DynamicAllocation
動態分配﹐當DHCP第一次從HDCP伺服器端租用到IP位址之後﹐並非永久的使用該位址﹐只要租約到期﹐客戶端就得釋放(release)這個IP位址﹐以給其它工作站使用。當然﹐客戶端可以比其它主機更優先的延續(renew)租約﹐或是租用其它的IP位址。
動態分配顯然比自動分配更加靈活﹐尤其是當您的實際IP位址不足的時候﹐例如﹕您是一家ISP﹐只能提供200個IP位址用來給撥接客戶﹐但並不意味著您的客戶最多只能有200個。因為要知道﹐您的客戶們不可能全部同一時間上網的﹐除了他們各自的行為習慣的不同﹐也有可能是電話線路的限制。這樣﹐您就可以將這200個位址﹐輪流的租用給撥接上來的客戶使用了。這也是為什麼當您查看IP位址的時候﹐會因每次撥接而不同的原因了(除非您申請的是一個固定IP﹐通常的ISP都可以滿足這樣的要求﹐這或許要另外收費)。當然﹐ISP不一定使用DHCP來分配位址﹐但這個概念和使用IPPool的原理是一樣的。
DHCP除了能動態的設定IP位址之外﹐還可以將一些IP保留下來給一些特殊用途的機器使用﹐它可以按照硬體位址來固定的分配IP位址﹐這樣可以給您更大的設計空間。同時﹐DHCP還可以幫客戶端指定router﹑netmask﹑DNSServer﹑WINSServer﹑等等項目﹐您在客戶端上面﹐除了將DHCP選項打勾之外﹐幾乎無需做任何的IP環境設定。
DHCP的工作原理
視乎客戶端是否第一次登錄網路﹐DHCP的工作形式會有所不同。
第一次登錄的時候﹕
1.尋找Server。當DHCP客戶端第一次登錄網路的時候﹐也就是客戶發現本機上沒有任何IP資料設定﹐它會向網路發出一個DHCPDISCOVER封包。因為客戶端還不知道自己屬於哪一個網路﹐所以封包的來源位址會為0.0.0.0﹐而目的位址則為255.255.255.255﹐然後再附上Dhcpdiscover的信息﹐向網路進行廣播。
在Windows的預設情形下,Dhcpdiscover的等待時間預設為1秒﹐也就是當客戶端將第一個Dhcpdiscover封包送出去之後﹐在1秒之內沒有得到回應的話﹐就會進行第二次Dhcpdiscover廣播。若一直得不到回應的情況下﹐客戶端一共會有四次Dhcpdiscover廣播(包括第一次在內)﹐除了第一次會等待1秒之外﹐其餘三次的等待時間分別是9﹑13﹑16秒。如果都沒有得到DHCP伺服器的回應﹐客戶端則會顯示錯誤信息﹐宣告Dhcpdiscover的失敗。之後﹐基於使用者的選擇﹐系統會繼續在5分鐘之後再重複一次Dhcpdiscover的過程。
2.提供IP租用位址。當DHCP伺服器監聽到客戶端發出的Dhcpdiscover廣播後﹐它會從那些還沒有租出的位址範圍內﹐選擇最前面的的空置IP,連同其它TCP/IP設定,回應給客戶端一個DHCPOFFER封包。
由於客戶端在開始的時候還沒有IP位址﹐所以在其Dhcpdiscover封包內會帶有其MAC位址信息﹐並且有一個XID編號來辨別該封包﹐DHCP伺服器回應的Dhcpoffer封包則會根據這些資料傳遞給要求租約的客戶。根據伺服器端的設定﹐Dhcpoffer封包會包含一個租約期限的信息。
3.接受IP租約。如果客戶端收到網路上多台DHCP伺服器的回應﹐只會挑選其中一個Dhcpoffer而已(通常是最先抵達的那個)﹐並且會向網路傳送一個Dhcprequest廣播封包﹐告訴所有DHCP伺服器它將指定接受哪一台伺服器提供的IP位址。
同時﹐客戶端還會向網路傳送一個ARP封包﹐查詢網路上面有沒有其它機器使用該IP位址﹔如果發現該IP已經被占用﹐客戶端則會送出一個DHCPDECLINE封包給DHCP伺服器﹐拒絕接受其Dhcpoffer﹐並重新傳送Dhcpdiscover信息。
事實上﹐並不是所有DHCP客戶端都會無條件接受DHCP伺服器的offer﹐尤其這些主機安裝有其它TCP/IP相關的客戶軟體。客戶端也可以用Dhcprequest向伺服器提出DHCP選擇﹐而這些選擇會以不同的號碼填寫在DHCPOptionField裡面﹕
換一句話說﹐在DHCP伺服器上面的設定﹐未必是客戶端全都接受﹐客戶端可以保留自己的一些TCP/IP設定。而主動權永遠在客戶端這邊。
4.租約確認。當DHCP伺服器接收到客戶端的Dhcprequest之後﹐會向客戶端發出一個DHCPACK回應﹐以確認IP租約的正式生效﹐也就結束了一個完整的DHCP工作過程。
如上的工作流程如下圖:
DHCP發放流程
第一次登錄之後﹕
一旦DHCP客戶端成功地從伺服器哪裡取得DHCP租約之後﹐除非其租約已經失效並且IP位址也重新設定回0.0.0.0﹐否則就無需再傳送Dhcpdiscover信息了﹐而會直接使用已經租用到的IP位址向之前之DHCP伺服器發出Dhcprequest信息﹐DHCP伺服器會儘量讓客戶端使用原來的IP位址﹐如果沒問題的話﹐直接回應Dhcpack來確認則可。如果該位址已經失效或已經被其它機器使用了﹐伺服器則會回應一個DHCPNACK封包給客戶端﹐要求其從新執行Dhcpdiscover。
至於IP的租約期限卻是非常考究的﹐並非如我們租房子那樣簡單﹐以NT為例子﹕DHCP工作站除了在開機的時候發出dhcprequest請求之外﹐在租約期限一半的時候也會發出dhcprequest﹐如果此時得不到DHCP伺服器的確認的話﹐工作站還可以繼續使用該IP﹔然後在剩下的租約期限的再一半的時候(即租約的75%)﹐還得不到確認的話﹐那么工作站就不能擁有這個IP了。至於為什麼不是到租約期限完全結束才放棄IP呢﹖﹐對不起﹐小弟也是不學無術之人﹐沒有去深究了﹐只知道要回答MCSE題目的時候﹐您一定要記得NT是這么工作的就是了。
要是您想退租,可以隨時送出DHCPLEREASE命令解約﹐就算您的租約在前一秒鐘才獲得的。
跨網路的DHCP運作
從前面描述的過程中,我們不難發現:DHCDISCOVER是以廣播方式進行的,其情形只能在同一網路之內進行﹐因為router是不會將廣播傳送出去的。但如果DHCP伺服器安設在其它的網路上面呢﹖由於DHCP客戶端還沒有IP環境設定﹐所以也不知道Router位址﹐而且有些Router也不會將DHCP廣播封包傳遞出去﹐因此這情形下DHCPDISCOVER是永遠沒辦法抵達DHCP伺服器那端的,當然也不會發生OFFER及其他動作了。要解決這個問題,我們可以用DHCPAgent(或DHCPProxy)主機來接管客戶的DHCP請求﹐然後將此請求傳遞給真正的DHCP伺服器﹐然後將伺服器的回覆傳給客戶。這裡﹐Proxy主機必須自己具有路由能力,且能將雙方的封包互傳對方。
若不使用Proxy,您也可以在每一個網路之中安裝DHCP伺服器﹐但這樣的話﹐一來設備成本會增加﹐而且﹐管理上面也比較分散。當然囉﹐如果在一個十分大型的網路中﹐這樣的均衡式架構還是可取的。端視您的實際情況而定了。
DHCP封包格式
以下為各欄位的簡要說明:
OP
若是client送給server的封包,設為1,反向為2。
HTYPE
硬體類別,Ethernet為1。
HLEN
硬體位址長度,Ethernet為6。
HOPS
若封包需經過router傳送,每站加1,若在同一網內,為0。
TRANSACTIONID
DHCPREQUEST時產生的數值,以作DHCPREPLY時的依據。
SECONDS
Client端啟動時間(秒)。
FLAGS
從0到15共16bits,最左一bit為1時表示server將以廣播方式傳送封包給client,其餘尚未使用。
ciaddr
要是client端想繼續使用之前取得之IP位址,則列於這裡。
yiaddr
從server送回client之DHCPOFFER與DHCPACK封包中,此欄填寫分配給client的IP位址。
siaddr
若client需要透過網路開機,從server送出之DHCPOFFER、DHCPACK、DHCPNACK封包中,此欄填寫開機程式碼所在server之位址。
giaddr
若需跨網域進行DHCP發放,此欄為relayagent的位址,否則為0。
chaddr
Client之硬體位址。
sname
Server之名稱字串,以0x00結尾。
file
若client需要透過網路開機,此欄將指出開機程式名稱,稍後以TFTP傳送。
options
允許廠商定議選項(Vendor-SpecificArea),以提供更多的設定資訊(如:Netmask、Gateway、DNS、等等)。其長度可變,同時可攜帶多個選項,每一選項之第一個byte為資訊代碼,其後一個byte為該項資料長度,最後為項目內容。
DHCP的選項非常多,有空請查閱RFC或相關文獻,並好好理解,這裡不再敘述了。
DHCP協定之RFC檔案
RFC-951﹑RFC-1084﹑RFC-1123﹑RFC-1533﹑RFC-1534﹑RFC-1497﹑RFC-1541