DHCP协议及报文详细解读

概述

DHCP(动态主机配置协议)是一个局域网的网络协议。由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。主要作用是集中管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率

DHCP功能

  • 保证任何IP地址在同一时刻只能由一台DHCP客户机所使用。
  • 可以给用户分配永久固定的IP地址。
  • 可以同用其他方法获得IP地址的主机共存(如手工配置IP地址的主机)。

DHCP分配IP地址三种机制

  1. 自动分配:DHCP服务器预先配置了一个IP地址池,客户端在连接到网络时向DHCP服务器发送请求,服务器从地址池中选择一个可用的IP地址分配给客户端。客户端无需进行任何手动配置,由服务器自动分配可用的IP地址。
  2. 动态分配:这是一种基于租约的分配机制。DHCP服务器为每个客户端分配一个IP地址,并给予一个租用时间。该IP地址可在租约期内使用,租约到期后会自动释放回地址池供其他客户端使用。客户端可以续租或释放IP地址,以便保持连接或重新获取新的IP地址。
  3. 手工/静态分配:通过在DHCP服务器上设置静态IP地址与MAC地址的绑定关系,将指定的IP地址分配给特定的设备。当该设备连接到网络时,DHCP服务器会根据其MAC地址识别并分配静态配置的IP地址。这种分配机制适用于需要固定IP地址的设备,如服务器、打印机等。

DHCP协议报文

DHCP封包在传输层(Transport Layer)是采用UDP协议,当 Client传送封包给Server时,采用的是 UDP 67端口 ,从 Server传送给 Client则是使用 UDP 68端口

DHCP封包格式

op(1)htype(1)hlen(1)hops(1)
xid(4)
secs(2)flags(2)
ciaddr(4)
yiaddr(4)
siaddr(4)
giaddr(4)
chaddr(16)
sname(64)
file(128)
options(variable)

每个字段含义如下:
op:报文的操作类型。分为请求报文和响应报文。客户端发送给服务器的包为请求报文,值为 1;服务器发送给客户端的包为响应报文,值为 2。
htype:DHCP 客户端的 MAC 地址类型。htype 值为 1 时表示为最常见的以太网 MAC 地址类型。
hlen:硬件地址长度。以太网 MAC 地址长度为 6 个字节,即 hlen 值为 6。
hops:跳数,DHCP 报文经过的中继数量。每经过一个路由器,该字段就会增加 1。如果没有经过路由器,则值为 0(同一网内)。
xid:事务 ID。客户端发起一次请求时选择的随机数,用来标识一次地址请求过程。在一次请求中所有报文的 xid 都是一样的。
secs:DHCP 客户端从获取到 IP 地址或者续约过程开始到现在所过去的时间,以秒为单位。在没有获得 IP 地址前,该字段始终为 0。
flags:BOOTP 标志位。只使用第 0 比特位,是广播应答标识位,用来标识 DHCP 服务器应答报文是采用单播还是广播发送。其中,0 表示采用单播发送方式,1 表示采用广播发送方式。其余位尚未使用。
ciaddr:DHCP 客户端的 IP 地址。仅在 DHCP 服务器发送的 ACK 报文中显示,在其他报文中均显示为 0。这是因为在得到 DHCP 服务器确认前,DHCP 客户端还没有分配到 IP 地址。
yiaddr:DHCP 服务器分配给客户端的 IP 地址。仅在 DHCP 服务器发送的 Offer 和 ACK 报文中显示,其他报文中显示为 0。
siaddr:为 DHCP 客户端分配 IP 地址等信息的其他 DHCP 服务器 IP 地址。仅在 DHCP Offer、DHCP ACK 报文中显示,其他报文中显示为 0。
giaddr:转发代理(网关)IP 地址,DHCP 客户端发出请求报文后经过的第一个 DHCP 中继的 IP 地址。如果没有经过 DHCP 中继,则显示为 0。
chaddr:DHCP 客户端的 MAC 地址。在每个报文中都会显示对应 DHCP 客户端的 MAC 地址。
sname:为客户端分配 IP 地址的服务器名称(DNS 域名格式)。只在 DHCP Offer 和 DHCP ACK 报文中显示发送报文的 DHCP 服务器名称,其他报文显示为 0。
file:DHCP 服务器为 DHCP 客户端指定的启动配置文件名称及路径信息。仅在 DHCP Offer 报文中显示,其他报文中显示为空。
options:可选选项,格式为“代码+长度+数据”。

DHCP报文交互过程

Client发送请求到Server的67号端口,Server应答消息给Client的68号端口。

DHCP Client DHCP Server DISCOVER(广播) OFFER(单播) REQUEST(广播) ACK(单播) REQUEST(renew) 单播;DHCP续租(达到约定租期的50%) ACK(renew) RELEASE DHCP Client DHCP Server

