1、报文分类

DHCP一共有8种报文,分别为DHCP Discover、DHCP Offer、DHCP Request、DHCP ACK、DHCP NAK、DHCP Release、DHCP Decline、DHCP Inform。各种类型报文的基本功能如下:

DHCP 报文类型说明
DHCP DiscoverDHCP 客户端在请求 IP 地址时并不知道 DHCP 服务器的位置,因此 DHCP 客户端会在本地网络内以 广播方式发送 Discover 请求报文,以发现网络中的 DHCP 服务器。所有收到 Discover 报文的 DHCP 服务 器都会发送应答报文, DHCP 客户端据此可以知道网络 中存在的 DHCP 服务器的位置。
DHCP OfferDHCP 服务器收到 Discover 报文后,就会在所配置的 地址池中查找一个合适的 IP 地址,加上相应的租约期 限和其他配置信息(如网关、 DNS 服务器等),构造一 个Offer 报文,发送给 DHCP 客户端,告知用户本服务 器可以为其提供 IP 地址。但这个报文只是告诉 DHCP 客户端可以提供 IP 地址,最终还需要客户端通过 ARP 来 检测该 IP 地址是否重复。
DHCP RequestDHCP 客户端可能会收到很多 Offer 请求报文,所以必 须在这些应答中选择一个。通常是选择第一个 Offer 应答 报文的服务器作为自己的目标服务器,并向该服务器发送一个广播的 Request 请求报文,通告选择的服务器, 希望获得所分配的 IP 地址。另外, DHCP 客户端在成 功获取 IP 地址后,在地址使用租期达到50% 时,会向DHCP 服务器发送单播 Request 请求报文请求续延租约, 如果没有收到 ACK 报文,在租期达到87.5% 时,会再次发送 广播的 Request 请求报文以请求续延租约。
DHCP ACKDHCP 服务器收到 Request 请求报文后,根据 Request 报文 中携带的用户 MAC 来查找有没有相应的租约记录,如果有 则发送 ACK 应答报文,通知用户可以使用分配的 IP 地址。
DHCP NAK如果 DHCP 服务器收到 Request 请求报文后,没有发现有相 应的租约记录或者由于某些原因无法正常分配 IP 地址,则向 DHCP 客户端发送 NAK 应答报文,通知用户无法分配合适的 IP 地址。
DHCP Release当 DHCP 客户端不再需要使用分配 IP 地址时,就会主动向 DHCP 服务器发送RELEASE 请求报文,告知服务器用户不 再需要分配 IP 地址,请求 DHCP 服务器释放对应的 IP 地址。
DHCP DeclineDHCP 客户端收到 DHCP 服务器 ACK 应答报文后,通过地址 冲突检测发现服务器分配的地址冲突或者由于其他原因导致 不能使用,则会向 DHCP 服务器发送 Decline请求报文,通知 服务器所分配的 IP 地址不可用,以期获得新的 IP 地址。
DHCP InformDHCP 客户端如果需要从 DHCP 服务器端获取更为详细的配 置信息,则向 DHCP 服务器发送 Inform 请求报文; DHCP 服 务器在收到该报文后,将根据租约进行查找到相应的配置信 息后,向 DHCP 客户端发送 ACK 应答报文。目前基本上不用了。

2、报文格式

DHCP服务的8种报文的格式是相同的,不同类型的报文只是报文中的某些字段取值不同。DHCP报文格式基于BOOTP的报文格式。下面是各字段的说明。
在这里插入图片描述

DHCP报文中各字段含义:

