動態主機配置協議

       動態主機配置協議(Dynamic Host Configuration Protocol, DHCP)是一種流行的客戶機/服務器(C/S)協議。幾乎所有常用的客戶端操作系統和大量的嵌入式設備(例如網絡打印機和VoIP電話)都支持DHCP。這些設備通常使用DHCP獲得IP地址、子網掩碼、路由器的IP地址、DNS服務器的IP地址。其他服務的相關信息(例如使用VoIP的SIP服務器)也可通過DHCP傳輸。實際上DHCP的更準確說法應該是DHCPv4,因爲DHCP的最初設想是供IPv4使用,而IPv6使用的DHCP版本是DHCPv6。
       DHCP的設計基於一種早期協議——Internet引導程序協議(Bootstrap Protocol, BOOTP)。BOOTP爲客戶提供有限的配置信息,並且沒有提供一種機制來支持改變已提供的信息。DHCP使用租用的概念來擴展BOOTP模型,並且可提供主機操作所需的所有信息。租用允許客戶機使用一個商定的時間來配置信息。客戶機可向DHCP服務器請求續訂租約,並繼續操作。在這個意義上,BOOTP和DHCP是向後兼容的,純BOOTP客戶端可使用DHCP服務器,DHCP客戶端也可使用純BOOTP服務器。因此兩者都使用UDP/IP,客戶機使用端口68,服務器使用端口67。

 

  • 功能概述


       DHCP主要由兩個主要部分組成:地址管理和配置數據交付。地址管理用於IP地址的動態分配,併爲客戶機提供地址租用。配置數據交付包括DHCP協議的消息格式和狀態機。
       DHCP服務器可配置爲提供三種地址分配:自動分配、動態分配和手動分配。三者之間的差異是地址分配是否基於客戶機身份,以及該地址是否可撤銷或變更。在動態分配中,客戶機從服務器配置的地址池(通常爲一個預定義的範圍)中獲得一個可撤銷的IP地址,這也是最常用的地址分配方式。自動分配使用的是與動態分配相同的方法,但地址不可撤銷。在手動分配中,DHCP用於傳輸地址,但地址對於請求的客戶機是不變的(即它不是由服務器維護的可分配地址池的一部分)。手動分配的作用如同BOOTP。

 

  • 地址池和租用


       在動態分配中,DHCP客戶機請求分配一個地址,服務器從可用的地址池中選擇一個地址作爲響應。在通常情況下,地址池是專門爲DHCP用途而分配的一個連續的IP地址範圍。分配給客戶機的地址只在一段時間內有效,這段時間稱爲租用期。客戶機可使用分配到的地址一直到租用期到期,但客戶機可提出延長租期的請求,以續訂租約。
       租用期是DHCP服務器的一個重要配置參數,確定租用期的最佳數值需要對預期客戶數、地址池大小和地址穩定性等因素加以權衡。較長的租用期通常會較快耗盡可用的地址池,但能提供更穩定的地址和減小網絡開銷(因爲續租請求較少)。較短的租用期爲其他客戶提供可用性更高的地址池,但隨之而來的是穩定性減小和網絡流量負荷增大。客戶機在租用期過半時開始嘗試續訂租約。
       當發送DHCP請求時,客戶機需要向服務器提供信息。這些信息可包括客戶機名稱、請求的租用期等參數。DHCP服務器接收到客戶機的請求時,可利用客戶機提供的信息並結合其他從外部獲得的信息,決定在相應中提供的地址和配置信息。租用請求成功後,服務器將租用信息保存在持久性存儲器中。

 

  • DHCP消息格式


       DHCP擴展了BOOTP,因此DHCP消息格式的定義採用擴展BOOTP的方式,以保持兩種協議之間的兼容性,這樣即使在沒有安裝DHCP服務器的網絡中,BOOTP客戶機仍可使用DHCP服務器和BOOTP中繼代理支持DHCP服務。消息格式包括一個固定長度的初始部分和一個可變長度的尾部。如圖所示


       OP字段是請求(client發送給server,1)或應答(server發送給client,2)。HW類型字段(htype)的值基於ARP使用的值,若是以太網則爲1。HW長度字段(hlen)用於存放硬件(MAC)地址,對於類似以太網的網絡,該值通常爲6。跳步字段用於保存信息傳輸過程中的中繼次數,消息發送方將該值設置爲0,並在每次中繼時遞增。事務ID是由客戶機選擇(隨機)的一個數,服務器需要將它複製到響應消息中,它用於將應答與請求匹配。秒數字段由客戶機設置,它是申請地址經過的秒數。標誌字段當前只包含一個經過定義的位,稱爲廣播標誌,客戶機可能在請求中設置該位,表示他們不處理單播IP數據報(設置爲1),但可處理廣播數據報(例如客戶機沒有IP地址)。通過設置該位通知服務器和中繼代理,廣播地址可用於響應消息中。
       接下來四個字段是不同的IP地址。ciaddr包括請求者的IP地址(如果已知,否則爲0)。yiaddr由服務器填寫,以便向請求者提供服務器地址。siaddr給出下一個服務器的地址,它用於客戶機的引導過程(例如,如果客戶機需要下載一個可能需要由DHCP服務器之外的另一臺服務器完成的操作系統鏡像,即客戶機需要透過網絡開機則需要在消息中填入開機程序代碼所在的服務器的地址)。giaddr由DHCP或中繼代理填寫,它們在轉發消息時返回自己的地址。chaddr保存客戶機的唯一標識符,並可由服務器以不同方式來使用(例如當某個客戶機每次發送地址請求時爲其分配相同的IP地址),這個字段通常保存客戶機的MAC地址,它被用作一個標識符。
       其餘字段,服務器名和引導文件名字段雖然是消息格式中的固定長度部分,但這些字段並不是每次都需要填寫,它們分別包含64字節或128字節(沒錯,是字節)的ASCII字符,表示服務名或啓動文件路徑。如果空間緊張,它們可用於保存DHCP選項。最後一個選項字段在DHCP中長度是可變的,但在BOOTP中是長度固定的。

 

  • DHCP選項


       DHCP是對BOOTP的擴展,DHCP需要的有些字段在BOOTP設計之初是不存在的,這些字段可通過選項來攜帶。其中DHCP消息類型選項(53)是1字節長的選項,DHCP消息一定會使用它。它有以下可能值:DHCPDISCOVER (1)、DHCPOFFER(2)、DHCPREQUEST(3)、DHCPDECLINE(4)、DHCPACK(5)、DHCPNAK(6)、DHCPRELEASE(7)、DHCPINFORM(8)、DHCPFORCE-RENEW(9)、DHCPLEASEQUERY(10)、DHCPLEASEUNASSIGNED(11)、DHCPLEASEUNKNOWN(12)和DHCPLEASEACTIVE(13)。
    選項可由DHCP消息中的選項字段攜帶,也可以由前面提到的服務器名和引導文件名字段攜帶。當選項攜帶在後兩者中時,稱爲選項超載,將包含一個特殊的超載選項(52)來表明哪些字段適合攜帶選項。另外對於長度超過255字節的選項還定義了一種特殊的長選項機制。實際上,如果同一選項在同一消息中重複出現多次,它們的內容按出現在消息中的順序組合,並將結果作爲一個選項來處理。如果一個長選項用於表示選項超載,這時的處理順序是從後向前:選項字段、引導文件名字段和服務器名字段。

 

  • DHCP工作過程


       當一臺新的客戶機連接到網絡時,它首先發現可用的DHCP服務器,併發送廣播請求地址分配。然後,它從接收到的應答中決定使用哪臺服務器和哪個地址,並向該地址的服務器發送請求(同時將其選擇通知所有服務器)。除非服務器在此期間已將該地址分配出去,否則它通過確認將地址分配給請求的客戶機。過程如下圖:


       客戶機向服務器發送消息,使用UDP/IP數據報,由於客戶機一開始沒有IP地址,因此這種消息從地址0.0.0.0(端口68)發送到受限廣播地址255.255.255.255(端口67)。從服務器到客戶機的消息從服務器IP地址(端口67)發送到本地IP廣播地址(端口68)。
       在一次典型的DHCP交換中,客戶機首先廣播一個DHCPDISCOVER消息。對於接收到請求的每臺服務器,無論是直接接收還是通過中繼代理,它們都會響應一個DHCPOFFER消息,並在響應消息中的yiaddr字段中填寫提供的IP地址。其他配置選項(地理DNS服務器的IP地址、子網掩碼)也經常包含在內。DHCPOFFER消息中包含租用時間(T),它提供了在不更新租約的情況下地址可被租用的時間上限。這個消息還包含更新時間(T1),它是客戶機從獲得租約到嘗試要求服務器更新租約的時間,以及重新綁定時間(T2),它是客戶機嘗試要求DHCP服務器更新其地址的時間。在默認情況下,T1 = (T/2),T2 = (7T/8)。其中一種實現是,DHCPDISCOVER的等待時間預設爲1秒,也就是當客戶機將第一個DHCPDISCOVER封包送出去之後,在1秒之內沒有得到迴應的話,就會進行第二次DHCPDISCOVER廣播。若一直沒有得到迴應,客戶機會將這一廣播包重新發送四次(以2,4,8,16秒爲間隔,加上1-1000毫秒之間隨機長度的時間)。如果都沒有得到DHCP服務器的迴應,客戶機會從169.254.0.0/16這個自動保留的私有IP地址中選用一個IP地址。並且每隔5分鐘重新廣播一次,如果收到某個服務器的響應,則繼續IP租用過程
       當接收到來自一臺或多臺服務器的DHCPOFFER消息後,客戶機確定自己想接受哪個DHCPOFFER(策略有多種,最簡單的是處理接受最先達到的DHCPOFFER),並廣播一個包括服務器標識符選項的DHCPREQUEST消息,yiaddr字段設置爲由選中的DHCPOFFER消息提供的地址。多臺DHCP服務器可能接收到廣播的DHCPREQUEST消息,但只有DHCPREQUEST消息中標識的服務器同意將該地址進行綁定;其他服務器清除與該請求相關的狀態。在完成綁定後,選中的服務器響應一個DHCPACK消息,通知客戶機可以使用該地址。如果服務器無法分配包含在DHCPREQUEST消息中的地址,該服務器將會響應一個DHCPNAK消息。
       當客戶機接收DHCPACK消息和其他相關配置信息時,它可探測網絡以確保獲得的地址未被使用(例如向該地址發送一個ARP請求以執行ACD,相關內容請點擊:傳送門)。如果客戶機確定該地址已被使用,則客戶機就不適用該地址,並向服務器發送一個DHCPDECLINE消息,通知該地址不能使用。在經過默認的10秒延時後,客戶機可重試。如果一臺客戶機在租約到期前放棄該地址,它將發送一個DHCPPRELEASE消息。
       在一個客戶機已有一個IP地址並希望僅更新其租約的情況下,它可跳過最初的DHCPDISCOVER/DHCPOFFER消息。
       事實上,並不是所有DHCP客戶機都會無條件接受DHCP服務器的OFFER,特別是如果這些主機上安裝有其它TCP/IP相關的客戶機軟件。客戶機也可以用DHCP REQUEST向服務器提出DHCP選擇,這些選擇會以不同的號碼填寫在DHCP Option Field裏面。客戶機可以保留自己的一些TCP/IP設定。

 

  • DHCP狀態機


       DHCP在客戶機和服務器中運行一個狀態機。狀態用於指出協議下一個處理的消息類型。客戶機的狀態機如圖所示(相關狀態轉換及動作在圖中都有註釋):

 

  • DHCP中繼


       在最簡單的網絡中,一個DHCP服務器可供同一局域網中的客戶機使用。但是,在更復雜的網絡中,可通過一個或更多DHCP中繼代理來中繼DHCP流量。DHCP中繼如圖所示:
       中繼代理用於將DHCP操作擴展到跨越多個網段。在一般情況下,中繼不會參與客戶機與服務器之間的所有DHCP流量交換,中繼代理僅轉發消息,而且是那些廣播消息(或IPv6的組播)。這種消息通常在客戶機首次獲得自己的地址時交換。當一臺客戶機獲得一個IP地址,並且服務器的IP地址使用服務器標識選項時,它可與服務器進行單播通信而不經過中繼。中繼代理在傳統上是第3層(網絡層)設備,並且通常結合了路由功能。