主要过程解析

  1. DHCP Client以广播的方式发出DHCP Discover报文。
  2. 所有的DHCP Server都能够接收到DHCP Client发送的DHCP Discover报文,所有的DHCP Server都会给出响应,向DHCP Client发送一个DHCP Offer报文。 DHCP Offer报文中“Your(Client) IP Address”字段就是DHCP Server能够提供给DHCP Client使用的IP地址,且DHCP Server会将自己的IP地址放在“option”字段中以便DHCP Client区分不同的DHCP Server。DHCP Server在发出此报文后会存在一个已分配IP地址的纪录。
  3. DHCP Client只能处理其中的一个DHCP Offer报文(假如存在多个DHCP Server情况下),一般的原则是DHCP Client处理最先收到的DHCP Offer报文。
  4. DHCP Client会发出一个广播的DHCP Request报文,在选项字段中会加入选中的DHCP Server的IP地址和需要的IP地址。
  5. DHCP Server收到DHCP Request报文后,判断选项字段中的IP地址是否与自己的地址相同。如果不相同,DHCP Server不做任何处理只清除相应IP地址分配记录;如果相同,DHCP Server就会向DHCP Client响应一个DHCP ACK报文,并在选项字段中增加IP地址的使用租期信息。

租期续约

在使用租期超过50%时刻处,DHCP Client会以单播形式向DHCP Server发送DHCP Request报文来续租IP地址。如果DHCP Client成功收到DHCP Server发送的DHCP ACK报文,则按相应时间延长IP地址租期如果没有收到DHCP Server发送的DHCP ACK报文,则DHCP Client继续使用这个IP地址。
在使用租期超过87.5%时刻处,DHCP Client会以广播形式向DHCP Server发送DHCP Request报文来续租IP地址。

  • 如果DHCP Client成功收到DHCP Server发送的DHCP ACK报文,则按相应时间延长IP地址租期;
  • 如果没有收到DHCP Server发送的DHCP ACK报文,则DHCP Client继续使用这个IP地址,直到IP地址使用租期到期时,DHCP Client才会向DHCP Server发送DHCP Release报文来释放这个IP地址,并开始新的IP地址申请过程。

需要说明的是:

  • DHCP服务器 DHCPOFFER 中指定的地址不一定为最终分配的地址,通常情况下,DHCP服务器会保留该地址直到客户端发出正式请求。
  • 如果发送给DHCP客户端的地址已经被其他DHCP客户端使用,客户端会向服务器发送DHCPDECLINE 拒绝接受已经分配的地址信息。
  • 在协商过程中,如果DHCP客户端发送的REQUEST消息中的地址信息不正确,如客户端已经迁移到新的子网或者租约已经过期,DHCP服务器会发送 DHCPNAK 消息给DHCP客户端,让客户端重新发起地址请求过程。
  • DHCP Client接收到DHCP ACK报文后,检查DHCP Server分配的IP地址是否能够使用。如果可以使用,则DHCP Client成功获得IP地址并根据IP地址使用租期自动启动续延过程;如果DHCP Client发现分配的IP地址已经被使用,则DHCP Client向DHCP Server发出 DHCPDECLINE 报文,通知DHCP Server禁用这个IP地址,然后DHCP Client开始新的地址申请过程。
  • DHCP Client在成功获取IP地址后,随时可以通过发送 DHCPRELEASE 报文释放自己的IP地址,DHCP Server收到DHCP Release报文后,会回收相应的IP地址并重新分配。

DHCP主要报文类型

1. DHCP DISCOVER 发现阶段

DHCP 客户端在DHCP 启动或者需要获取DHCP地址的时候,会向服务器发送DHCP Discover 数据包。在下图中,由于当前客户端还没有 IP 地址,所以源 IP 地址为 0.0.0.0;由于客户端是向网络中所有服务器进行发送,使用的是广播包,所以目标 IP 地址为 255.255.255.255。下图可以看到客户端的 IP 地址为 0.0.0.0,MAC 地址为 00:0c:29:db:3f:0a,主机名为 WIN-RKPKQFBLG6C,事务 ID 为 0x597c6b82 等信息。

在这里插入图片描述
在 Bootstrap Protocol(Discover) 部分中显示了该数据包报文的每个字段。为了方便讲解,下面将报文字段列出并标注如下:

