DHCP(Dynamic Host Configuration Protocol):動態主機配置協議
在常見的小型網絡中(例如家庭網絡和學生宿舍網),網絡管理員都是采用手工分配IP地址的方法,而到了中、大型網絡,這種方法就不太適用了。在中、大型網絡,特別是大型網絡中,往往有超過100台的客戶機,手動分配IP地址的方法就不太合適了。因此,我們必須引入一種高效的IP地址分配方法,幸好,DHCP(Dynamic Host Configuration Protocol)為我們解決了這一難題。
DHCP的優缺點
DHCP服務優點不少:網絡管理員可以驗證IP地址和其它配置參數,而不用去檢查每個主機;DHCP不會同時租借相同的IP地址給兩台主機;DHCP管理員可以約束特定的計算機使用特定的IP地址;可以為每個DHCP作用域設置很多選項;客戶機在不同子網間移動時不需要重新設置IP地址。
但同時也存在不少缺點:DHCP不能發現網絡上非DHCP客戶機已經在使用的IP地址;當網絡上存在多個DHCP服務器時,一個DHCP服務器不能查出已被其它服務器租出去的IP地址;DHCP服務器不能跨路由器與客戶機通信,除非路由器允許BOOTP轉發。
工作流程
DHCP服務的工作過程是這樣的:
1. 發現階段,即DHCP客戶機尋找DHCP服務器的階段。DHCP客戶機以廣播方式(因為DHCP服務器的IP地址對於客戶機來說是未知的)發送DHCP discover發現信息來尋找DHCP服務器,即向地址255.255.255.255發送特定的廣播信息。網絡上每一台安裝了TCP/IP協議的主機都會接收到這種廣播信息,但只有DHCP服務器才會做出響應。

2. 提供階段,即DHCP服務器提供IP地址的階段。在網絡中接收到DHCP discover發現信息的DHCP服務器都會做出響應,它從尚未出租的IP地址中挑選一個分配給DHCP客戶機,向DHCP客戶機發送一個包含出租的IP地址和其他設置的DHCP offer提供信息。

3. 選擇階段,即DHCP客戶機選擇某台DHCP服務器提供的IP地址的階段。如果有多台DHCP服務器向DHCP客戶機發來的DHCP offer提供信息,則DHCP客戶機只接受第一個收到的DHCP offer提供信息,然后它就以廣播方式回答一個DHCP request請求信息,該信息中包含向它所選定的DHCP服務器請求IP地址的內容。之所以要以廣播方式回答,是為了通知所有的DHCP服務器,他將選擇某台DHCP服務器所提供的IP地址。

4. 確認階段,即DHCP服務器確認所提供的IP地址的階段。當DHCP服務器收到DHCP客戶機回答的DHCP request請求信息之后,它便向DHCP客戶機發送一個包含它所提供的IP地址和其他設置的DHCP ack確認信息,告訴DHCP客戶機可以使用它所提供的IP地址。然后DHCP客戶機便將其TCP/IP協議與網卡綁定,另外,除DHCP客戶機選中的服務器外,其他的DHCP服務器都將收回曾提供的IP地址。

5. 重新登錄。以后DHCP客戶機每次重新登錄網絡時,就不需要再發送DHCP discover發現信息了,而是直接發送包含前一次所分配的IP地址的DHCP request請求信息。當DHCP服務器收到這一信息后,它會嘗試讓DHCP客戶機繼續使用原來的IP地址,並回答一個DHCP ack確認信息。如果此IP地址已無法再分配給原來的DHCP客戶機使用時(比如此IP地址已分配給其它DHCP客戶機使用),則DHCP服務器給DHCP客戶機回答一個DHCP nack否認信息。當原來的DHCP客戶機收到此DHCP nack否認信息后,它就必須重新發送DHCP discover發現信息來請求新的IP地址。
6. 更新租約。DHCP服務器向DHCP客戶機出租的IP地址一般都有一個租借期限,期滿后DHCP服務器便會收回出租的IP地址。如果DHCP客戶機要延長其IP租約,則必須更新其IP租約。DHCP客戶機啟動時和IP租約期限過一半時,DHCP客戶機都會自動向DHCP服務器發送更新其IP租約的信息。
為了便於理解,我們把DHCP客戶機比做餐館里的客人,DHCP服務器比做服務員(一個餐館里也可以有多個服務員),IP地址比做客戶需要的食物。那么可以這樣描述整個過程:客人走進餐館,問:“有沒有服務員啊?”(DHCP discover),多個服務員同時回答:“有,我這有雞翅”“有,我這有漢堡”(DHCP offer)。客人說:“好吧,我要一份漢堡”(DHCP request,這個客人比較死板,總是選擇第一次聽到的食物),端着漢堡的服務員回應了一聲:“來啦”(DHCP ack),並把食物端到客人面前,供其享用(將網卡和IP地址綁定)。客人下次來的時候,就直接找上次那個服務員點自己喜歡的漢堡了(DHCP request),如果還有漢堡,服務員會再次確認並上菜(DHCP ack),而如果已經賣完了,服務員則會告訴客人:“不好意思,已經賣完了”(DHCP nack)。當然,服務員隔一段時間會來收拾一次桌子,除非客人特別說明這菜還要繼續吃的,服務員會將剩菜端走。
DHCP CLIENT的行為
所有支持DHCP 協議並能夠發起DHCP過程的終端都稱之為DHCP CLIENT,包括普通PC機,各種特殊設備,如CABLE MODEM,IDT等。DHCP CLIENT自己必須能夠發出DHCPDISCOVER,DHCPREQUEST,DHCPDECLINE等報文(DHCPINFORM報文也是DHCP CLIENT發出但實際中很少見),並且必須能夠處理從服務器收到的以下幾種報文:DHCPOFFER,DHCPACK和DHCPNAK。