DHCP和DNS交互
       當一臺DHCP客戶機獲得一個IP地址時,它接收的配置信息的重要部分是一臺DNS服務器的IP地址。它允許客戶機系統將DNS名稱轉換爲IPv4和/或IPv6地址,該地址是進行傳輸層連接時協議實現所需要的。如果沒有DNS服務器或其他方式將域名映射爲IP地址,用戶會難以訪問互聯網。如果本地DNS工作正常,它將Internet作爲一個整體來提供地址映射,但如果配置正確,也可針對本地的專用網絡(如.home)。
       由於本地專用網絡的DNS映射通常採用煩瑣的手工管理,因此,將指定的DHCP地址與相應地址的DNS映射更新方法結合起來會方便許多。這可通過組合DHCP/DNS服務器或動態DNS來實現。
       組合DHCP/DNS服務器是一個服務器程序,它可配置爲提供IP地址租約以及其他信息,也可讀取一個DHCPREQUEST消息中的客戶機標識符或域名,並在使用DHCPACK消息進行響應之前,通過“名稱到地址”的綁定來更新內部DNS數據庫。這樣,由DHCP客戶機或與相同DNS服務器交互的其他系統發起任何後續DNS請求,能夠在客戶機名稱和新分配的IP地址之間轉換。
                                                                                    本文內容摘自《TCP/IP詳解 卷1:協議(中文版)第2版》,有改動
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章