Bootstrap Protocol (Discover)
Message type: Boot Request (1) #报文的操作类型, 这是一个请求包, 所以该选项的值为1
Hardware type: Ethernet (0x01) #硬件类型为Ethernet
Hardware address length: 6 #硬件地址长度为6
Hops: 0 #经过DHCP中继数为0
Transaction ID: 0x597c6b82 #事务ID
Seconds elapsed: 0 #客户端启动时间
Bootp flags: 0x0000 (Unicast) #BOOTP标识字段
Client IP address: 0.0.0.0 #客户端IP地址
Your (client) IP address: 0.0.0.0 #服务器分配给自己的IP地址
Next server IP address: 0.0.0.0 #下一个服务器的IP地址
Relay agent IP address: 0.0.0.0 #DHCP中继器的IP地址
Client MAC address: Vmware_db:3f:0a (00:0c:29:db:3f:0a) #客户端的MAC地址
Client hardware address padding: 00000000000000000000 #客户端硬件地址填充
Server host name not given #服务器主机名
Boot file name not given #启动文件名
Magic cookie: DHCP #与BOOTP兼容
Option: (53) DHCP Message Type (Discover) #DHCP消息类型为53
Length: 1
DHCP: Discover (1) #发现包
Option: (61) Client identifier #客户端标识符
Length: 7
Hardware type: Ethernet (0x01) #硬件类型为Ethernet
Client MAC address: Vmware_db:3f:0a (00:0c:29:db:3f:0a) #客户端MAC地址
Option: (50) Requested IP Address #请求IP地址
Length: 4
Requested IP Address: 192.168.0.108 #请求的IP地址
Option: (12) Host Name #客户端主机名
Length: 15
Host Name: WIN-RKPKQFBLG6C #主机名
Option: (60) Vendor class identifier #供应商类标识符
Length: 8
Vendor class identifier: MSFT 5.0 #供应商标识符为MSFT 5.0
Option: (55) Parameter Request List #参数请求列表
Length: 12
Parameter Request List Item: (1) Subnet Mask #子网掩码
Parameter Request List Item: (15) Domain Name #域名
Parameter Request List Item: (3) Router #路由
Parameter Request List Item: (6) Domain Name Server #域名服务
Parameter Request List Item: (44) NetBIOS over TCP/IP Name Server #NetBIOS名称服务
Parameter Request List Item: (46) NetBIOS over TCP/IP Node Type #NetBIOS节点类型
Parameter Request List Item: (47) NetBIOS over TCP/IP Scope #NetBIOS作用范围
Parameter Request List Item: (31) Perform Router Discover #完成路由发现
Parameter Request List Item: (33) Static Route #静态路由
Parameter Request List Item: (121) Classless Static Route #无类静态路由
Parameter Request List Item: (249) Private/Classless Static Route
(Microsoft) #私有静态路由
Parameter Request List Item: (43) Vendor-Specific Information #供应商特定信息
Option: (255) End
Option End: 255
Padding: 000000000000000000000000

2. DHCP OFFER 提供阶段

DHCP 服务端在接受到来自客户端的请求后,会将自己DHCP 池中尚未分配出去的地址选一个合适的ip 提供给客户端。下图中标注了几个重要字段的信息。包含 DHCP 服务器提供给客户端的 IP 地址信息,这里为 192.168.0.108;事务 ID 为 0x597c6b82,与 DHCP Discover 报文中的事务 ID 相同,因此属于同一请求地址过程。 另外,可以看到服务器标识地址为 192.168.0.1,所以捕获的数据包的源 IP 地址为 192.168.0.1。目标地址为提供的 IP 地址 192.168.0.108。
在这里插入图片描述

Bootstrap Protocol (Offer)
Message type: Boot Reply (2) # 报文的操作类型, 这是一个响应包, 值为2
Hardware type: Ethernet (0x01)
Hardware address length: 6
Hops: 0
Transaction ID: 0x597c6b82 # 事务ID
Seconds elapsed: 0
Bootp flags: 0x0000 (Unicast)
Client IP address: 0.0.0.0
Your (client) IP address: 192.168.0.108 # 服务器要分配给客户端的IP地址
Next server IP address: 0.0.0.0
Relay agent IP address: 0.0.0.0
Client MAC address: Vmware_db:3f:0a (00:0c:29:db:3f:0a)
Client hardware address padding: 00000000000000000000
Server host name not given
Boot file name not given
Magic cookie: DHCP
Option: (53) DHCP Message Type (Offer)
Length: 1
DHCP: Offer (2)
Option: (54) DHCP Server Identifier
Length: 4
DHCP Server Identifier: 192.168.0.1 # DNS服务器标识地址为192.168.0.1
Option: (51) IP Address Lease Time
Length: 4
IP Address Lease Time: (7200s) 2 hours
Option: (1) Subnet Mask #服务器分配给客户端的子网掩码
Length: 4
Subnet Mask: 255.255.255.0 #子网掩码为255.255.255.0
Option: (3) Router
Length: 4
Router: 192.168.0.1
Option: (6) Domain Name Server
Length: 4
Domain Name Server: 192.168.0.1
Option: (255) End
Option End: 255
Padding: 000000000000000000000000000000000000000000000000…

3. DHCP REQUEST 选择阶段

