DHCP(动态主机配置协议)是一个局域网的网络协议。由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。主要作用是集中地管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。
自动分配方式:DHCP服务器为主机指定一个永久性的IP地址,一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地址。
动态分配方式:DHCP服务器给主机指定一个具有时间限制的IP地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。
手工分配方式:客户端的IP地址是由网络管理员指定的,DHCP服务器只是将指定的IP地址告诉客户端主机。
三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。
DHCP封包在传输层(Transport Layer)是采用UDP协议,当 Client传送封包给Server时,采用的是 UDP 67端口 ,从 Server传送给 Client则是使用 UDP 68端口。
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:可选选项,格式为“代码+长度+数据”。
Client发送请求到Server的67号端口,Server应答消息给Client的68号端口。
主要过程解析
在使用租期超过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 客户端在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
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…
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
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 服务器地址等。