DHCP 原理
一、概述:
A、何为DHCP:
DHCP,动态主机配置协议,前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,常用的2个端口:67(DHCP server)、68(DHCP client)。
DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使 client 动态的获得 IP 地址、Gateway 地址、DNS 服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP 就是一个不需要账号密码登录的、自动给内网机器分配IP地址等信息的协议。
DHCP 涉及客户端和服务端。在使用 DHCP 之前,必须要架设一台 DHCP 服务器(很多时候使用该网段的路由器充当 DHCP 服务器)。
DHCP 客户端一般来说是局域网中独立的 PC 主机。DHCP 客户端发出的 DHCP DISCOVER 包是 DHCP 协议的开始。延续租期、发现、释放 IP 地址等大多数 DHCP 中的行为都是由 DHCP 客户端主动发起。
DHCP 服务器端,在路由器上体现的就是给 LAN 端动态分配 IP 的功能。DHCP SERVER 负责接收客户端的 DHCP 请求,管理 LAN 端所有的网络IP信息,DHCP 通过“租约”来实现动态分配 IP 的功能,实现 IP 的时分复用,从而解决 IP 资源短缺的问题。
B、分配机制:
DHCP有三种机制分配IP地址:
自动分配方式(Automatic Allocation),DHCP服务器为主机指定一个永久性的 IP 地址,一旦 DHCP 客户端第一次成功从 DHCP 服务器端租用到 IP 地址后,就可以永久性的使用该地址。
动态分配方式(Dynamic Allocation),DHCP 服务器给主机指定一个具有时间限制的 IP 地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。
手工分配方式(Manual Allocation),客户端的 IP 地址是由网络管理员指定的,DHCP 服务器只是将指定的 IP 地址告诉客户端主机。
三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址
C、报文和封装:
1、报文类型:
DHCP DISCOVER :客户端开始 DHCP 过程发送的包,是 DHCP 协议的开始
DHCP OFFER :服务器接收到 DHCP DISCOVER 之后做出的响应,它包括了给予客户端的 IP、客户端的 MAC 地址、租约过期时间、服务器的识别符以及其他信息
DHCP REQUEST :客户端对于服务器发出的 DHCP OFFER 所做出的响应。在续约租期的时候同样会使用。
DHCP ACK :服务器在接收到客户端发来的 DHCP REQUEST 之后发出的成功确认的报文。在建立连接的时候,客户端在接收到这个报文之后才会确认分配给它的 IP 和其他信息可以被允许使用。
DHCP NAK :DHCP ACK 的相反的报文,表示服务器拒绝了客户端的请求。如果客户端请求的 IP 地址已经被其他设备使用,或者不适用于客户端所在的网络,DHCP 服务器会发送一个 DHCP NAK 报文。这个报文通知客户端申请的 IP地址不可用,客户端需要重新发起 DHCP DISCOVER 报文请求一个新的 IP 地址。
DHCP RELEASE :一般出现在客户端关机、下线等状况。这个报文将会使 DHCP 服务器释放发出此报文的客户端的 IP 地址
DHCP INFORM :客户端发出的向服务器请求一些信息的报文
DHCP DECLINE :当客户端发现服务器分配的 IP 地址无法使用(如 IP 地址冲突时),将发出此报文,通知服务器禁止使用该 IP 地址。
2、报文格式:
OP:若是 client 送给 server 的封包,设为1,反向为2;
Htype:硬件类别,ethernet 为1;
Hlen:硬件长度,ethernet 为6;
Hops:若数据包需经过 router 传送,每站加1,若在同一网内,为0;
Transaction ID:事务 ID,是个随机数,用于客户和服务器之间匹配请求和相应消息;
Seconds:由用户指定的时间,指开始地址获取和更新进行后的时间;
Flags:从0-15bits,最左一 bit 为1时表示 server 将以广播方式传送封包给 client,其余尚未使用;
Ciaddr:用户IP地址;
Yiaddr:服务器分配给客户的 IP 地址;
Siaddr:用于 bootstrap 过程中的IP地址;(服务器的IP地址)
Giaddr:转发代理(网关)IP地址;
Chaddr:client 的硬件地址;
Sname:可选 server 的名称,以 0x00 结尾;
File:启动文件名;
Options:厂商标识,可选的参数字段。包含了部分租约信息、报文类型等。最多可以包括255个option,最少为1个option

D、请求过程:
在DHCP(动态主机配置协议)中,当DHCP客户端发送 DHCP Discover 报文时,它可以设置一个广播标志(Broadcast Flag),以指示它希望收到的 DHCP 回复是广播还是单播。
广播标志位置1:表示客户端希望接收到的 DHCP 回复报文(如 DHCP Offer 和 DHCP ACK)是广播报文。这通常用于客户端还没有配置 IP 地址,无法接收单播报文的情况。
广播标志位置0:表示客户端希望接收到的 DHCP 回复报文是单播报文。这通常用于客户端已经能够接收单播流量的情况。