圖 DHCP CLIENT 行為圖
DHCP交互過程
標准的DHCP server 和client的交互過程如下圖所示,

圖 DHCP交互過程時序圖
如果客戶通過別的手段獲得了網絡地址,它可以使用DHCPINFORM請求獲得其它配置參數,服務器接收到DHCPINFORM包,並建立一個DHCPACK消息,在其中包括一些合適客戶的配置參數,只是不包括分配網絡地址,檢查現有的綁定,在信息中不填充'yiaddr'字段或租用時間參數。服務器取得DHCPINFORM包內的'ciaddr'地址,而返回DHCPACK包。
DHCPDECLINE ——客戶機通知服務器,其分配的地址已經被其他設.
DHCP: 動態主機配置協議
TCP/IP協議想要運行正常的話,網絡中的主機和路由器不可避免地需要配置一些信息(如接口的IP地址等)。有了這些配置信息主機/路由器才能提供/使用特定的網絡服務。
主機信息的必要元素有:IP地址、子網掩碼、DNS服務器IP地址
TCP/IP協議配置主機信息主要有三種方法:
1. 手動配置
2. 動態獲取
3. 根據特定算法計算。
在網絡中,我們把主機分為兩大類,服務器主機和客戶端主機,
+ 服務器主機: 一般采用手動配置
+ 客戶端主機: 一般采用動態獲取
服務器一般采用手動配置,而客戶端一般動態獲取。主要基於以下原因:
1. 客戶主機比服務主機移動更頻繁
2. 服務主機需要提供更可靠的服務,其配置信息應該減少對其他系統/主機的依賴
3. 客戶主機比服務主機的數量要多得多。
4. 客戶主機使用者的網絡配置知識比服務主機的使用者低
DHCP有Bootp協議發展而來。Bootp協議提供了有限的主機信息配置,且主機信息已經配置就很難被修改。DHCP提供 幾乎所有的主機信息的配置,且引入了租約等概念,使得主機信息能夠動態發生變化。 DHCP向后兼容Bootp。
DHCP基於UDP/IP傳輸。DHCP服務器使用端口號67,DHCP 客戶端使用端口號68.
DHCP 協議內容
DHCP 主要分為兩部分: 地址的管理 和 配置信息的傳遞
+ 地址管理: 地址管理處理IP‘地址的動態分配、向客戶端提供地址租約
+ 配置信息的傳遞: 包含DHCP報文格式、狀態機
DHCP 地址管理
地址池 與 地址租約
在IP地址的動態分配中,DHCP客戶端想DHCP服務器發送IP地址請求。DHCP服務器會維護一個 IP地址池,DHCP從地址池從取出一個IP回應給DHCP客戶端。在地址分配時,DHCP服務器也會指定回應給DHCP客戶端的IP地址的租約期,該地址只有在該租約期內可用,不過DHCP客戶端可用在租約期內請求延長租約(更新租約期)。
DHCP 報文
Op: 報文類型,分為 兩大類: Request(1) 和 Reply(2)
HW Type: 硬件類型,一般是以太網:1
HW Len: 硬件地址長度,單位字節。對應以太網:6(mac地址長度為6字節48bit)
Transaction ID:事務ID,隨機數,有客戶端生成,服務器Reply時,會把Request中的Transaction拷貝到Reply報文中。
Secs: 距離第一次發射IP請求或Renew請求過去的秒數
Flags:標志位,目前僅第一個bit有使用,置1 標明廣播
Client IP Address:當前客戶端的IP地址,如果當前客戶端沒有IP地址,則置0
Your IP Address: 服務器想客戶端提供IP地址時,會把IP地址填入本字段
(Next)Server IP Address:客戶端引導時需要的另一個服務器的IP地址
Gateway (Relay) IP Address: 網關(中繼)IP地址,有DHCP 中繼器在轉發DHCP報文的時候填入
Server Name: Server名字,有64bytes,一般不使用,填充為0
Boot File name: boot file的路徑,128bytes, 一般不使用,填充為0
Option: 選項,不定長度。 DHCP報文中比較重要的字段,后面會有比較詳細的介紹。
DHCP Option
DHCP從Bootp拓展而來,DHCP報文也是有Bootp報文發展而來。但是DHCP在Bootp之上添加了許多功能,其報文也需要有一定的拓展。如果Bootp報文不能滿足的內容,就以Option的形式存在於DHCP報文中。
DHCP協議其實就是攜帶許多Option的Bootp
DHCP有許多類型的Option,長度不一(但都是整數字節)。Option遵循以下格式
+ 如果Option沒有值,則只有標志位之類的內容,則以一個字節表示
+ 如果Opiton有值,即Opiton是以下name-value對,則Opiton需要多個字節表示,其中第一個字節表示 option的名字,第二字節表示value的長度,第三個字節開始表示value。
DHCP支持大量的Option(Bootp也支持其中的部分),下面列舉一些常用的
| Option | 名稱 | 描述 |
|---|---|---|
| 0 | Pad | 填充位 |
| 1 | Subnet Mask | 子網 掩碼 |
| 3 | Router Address | 路由器地址 |
| 6 | DNS | DNS server |
| 15 | DN | 域名 |
| 50 | Requested IP Address | 請求的IP地址 |
| 51 | Address Lease Time | 地址租約時間 |
| 53 | DHCP Message Type | DHCP 消息類型,如Discover、Request、Offer、ACK等 |
| 54 | Server Identifier | 服務器標識 |
| 55 | Parameter Request List | 參數請求列表 |
| 56 | DHCP Error Message | DHCP 錯誤消息 |
| 58 | Lease Renewal Time | 租約續期時間 |
| 59 | Lease Rebinding Time | 租約重新設定的時間 |
| 61 | Client Identifier | 客戶標識 |
| 119 | Domain Search List | 域名查找列表 |
| 255 | End | 結束 |
上面是常用的Option,DHCP報文與Option 255標識報文的結束。
在DHCP Option中,我們着重看下DHCP Message Type(53),DHCP Message Type標識DHCP消息類型,主要有一下類型
| DHCP 消息類型 | 對應的Option值 |
|---|---|
| DHCPDISCOVER | 1 |
| DHCPOFFER | 2 |
| DHCPREQUEST | 3 |
| DHCPDECLINE | 4 |
| DHCPACK | 5 |
| DHCPNAK | 6 |
| DHCPRELEASE | 7 |
| DHCPINFORM | 8 |
| DHCPFORCERENEW | 9 |
| DHCPLEASEQUERY | 10 |
| DHCPLEASEUNASSIGNED | 11 |
| DHCPLEASEUNKNOWN | 12 |
| DHCPLEASEACTIVE | 13 |
DHCP 協議 操作流程
主機新加入網絡時,獲取IP的流程
1. 新的client加入網絡時,會使用0.0.0.0作為源地址,發送discover廣播報文,查詢網絡上有哪些DHCP server,以及這些DHCP server 能Offer哪些IP地址
2. DHCP服務器接收到DHCP Discover報文后,回應Offer報文,提供IP地址(可能包含DNS等其他信息)給client
3. client 根據收到的Offer報文,選擇一個DHCP server,並選擇它提供的IP地址。然后廣播Request報文,想DHCP Server請求該IP地址,同時想本地網絡(尤其是其他DHCP Server)公告自己已經選擇了某個DHCP Server的某個IP地址。
4. DHCP Server 回應ACK報文,將IP地址分配給Client端 (特殊情況:DHCP Server在發送Offer報文和接收到Request的短暫時間內把IP分配給了其他主機)
5. DHCP Client 收到ACK報文后,會針對獲得的IP地址發送ARP Request,進行IP地址沖突檢測。
6. 如果IP地址已經被其他主機使用,則Client放棄該IP地址,想Server發送DHCP DECLINE報文告訴Server該地址不能使用。然后一段時間后(一般10s)再此嘗試獲取該IP地址
7. 如果Client仍然無法使用該IP地址,則發送DHCP RELEASE報文,放棄該地址。
主機已經有IP地址,只想更新租約
1. 此時可以跳過DHCP Discover報文和DHCP Offer報文
2. Client發送攜帶當前IP地址的Request報文
3. 如果Server同意Client續約,則發送DHCP ACK報文。如果拒絕續約,則發送DHCPNAK報文。
* 主機只想更新IP地址以外的信息*
用DHCPINFORM 取代 DHCP Request報文。