字段长度含义
OP1字节表示报文的类型: 1:客户端请求报文 2:服务器响应报文
htype1字节表示硬件地址的类型。对于以太网,该类型的值为“1”。
hlen1字节表示硬件地址的长度,单位是字节。对于以太网,该值为6。
Hops1字节跳数。客户端设置为0,也能被一个代理服务器设置。
xid4字节事务ID,由客户端选择的一个随机数,被服务器和客户端用来在它们之间交流请求和响应,客户端用它对请求和应答进行匹配。该ID由客户端设置并由服务器返回,为32位整数。
secs2字节由客户端填充,表示从客户端开始获得IP地址或IP地址续借后所使用了的秒数。
flags2字节此字段在BOOTP中保留未用,在DHCP中表示标志字段。 只有标志字段的最高位才有意义,其余的位均被置为0。 最左边的字段被解释为广播响应标志位,内容如下所示: a客户端请求服务器以单播形式发送响应报文 1:客户端请求服务器以广播形式发送响应报文。
ciaddr4字节客户端的IP地址。只有客户端是Bound、Renew、Rebinding状态,并且能响应ARP请求时,才能被填充。
yiaddr4字节"你自己的"或客户端的IP地址。
siaddr4字节表明DHCP协议流程的下一个阶段要使用的服务器的IP地址。
giaddr4字节该字段表示第一个DHCP中继的IP地址(注意:不是地址池中定义的网关)。当客户端发出DHCP请求时,如果服务器和客户端不在同一个网络中,那么第一个DHCP中继在转发这个DHCP请求报文时会把自己的IP地址填入此字段。服务器会根据此字段来判断出网段地址,从而选择为用户分配地址的地址池。服务器还会根据此地址将响应报文发送给此DHCP中继,再由DHCP中继将此报文转发给客户端。 若在到达DHCP服务器前经过了不止一个DHCP中继,那么第一个DHCP中继后的中继不会改变此字段,只是把Hops的数目加1。
zhaddr16字节该字段表示客户端的MAC地址,此字段与前面的“Hardware Type”和“Hardware Length”保持一致。当客户端发出DHCP请求时,将自己的硬件地址填入此字段。对于以太网,当“Hardware Type”和“Hardware Length”分别为“1”和“6”时,此字段必须填入6字节的以太网MAC地址。
sname64字节该字段表示客户端获取配置信息的服务器名字。此字段由DHCP Server填写,是可选的。如果填写,必须是一个以0结尾的字符串。
file128字节该字段表示客户端的启动配置文件名。此字段由DHCP Server填写,是可选的,如果填写,必须是一个以0结尾的字符串。
options可变该字段表示DHCP的选项字段,至少为312字节,格式为"代码+长度+数据"。DHCP通过此字段包含了服务器分配给终端的配置信息,如网关IP地址,DNS服务器的IP地址,客户端可以使用IP地址的有效租期等信息。

DHCP Options定义

options id长度描述
14Subnet Mask
3n*4Router(网关)
6n*4DNS Server
7n*4Log Server
262interface MTU
33n*8Static router
354ARP cache timeout
42n*4NTP servers
514IP address lease time
531Message type: 1-DHCPDISCOVER 2-DHCPOFFER 3-DHCPREQUEST 4-DHCPDECLINE 5-DHCPACK 6-DHCPNAK 7-DHCPRELEASE 8-DHCPINFORM
544DHCP Server Identifier
60n华为自定义:可配置该终端设备在发起DHCP请求时,通过Option 60携带域信息。收到DHCP报文时,可根据Option 60中携带的域信息来分配IP地址。
82n华为自定义:作为DHCP Relay,在中继用户DHCP报文时,可在Option 82中填写用户的物理位置信息,通知DHCP服务器按物理位置信息对为用户分配IP地址。

3、报文样例

3.1、DHCPDISCOVER

客户端发送一个DHCPDISCOVER数据包。以下是网络监视器捕获的摘录,显示DHCPDISCOVER数据包的IP和DHCP部分。在IP部分,可以看到目标地址是255.255.255.255,源地址是0.0.0.0。DHCP部分将数据包标识为发现数据包,并使用网卡的物理地址在两个位置标识客户端。注意CHADDR字段和DHCP:客户端标识符字段中的值相同。

IP: ID = 0x0; Proto = UDP; Len: 328 
IP: Version = 4 (0x4) 
IP: Header Length = 20 (0x14)
IP: Service Type = 0 (0x0) 
IP: Precedence = Routine 
IP: ...0.... = Normal Delay 
IP: ....0... = Normal Throughput 
IP: .....0.. = Normal Reliability 
IP: Total Length = 328 (0x148) 
IP: Identification = 0 (0x0)
IP: Flags Summary = 0 (0x0) 
IP: .......0 = Last fragment in datagram 
IP: ......0. = May fragment datagram if necessary 
IP: Fragment Offset = 0 (0x0) bytes
IP: Time to Live = 128 (0x80) 
IP: Protocol = UDP - User Datagram 
IP: Checksum = 0x39A6 
IP: Source Address = 0.0.0.0 
IP: Destination Address = 255.255.255.255 
IP: Data: Number of data bytes remaining = 308 (0x0134) 