DHCP 的客户端在接收到第一个到达的offer 后会广播request 告诉其他的DHCP server 端,我已经选好ip 了,附上ip 信息,然后告知其他的DHCP server 端不需要他们提供dhcp 服务了。由于此时客户端还没有真正拥有IP地址,因此源 IP 地址仍然为 0.0.0.0,该数据包是用来通知所有服务器的,以广播形式发出,因此目标 IP 地址为 255.255.255.255。其中,事务 ID 与 DHCP Discover、DHCP Offer 阶段的事务 ID 相同,从输出信息还可以看到客户端请求的 IP 地址为 192.168.0.108,表示要向该 DHCP 服务器租用地址。
在这里插入图片描述

Bootstrap Protocol (Request)
Message type: Boot Request (1) #报文的操作类型, 这是一个请求包, 所以该选项的值为1
Hardware type: Ethernet (0x01)
Hardware address length: 6
Hops: 0
Transaction ID: 0x597c6b82 #事务ID
Seconds elapsed: 0
Bootp flags: 0x0000 (Unicast)
Client IP address: 0.0.0.0 # 客户端IP地址,此时还真正没有获得IP
Your (client) IP address: 0.0.0.0
Next server IP address: 0.0.0.0
Relay agent IP address: 0.0.0.0
Client MAC address: Vmware_db:3f:0a (00:0c:29:db:3f:0a)
Client hardware address padding: 00000000000000000000
Server host name not given
Boot file name not given
Magic cookie: DHCP
Option: (53) DHCP Message Type (Request)
Length: 1
DHCP: Request (3)
Option: (61) Client identifier
Length: 7
Hardware type: Ethernet (0x01)
Client MAC address: Vmware_db:3f:0a (00:0c:29:db:3f:0a)
Option: (50) Requested IP Address
Length: 4
Requested IP Address: 192.168.0.108 # 客户端选择租用的IP地址为192.168.0.108

4. DHCP ACK 确认阶段

DHCP 的服务端在接受到来此客户端的Request 报文后,会根据客户端提供的Request 报文信息查询有没有相应的租约记录,如果有,会向客户端发送请求报文的ip 信息等及确认的ACK报文。
在这里插入图片描述

Bootstrap Protocol (ACK)
Message type: Boot Reply (2) #报文的操作类型, 这是一个响应包, 所以该选项的值为2
Hardware type: Ethernet (0x01)
Hardware address length: 6
Hops: 0
Transaction ID: 0x597c6b82 #事务ID
Seconds elapsed: 0
Bootp flags: 0x0000 (Unicast)
Client IP address: 0.0.0.0
Your (client) IP address: 192.168.0.108 #客户端可以使用的IP地址为192.168.0.108
Next server IP address: 0.0.0.0
Relay agent IP address: 0.0.0.0
Client MAC address: Vmware_db:3f:0a (00:0c:29:db:3f:0a)
Client hardware address padding: 00000000000000000000
Server host name not given
Boot file name not given
Magic cookie: DHCP
Option: (53) DHCP Message Type (ACK)
Length: 1
DHCP: ACK (5)
Option: (54) DHCP Server Identifier
Length: 4
DHCP Server Identifier: 192.168.0.1
Option: (51) IP Address Lease Time
Length: 4
IP Address Lease Time: (7200s) 2 hours
Option: (1) Subnet Mask #客户端可以使用的子网掩码
Length: 4
Subnet Mask: 255.255.255.0 #子网掩码为255.255.255.0
Option: (3) Router
Length: 4
Router: 192.168.0.1
Option: (6) Domain Name Server
Length: 4
Domain Name Server: 192.168.0.1
Option: (255) End
Option End: 255
Padding: 000000000000000000000000000000000000000000000000…

报文类型补充

  • DHCP NAK:
    服务器对客户端的 DHCP REQUEST 报文的拒绝响应报文,比如服务器对客户端分配的 IP 地址已超过使用租借期限(服务器没有找到相应的租约记录)或者由于某些原因无法正常分配 IP 地址,则发送 DHCP NAK 报文作为应答(客户端移到了另一个新的网络)。通知 DHCP 客户端无法分配合适 IP 地址。DHCP 客户端需要重新发送DHCP DISCOVERY 报文来申请新的 IP 地址。

  • DHCP DECLINE:
    当客户端发现服务器分配给它的 IP 地址发生冲突时会通过发送此报文来通知服务器,并且会重新向服务器申请地址。

  • DHCP RELEASE:
    客户端可通过发送此报文主动释放服务器分配给它的 IP 地址,当服务器收到此报文后,可将这个 IP 地址分配给其它的客户端。

  • DHCP INFORM:
    客户端已经获得了 IP 地址,发送此报文的目的是为了从服务器获得其他的一些网络配置信息,比如网关地址、DNS 服务器地址等。

  • 10
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值