1、DHCP Discover 理论分析:
DHCP Discover(广播)是第一个阶段即 DHCP 客户端寻找 DHCP 服务端的阶段。由于 DHCP 服务端的 IP 地址等信息对于 DHCP 客户端来说是未知,此时就需要使用广播的方式进行发送消息,基于 UDP 的源端口号68,目的端口号67来发送DHCP Discover 发现信息来寻找 DHCP 服务器。由于是广播包,在同一个广播域中的每一台安装了 TCP/IP 协议的主机都会接收到这种广播信息,但只有 DHCP 服务器才会做出响应。在二层中,广播地址是12个f,即ff:ff:ff:ff:ff:ff。
在三层中,广播地址是4个255(IPv4)即255.255.255.255
2、DHCP Offer 理论分析:
提供阶段,即 DHCP 服务器向 DHCP 客户端提供预分配 IP 地址的阶段。网络中的所有 DHCP 服务器接收到客户端的 DHCP Discover 报文后都会根据自己的 DHCP 地址池中 IP 地址分配的优先次序选出一个 IP 地址,然后与其他参数一起通过传输层的 UDP 67号端口在 DHCP Offer 报文中以单播/广播方式发送给客户端的 UDP 68号端口。
DHCP 服务器在分配这个地址之间会 ping 一下这个分配的 ip 地址,如果没有 Response 就才会预分配这个地址。
客户端通过封装在帧中的目的MAC地址(也就是 DHCP Discover 报文中的 CHADDR 字段值)的比对来确定是否接收该帧。但这样以来,理论上 DHCP 客户端可能会收到多个 DHCP Offer 报文(当网络中存在多个 DHCP 服务器时),但 DHCP 客户端只接收第一个到来的 DHCP Offer 报文。
3、DHCP Request 理论分析:
选择阶段,即 DHCP 客户端选择IP地址的阶段。如果有多台 DHCP 服务器向该客户端发来 DHCP OFFER 报文,客户端只接收第一个收到的 DHCP Offer 报文,然后以广播方式发送 DHCP Request 报文。在该报文的 Requested Address 选项中包含 DHCP 服务器在 DHCP Offer 报文中预分配的 IP 地址、对应的 DHCP 服务器 IP 地址等。
这样也就相当于同时告诉其他 DHCP 服务器,它们可以释放已提供的地址并将这些地址返回到可用的地址池中。
在 DHCP REQUEST 报文封装的 IP 协议头部中,客户端的 Source Address 仍然是0.0.0.0,数据包的 Destination 仍然是255.255.255.255。但在 DHCP Reques t报文中 Ciaddr、Yiaddr、Siaddr、Giaddr 字段的地址均为0.0.0.0
4、DHCP Ack 理论分析:
确认阶段,即 DHCP 服务器确认分配级 DHCP 客户端 IP 地址的阶段。
某个 DHCP 服务器在收到 DHCP 客户端发来的 DHCP REOUEST 报文后,只有 DHCP 客户端选择的服务器会进行如下操作:如果确认将地址分配给该客户端,则以单播/广播方式返回 DHCP ACK 报文;否则返回 DHCP NAK 报文,表明地址不能分配给该客户端。
E、租约更新:
1、更新原理:
如果采用动态IP地址分配策略,则 DHCP 服务器分配给客户端的 IP 地址都是有一定租约期限的,当租约期满后 DHCP 服务器又会收回原来分配的这个 IP 地址。
如果 DHCP 客户端希望继续使用该地址,则需要向 DHCP 服务器提出更新IP地址租约的申请,也就是前面所说到的“续约”。使用 DHCP REQUEST 续约
IP 地址租约更新或者 IP 地址续约也就是更新服务器端对 IP 地址的租约信息,使其恢复为初始状态。
2、申请续约的方法:
在 DHCP 客户端的 IP 地址租约期限达到1/2时,由 DHCP 客户端向为它分配 IP 地址的 DHCP 服务器以单播方式发送 DHCP REOUEST 请求报文,以期进行 IP 租约的更新。
如果 DHCP 服务器同意续约,则 DHCP 服务器向客户端以单播方式返回 DHCP ACK 报文,通知 DHCP 客户端已经获得新 IP 租约,可以继续使用此 IP 地址;相反,如果 DHCP 服务器不同意续约,则 DHCP 服务器以单播方式返回 DHCP NAK报文,通知 DHCP 客户端不能获得新的租约,此 IP 地址不可以再分配给该客户端。
如果上面的续约申请失败,则 DHCP 客户端还会在租约期限达到7/8时再次以广播方式发送 DHCP REQUEST 请求报文进行续约。DHCP 服务器的处理方式同上,不再赘述。
如果第二次续约请求还是失败,则原来租约的 IP 地址将被释放。
二、DHCP中继代理服务
在前面我们已经说过,在 DHCP 客户端初次从 DHCP 服务器获取 IP 地址的过程中,所有从 DHCP 客户端发出的请求报文均是以广播方式(目的地址为255.255.255.255)进行发送的,所以 DHCP 服务只适用于 DHCP 客户端和 DHCP 服务器处于同一个子网(也就是 DHCP 服务器至少有一个端口与 DHCP 客户端所在的子网是直接连接的)的情况,因为广播包是不能穿越子网的。
基于 DHCP 服务的以上限制,这样一来,如果 DHCP 客户端与 DHCP 服务器之间隔了路由器设备,不在同一子网,就不能直接通过这台 DHCP 服务器获取 IP 地址,即使 DHCP 服务器上已配置了对应的地址池。这也就意味着,如果想要让多个子网中的主机进行动态 IP 地址分配,就需要在网络中的所有子网中都设置一个 DHCP 服务器。这显然是很不经济的,也是没有必要的。
DHCP 中继功能可以很好地解决 DHCP 服务的以上难题。通过 DHCP 中继代理服务,与 DHCP 服务器不在同一子网的 DHCP 客户端可以通过 DHCP 中继代理(通常也是由路由器或三层交换机设备担当,但需要开启 DHCP 中继功能)与位于其他网段的 DHCP 服务器通信,最终使 DHCP 客户端获取到从 DHCP 服务器上分配而来的 IP 地址。此时的 DHCP 中继代理就位于 DHCP 客户端和 DHCP 服务器之间,负责广播 DHCP 报文的转发。

DHCP 无法获取 IP 地址的常见原因汇总表”
相关参考博文