DHCP: Discover (xid=21274A1D) 
DHCP: Op Code (op) = 1 (0x1) 
DHCP: Hardware Type (htype) = 1 (0x1) 10Mb Ethernet 
DHCP: Hardware Address Length (hlen) = 6 (0x6) 
DHCP: Hops (hops) = 0 (0x0) 
DHCP: Transaction ID (xid) = 556223005 (0x21274A1D) 
DHCP: Seconds (secs) = 0 (0x0) DHCP: Flags (flags) = 0 (0x0) 
DHCP: 0............... = No Broadcast 
DHCP: Client IP Address (ciaddr) = 0.0.0.0 
DHCP: Your IP Address (yiaddr) = 0.0.0.0 
DHCP: Server IP Address (siaddr) = 0.0.0.0 
DHCP: Relay IP Address (giaddr) = 0.0.0.0 
DHCP: Client Ethernet Address (chaddr) = 08002B2ED85E 
DHCP: Server Host Name (sname) = <Blank> 
DHCP: Boot File Name (file) = <Blank> 
DHCP: Magic Cookie = [OK] 
DHCP: Option Field (options) DHCP: DHCP Message Type = DHCP Discover 
DHCP: Client-identifier = (Type: 1) 08 00 2b 2e d8 5e 
DHCP: Host Name = JUMBO-WS 
DHCP: Parameter Request List = (Length: 7) 01 0f 03 2c 2e 2f 06 
DHCP: End of this option field

3.2、DHCPOFFER

DHCP服务器通过发送DHCPOFFER数据包进行响应。在下面的捕获摘录的IP部分中,源地址现在是DHCP服务器IP地址,目标地址是广播地址255.255.255.255。DHCP部分将数据包标识为提供。YIADDR字段填充服务器向客户端提供的IP地址。注意CHADDR字段仍然包含请求客户端的物理地址。此外,我们在DHCP选项字段部分看到服务器发送的各种选项以及IP地址。在这种情况下,服务器将发送子网掩码、默认网关(路由器)、租用时间、WINS服务器地址(NetBIOS名称服务)和NetBIOS节点类型。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3、DHCPREQUEST
客户机通过发送DHCPREQUEST来响应DHCPOFFER。在下面捕获的IP部分中,客户端的源地址仍然是0.0.0.0,数据包的目标地址仍然是255.255.255.255。客户端保留0.0.0.0,因为客户端尚未收到来自服务器的验证,表明可以开始使用提供的地址。目标仍然是广播的,因为可能有多个DHCP服务器已响应,并且可能保留了对客户端提供的服务的保留。这让其他DHCP服务器知道它们可以释放提供的地址并将其返回到可用池。DHCP部分将数据包标识为请求,并使用DHCP:Requested address字段验证提供的地址。DHCP:Server Identifier字段显示提供租约的DHCP服务器的IP地址。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4、DHCPACK
DHCP服务器用DHCPACK响应DHCPREQUEST,从而完成初始化周期。源地址是DHCP服务器IP地址,目标地址仍然是255.255.255.255。YIADDR字段包含客户端地址,CHADDR和DHCP:client标识符字段是请求客户端中网卡的物理地址。DHCP选项部分将数据包标识为ACK。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果客户机以前有DHCP分配的IP地址,并且重新启动,则客户机将在特殊的DHCPREQUEST数据包中特别请求以前租用的IP地址。源地址为0.0.0.0,目标地址为广播地址255.255.255.255。客户端将使用以前分配的地址填充DHCP选项字段DHCP:请求的地址。严格遵守RFC的客户端将使用请求的地址填充CIADDR字段。DHCP服务器将接受其中一个。

此时,服务器可能会响应,也可能不会响应。DHCP服务器的行为取决于所用操作系统的版本以及其他因素,如超级复制。如果服务器确定客户端仍然可以使用该地址,它将保持静默或确认DHCPREQUEST。如果服务器确定客户端不能拥有该地址,它将发送NACK。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后,客户端将开始发现过程,但DHCPDISCOVER数据包仍将尝试租用相同的地址。在许多情况下,客户端将获得相同的地址,但可能不会。
客户端从DHCP服务器获得的DHCP信息将具有与其关联的租用时间。租用时间定义客户端可以使用DHCP分配的信息的时间。当租约达到某些里程碑时,客户端将尝试续订其DHCP信息。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