一、DHCP 概述
DHCP 是一种运行在客户端和服务器之间的协议, DHCP 客户端向 DHCP 服务器动态地请求网络配置信息, DHCP 服务器根据策略返回相应的配置信息(IP 地址、子网掩码、缺省网关等网络参数)。
DHCP 基本架构
DHCP 基本构架示意图
DHCP 基本协议架构中,主要包括以下三种角色:
- DHCP Client:
DHCP 客户端,通过与 DHCP 服务器进行报文交互,获取 IP 地址和其他网络配置信息,完成自身的地址配置。在设备接口上配置DHCP Client功能,这样接口可以作为DHCP Client,使用 DHCP 协议从 DHCP Server 动态获得 IP 地址等参数,方便用户配置,也便于集中管理。
- DHCP Relay:
DHCP 中继,负责转发来自客户端方向或服务器方向的 DHCP 报文,协助 DHCP 客户端和DHCP 服务器完成地址配置功能。如果 DHCP 服务器和 DHCP 客户端不在同一个网段范围内,则需要通过 DHCP 中继来转发报文,这样可以避免在每个网段范围内都部署 DHCP 服务器,既节省了成本,又便于进行集中管理。
在 DHCP 基本协议架构中, DHCP 中继不是必须的角色。只有当 DHCP 客户端和 DHCP 服务器不在同一网段内,才需要 DHCP 中继进行报文的转发。
- DHCP Server:
DHCP 服务器,负责处理来自客户端或中继的地址分配、地址续租、地址释放等请求,为客户端分配 IP 地址和其他网络配置信息。
二、DHCP 报文介绍
DHCP 的报文格式
图中括号里的数字表示字段的长度,单位是字节。
DHCP 报文类型
目前 DHCP 定义了如下八种类型报文, DHCP 服务器和客户端之间通过这八种类型的报文进行通信。
三、DHCP Options 字段选项
DHCP 报文中的 Options 字段
DHCP 报文中的 Options 字段可以用来存放普通协议中没有定义的控制信息和参数。如果用户在DHCP 服务器端配置了 Options 字段, DHCP 客户端在申请 IP 地址的时候,会通过服务器端回应的 DHCP 报文获得 Options 字段中的配置信息。Options 字段的格式如图所示。
Options 字段的格式
Options 字段由 Type、 Length 和 Value 三部分组成。这三部分的表示含义如下所示:
DHCP Options 选项的取值范围为 1~255,如表所示,介绍 DHCP Options 的部分知名选项。
根据 Options 选项功能的不同,此字段的作用对象也不同。比如 Option77 用于 DHCP 客户端,用于识别用户所属的类型,根据 Options 字段中所携带的用户类型(User Class), DHCP 服务器选择适当的地址池为客户端分配 IP 地址以及相关配置参数。Option77 一般在客户端由用户进行配置,而不必在服务器端配置。
说明:
设备作为 DHCP 客户端支持 DHCP 服务器通过 Option121 下发的静态路由。
自定义 DHCP 选项
除了 RFC2132 中规定的字段选项外,还有部分选项内容没有统一规定,例如 Option43 和 Option82。
下面将介绍设备上定义的几种选项格式。
厂商特定信息选项(Option43)
Option43 称为厂商特定信息选项。Option43 的报文格式如图所示。
DHCP 服务器和 DHCP 客户端通过 Option43 交换厂商特定的信息。当 DHCP 服务器接收到请求 Option43 信息的 DHCP 请求报文(Option55 中带有 43 参数)后,将在回复报文中携带 Option43,为 DHCP 客户端分配厂商指定的信息。
为了提供可扩展性,通过 Option43 为客户端分配更多的信息, Option43 采用子选项的形式,通过不同的子选项为用户分配不同的网络配置参数,如图所示。子选项中各字段的含义为:
Sub-option type:子选项类型。目前,子选项类型值可以为 0x01 表示 ACS 参数子选项, 0x02 表示服务提供商标识子选项, 0x80 表示 PXE 引导服务器地址子选项。
Sub-option length:子选项的长度。
Sub-option value:子选项的取值。
设备作为 DHCP 客户端时,可以通过 Option43 获取以下信息:
自动配置服务器 ACS(Auto-Configuration Server)的参数,包括 URL 地址、用户名和密码。
服务提供商标识 CPE(Customer Premises Equipment)从 DHCP 服务器获取该信息后,将该信息通告给 ACS,以便 ACS 选择服务提供商特有的配置和参数等。
预启动执行环境 PXE(Preboot eXecution Environment)引导服务器地址,以便客户端从 PXE 引导服务器获取启动文件或其他控制信息。
中继代理信息选项(Option82)
Option82 称为中继代理信息选项,该选项记录了 DHCP 客户端的位置信息。DHCP 中继或DHCP Snooping 设备接收到 DHCP 客户端发送给 DHCP 服务器的请求报文后,在该报文中添加 Option82,并转发给 DHCP 服务器。
管理员可以从 Option82 中获得 DHCP 客户端的位置信息,以便定位 DHCP 客户端,实现对客户端的安全和计费等控制。支持 Option82 的服务器还可以根据该选项的信息制定 IP 地址和其他参数的分配策略,提供更加灵活的地址分配方案。
Option82 最多可以包含 255 个子选项。若定义了 Option82,则至少要定义一个子选项。目前设备只支持两个子选项:sub-option1(Circuit ID,电路 ID 子选项)和 sub-option2(Remote ID,远程 ID 子选项)。
由于 Option82 的内容没有统一规定,不同厂商通常根据需要进行填充。
目前设备提供了三种系统预定义的 Option82 格式,分别是 Default、 Common、 Extend,还支持自定义格式 User-defined。
Default 格式是默认格式,这个是 Option82 的默认处理方式。
Common 格式是满足特定市场而对 Option82 做的配置,而且是全字符串的方式。
Extend 格式主要是兼容其他厂商路由器的 Option82 的格式,同时满足二进制的 Option82表示方式。
User-defined:其它未特定描述的格式可以使用自定义的方式来处理。
四、DHCP 工作原理
1、DHCP 客户端与服务器的交互模式
DHCP 客户端为了获取合法的动态 IP 地址,在不同阶段与服务器之间交互不同的信息,通常存在以下三种模式:
DHCP 客户端动态获取 IP 地址
DHCP 客户端动态获取 IP 地址的四步交互过程
如图所示, DHCP 客户端首次登录网络时,主要通过四个阶段与 DHCP 服务器建立联系。
发现阶段,即 DHCP 客户端寻找 DHCP 服务器的阶段。
在发现阶段, DHCP 客户端通过发送 DHCP DISCOVER 报文来寻找 DHCP 服务器。由于 DHCP 服务器的 IP 地址对于客户端来说是未知的,所以 DHCP 客户端以广播方式发送 DHCP DISCOVER 报文。所有收到 DHCP DISCOVER 报文的 DHCP 服务器都会发送回应报文, DHCP 客户端据此可以知道网络中存在的 DHCP 服务器的位置。
提供阶段,即 DHCP 服务器提供 IP 地址的阶段。
网络中接收到 DHCP DISCOVER 报文的 DHCP 服务器,会从地址池选择一个合适的IP 地址,连同 IP 地址租约期限和其他配置信息(如网关地址、域名服务器地址等)通过 DHCP OFFER 报文发送给 DHCP 客户端。
选择阶段,即 DHCP 客户端选择 IP 地址的阶段。
如果有多台 DHCP 服务器向 DHCP 客户端回应 DHCP OFFER 报文,则 DHCP 客户端只接受第一个收到的 DHCP OFFER 报文。然后以广播方式发送 DHCP REQUEST 请求报文,该报文中包含 Option54(服务器标识选项),即它选择的 DHCP 服务器的IP 地址信息。
以广播方式发送 DHCP REQUEST 请求报文,是为了通知所有的 DHCP 服务器,它将选择 Option54 中标识的 DHCP 服务器提供的 IP 地址,其他 DHCP 服务器可以重新使用曾提供的 IP 地址。
确认阶段,即 DHCP 服务器确认所提供 IP 地址的阶段。
当 DHCP 服务器收到 DHCP 客户端回答的 DHCP REQUEST 报文后, DHCP 服务器会根据 DHCPREQUEST 报文中携带的 MAC 地址来查找有没有相应的租约记录。如果有,则向客户端发送包含它所提供的 IP 地址和其它设置的 DHCP ACK 确认报文。
DHCP 客户端收到该确认报文后,会以广播的方式发送免费 ARP 报文,探测是否有主机使用服务器分配的 IP 地址,如果在规定的时间内没有收到回应,客户端才使用此地址。
如果 DHCP 服务器收到 DHCP REQUEST 报文后,没有找到相应的租约记录,或者由于某些原因无法正常分配 IP 地址,则发送 DHCP NAK 报文作为应答,通知 DHCP客户端无法分配合适 IP 地址。DHCP 客户端需要重新发送 DHCP DISCOVER 报文来申请新的 IP 地址。
DHCP Client 获得 IP 地址后,上线之前会检测正在使用的网关的状态,如果网关地址错误或网关设备故障, DHCP 客户端将重新使用四步交互方式请求新的 IP 地址。
2、DHCP 客户端重用曾经分配的 IP 地址
DHCP 客户端重用曾经分配的 IP 地址的两步交互过程
如图所示, DHCP 客户端重新登录网络时,主要通过以下几个步骤与 DHCP 服务器建立联系:
重新登录网络是指客户端曾经分配到可用的 IP 地址,再次登录网络时 IP 地址还在相应的租期之内。客户端不需要再发送 DHCP DISCOVER 报文,而是直接发送包含前 一次分配的 IP 地址的 DHCP REQUEST 请求报文,即报文中的 Option50(请求的 IP地址选项)字段填入曾经使用过的 IP 地址。
DHCP 服务器收到 DHCP REQUEST 报文后,如果客户端申请的地址没有被分配,则返回 DHCP ACK 确认报文,通知该 DHCP 客户端继续使用原来的 IP 地址。
如果此 IP 地址无法再分配给该 DHCP 客户端使用(例如已分配给其它客户端), DHCP服务器将返回 DHCP NAK 报文。客户端收到后,重新发送 DHCP DISCOVER 报文请求新的 IP 地址。
3、DHCP 客户端更新租约
DHCP 客户端向服务器申请地址是可以携带期望租期,服务器在分配租约时把客户端期望租约和地址池中租期配置比较,分配其中一个较短的租期给客户端。
DHCP 服务器分配给客户端的动态 IP 地址通常有一定的租借期限,期满后服务器会收回该IP 地址。如果 DHCP 客户端希望继续使用该地址,需要更新 IP 地址的租约(如延长 IP 地址租约)。
当 DHCP 客户端获得 IP 地址时,会进入到绑定状态,客户端会设置 3 个定时器,分别用来控制租期更新、重绑定和判断是否已经到达租期。DHCP 服务器为客户分配 IP 地址时,可以为定时器指定确定的值。若服务器没有设置定时器的值,客户端就使用缺省值。定时器的缺省值如表所示。
DHCP 客户端更新租约过程
如图所示, DHCP 客户端更新租约,主要通过以下几个步骤与 DHCP 服务器建立联系:
IP 租约期限达到 50%(T1)时, DHCP 客户端会自动以单播的方式,向 DHCP 服务器发送 DHCP REQUEST 报文,请求更新 IP 地址租约。如果收到 DHCP ACK 报文,则租约更新成功;如果收到 DHCP NAK 报文,则重新发起申请过程。
IP 租约期限达到 87.5%(T2)时,如果仍未收到 DHCP 服务器的应答, DHCP 客户端会自动向 DHCP 服务器发送更新其 IP 租约的广播报文。如果收到 DHCP ACK 报文,则租约更新成功;如果收到 DHCP NAK 报文,则重新发起申请过程。
如果 IP 租约到期前都没有收到服务器响应,客户端停止使用此 IP 地址,重新发送DHCP DISCOVER 报文请求新的 IP 地址。
4、DHCP 客户端主动释放 IP 地址
DHCP 客户端不再使用分配的 IP 地址时,会主动向 DHCP 服务器发送 DHCP RELEASE 报文,通知 DHCP 服务器释放 IP 地址的租约。DHCP 服务器会保留这个 DHCP 客户端的配置信息,以便该客户端重新申请地址时,重用这些参数。
五、DHCP Relay 工作原理
DHCP Relay 即 DHCP 中继,它实现了不同网段间的 DHCP 服务器和客户端之间的报文交互。
DHCP 中继承担处于不同网段间的 DHCP 客户端和服务器之间中继服务,将 DHCP 协议报文跨网段透传到目的 DHCP 服务器,最终使网络上的 DHCP客户端可以共同使用一个 DHCP 服务器。
客户端首次申请地址时通过 DHCP 中继获得地址过程如图所示。
DHCP 中继工作过程
DHCP 客户端发送请求报文给 DHCP 服务器, DHCP 中继收到该报文并适当处理后,以单播形式发送给指定的位于其它网段上的 DHCP 服务器。服务器根据请求报文中提供的必要信息,通过 DHCP 中继将配置信息返回给客户端,完成对客户端的动态配置。
1. DHCP 中继接收到 DHCP-DISCOVER 或 DHCP-REQUEST 报文后,将进行如下处理:
为防止 DHCP 报文形成环路,抛弃报文头中 hops 字段的值大于限定跳数的 DHCP请求报文。否则,继续进行下面的操作。将 hops 字段增加 1,表明又经过一次 DHCP中继。
检查 Relay Agent IP Address 字段。如果是 0,需要将 Relay Agent IP Address 字段设置为接收请求报文的接口 IP 地址。如果接口有多个 IP 地址,可选择其一。以后从该接口接收的所有请求报文都使用该 IP 地址。如果 Relay Agent IP Address 字段不是0,则不修改该字段。
将请求报文的 TTL 设置为 DHCP 中继设备的 TTL 缺省值,而不是原来请求报文的TTL 减 1。对中继报文的环路问题和跳数限制问题都可以通过 hops 字段来解决。
DHCP 请求报文的目的地址修改为 DHCP 服务器或下一个 DHCP 中继的 IP 地址。从而将 DHCP 请求报文转发给 DHCP 服务器或下一个 DHCP 中继。
2. DHCP 服务器根据 Relay Agent IP Address 字段为客户端分配 IP 地址等参数,并将 DHCP应答报文发送给 Relay Agent IP Address 字段标识的 DHCP 中继。DHCP 中继接收到 DHCP应答报文后,会进行如下处理:
DHCP 中继假设所有的应答报文都是发给直连的 DHCP 客户端。Relay Agent IP Address 字段用来识别与客户端直连的接口。如果 Relay Agent IP Address 字段不是本地接口的地址, DHCP 中继将丢弃应答报文。
DHCP 中继检查报文的广播标志位。如果广播标志位为 1,则将 DHCP 应答报文广播发送给 DHCP 客户端;否则将 DHCP 应答报文单播发送给 DHCP 客户端,其目的地址为 Your (Client) IP Address 字段内容,链路层地址为 Client Hardware Address 字段内容。
客户端通过 DHCP 中继延长地址租期的过程如图所示。
客户端通过 DHCP 中继更新租约
1. DHCP 客户端经过首次正确登录网络后,只需直接向上次为它分配 IP 地址的 DHCP 服务器直接以单播的形式发送 DHCP REQUEST 报文。
2. DHCP 服务器直接向客户端发送单播的确认响应报文或者拒绝响应报文。
DHCP Relay 支持向 DHCP 服务器发送 Release 报文
在网络中可以在 DHCP 中继上直接向服务器发送 Release 报文请求释放服务器给某客户端分配的IP 地址,而不需要由客户端发起 Release 请求。可以通过在 DHCP 中继上配置 Relay 释放命令实现服务器对客户端的地址释放操作。
六、IP 地址的分配与更新原则
IP 地址分配的优先次序
DHCP 服务器按照如下次序为客户端选择 IP 地址。
DHCP 服务器的数据库中与客户端 MAC 地址静态绑定的 IP 地址。
客户端以前曾经使用过的 IP 地址,即客户端发送的 DHCP DISCOVER 报文中请求 IP 地址选项的地址。
在 DHCP 地址池中,顺序查找可供分配的 IP 地址,最先找到的 IP 地址。
如果在 DHCP 地址池中未找到可供分配的 IP 地址,则依次查询超过租期、发生冲突的 IP地址,如果找到可用的 IP 地址,则进行分配,否则报告错误。
防止 IP 地址重复分配的方法
为防止 IP 地址重复分配导致地址冲突, DHCP 服务器为客户端分配地址前,需要先对该地址进行探测。
地址探测是通过 Ping 命令实现的,检测是否能在指定时间内得到 Ping 应答。如果没有得到应答,则继续发送 Ping 报文,直到发送 Ping 包的数量达到最大值。如果仍然超时,则可以认为这个 IP地址的网段内没有设备使用该 IP 地址,从而确保客户端被分得的 IP 地址是唯一的。
IP 地址预留
DHCP 支持预留 IP 地址给客户端,预留的 IP 地址可以是地址池中的地址,也可以不是。如果是的话,则将其不列入到地址池可分配的 IP 地址中,这些预留出去的地址一般用于某个 DNS 服务器的 IP 地址。
PC 机释放 IP 地址与更新租约的方法
在 PC 机上(即 DHCP 客户端)需要首先释放旧 IP 地址,然后获取新 IP 地址。
1、释放旧 IP 地址
操作系统不同命令会有所不同。可以使用下面两种方法中的一种。
在用户 PC 机的 Windows Vista/Windows XP/Windows2000/DOS 环境下使用
ipconfig/release 命令来主动释放 IP 地址;
在 Windows 98 MS-DOS 界面下执行 winipcfg/release 来主动释放 IP 地址。
此时用户 PC 机向 DHCP 服务器发送 DHCP RELEASE 报文。
2、 更新 IP 地址租约或申请新的 IP 地址
同一操作系统下,申请新的 IP 地址和更新 IP 地址使用的命令一样。如果用户希望申请更新 IP 地址,则需要在 PC 机上(即 DHCP 客户端)首先释放旧的 IP 地址,而更新租约不需要提前释放 IP 地址。
不同的操作系统使用的命令也不同。用户可以使用下面两种方法中的一种。
在用户 PC 机的 Windows Vista/Windows XP/Windows2000/DOS 环境下使用
ipconfig/renew 命令来申请新的 IP 地址;
在 Windows 98 MS-DOS 界面下执行 winipcfg/renew 来申请新的 IP 地址。
此时用户 PC 机向 DHCP 服务器发送 DHCP DISCOVER 报文。