DHCP基础

DHCP概述

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),用于集中对用户IP地址进行动态管理和配置的协议。

DHCP采用C/S通信模式,协议报文基于UDP方式进行交互,采用67(DHCP服务器)和68(DHCP客户端)两个端口号

网络中的终端设备,如主机、打印机、笔记本电脑、手机等,作为DHCP客户端,向DHCP服务器请求分配相关网络参数。DHCP服务器响应DHCP客户端请求动态分配。

DHCP实现过程

客户端首次接入网络

  • 发现阶段: DHCP客户端发送DHCP Discover 报文来发现DHCP服务器。DHCP Discover报文中携带了客户端的MAC地址、需要请求的参数列表选项、广播标志位等信息

  • 提供阶段: 服务器收到DHCP Discover报文后,选择跟接收该报文接口的IP地址处于同一网段的地址池,从中选择一个可用的IP地址,然后通过DHCP Offer报文发送给客户端

  • 选择阶段: 如果有多个DHCP服务器回应了Offer报文,则客户端一般只接收第一个收到的Offer报文,然后以广播的方式发送Request报文,其中包含了客户端想选择的DHCP服务器标识符和客户端IP地址。

  • 确认阶段 服务器确认所分配的IP地址。 该阶段可能会发生冲突:

  1. 服务器收到Discover报文后,会先Ping一下该地址,如果能Ping通,则说明该地址不可用,选择其他IP分配给客户端

  2. 客户端收到ACK报文,发送免费ARP报文,探测本网段是否有其他终端使用服务器分配的IP地址,如果收到响应,客户端发送Decline通知服务器该IP地址冲突,服务器标识该地址不可用,客户端重新进入发现阶段

DHCP报文格式

字段含义:

  • Op:报文的类型,取值为1或2,1代表客户端请求报文,2代表服务器响应报文
  • Htype:硬件地址的类型,取值1代表常见的以太网MAC地址类型
  • Hlen:硬件地址的长度,单位为字节,常见的以太网MAC地址长度取值为6
  • Hops:当前DHCP报文经过的[DHCP Relay](# DHCP Relay) 数目。该字段由客户端设置为0,每经过一个DHCP Relay,字段值加一。字段作用是限制DHCP报文经过的DHCP Relay数目
  • Xid:客户端选取的随机数,使服务器的回复于客户端的报文相关联。用来标识一次地址请求过程。在一次请求中所有报文的 xid 都是一样的
  • Secs:客户端填充,标识从客户端开始获得IP地址或IP地址续借所使用的秒数,未获得IP地址前,该值为0。
  • Flags:客户端请求服务器发送响应报文的形式,只有最高位有含义,最高位为1请求发送广播响应,为0请求发送单播响应,其余15位为0
  • Ciaddr:客户端的IP地址,只有在ACK报文中有取值,其他均为0,因此还未分配到IP地址
  • Yiaddr:服务器分配给客户端的IP地址
  • Siaddr:服务器的IP地址
  • Giaddr:转发代理(网关)IP 地址,DHCP 客户端发出请求报文后经过的第一个 DHCP 中继的 IP 地址。如果没有经过 DHCP 中继,则显示为 0
  • Chaddr:客户端的Mac地址
  • Sname:服务器名字(DNS域名格式),由服务器填写,可选值,如果填写,必须是以0结尾的字符串
  • File:客户端启动DHCP相关配置的文件名,仅在Offer报文中显示,其余报文中为空。字段由DHCP服务器填写,随着IP地址的分配下发给客户端。可选值,如果填写,必须是以0结尾的字符串
  • Option:服务器分配给终端的配置信息,其中通过Type=53来表示DHCP报文类型,具体见下框
Option字段

Option字段为可变长度,最多为312Byte,字段由Type、Length和Value三部分组成,常见的Option如下:

Type=53,Length=1,Value取值从01到08分别表示不同的DHCP报文类型:

其中前物种报文类型已在前文提到,后面三种报文含义如下:

  • 6-DHCP NAK:服务器对客户端的DHCP REQUEST消息的拒绝响应消息。 • 7-DHCP RELEASE:客户端可通过发送此消息主动释放服务器分配给它的IP地址。 • 8-DHCP INFORM:DHCP客户端获取IP地址后,如果需要向DHCP服务器获取更为详细的配置信息(网关地址、DNS服务器地址),则向DHCP服务器发送DHCP INFORM请求消息。

除了规定的字段选项,还有用户自定义选项,并不做统一规定,例如Option82和Option43:

  • Option 82:中继代理信息 DHCP中继或DHCP Snooping设备接收到客户端发送给服务器的请求报文后,在该报文中添加Option82,并转发给DHCP服务器。管理员可从该字段中获取DHCP客户端的信息,例如DHCP客户机所连接交换机端口的VLAN ID、二层断开后号,中继设备的MAC地址等

Option82最多包含255个Sub-Option,至少定义一个Sub-Option,常用的Sub-Option如下: - Sub-Option 1:为代理电路id(即circuit id)子项。子选项通常在DHCP中继设备上 配置,定义了在传输报文的时候要携带DHCP客户端所连接交换机端口的vlan-id及二 层端口号。通常Sub-Option 1与Sub-Option 2子选项要共同使用来标识DHCP源端的信息。 - Sub-Option 2:代理远程id(即remote id)子项。该子选项也通常在DHCP中继设备上配置,定义了在传输报文的时候要携带中继设备的mac地址信息。 - Sub-Option 5:为链路选择(link selection)子项,该选项中包含了DHCP中继添加的ip地址。这样DHCP server在分配ip地址给DHCP客户端的时候就可以分配与该地址同网段的ip地址。

  • Option43:厂商特定信息 服务器和客户端通过该字段交换厂商的特定信息,DHCP服务器接收到请求Option43信息的请求报文(Option55中带有43参数)后,将在回复报文中携带Option43,为客户端分配厂商特定的信息。

在WLAN组网中,AP作为客户端,DHCP服务器为AP指定AC的IP地址(AP和AC不在一个广播域时,AP无法通过广播的方式获取AC的IP地址,从而无法建立CAPWAP隧道),方便AP和AC建立连接:

DHCP续租

DHCP服务器给每个分配给客户端的IP地址定义一个使用期限,在租期到期前,客户端如果仍要使用IP地址,可以请求延长租期;如果不需要,可以发送Release报文主动释放IP,服务器会保存这个客户端的配置信息,将IP地址列入曾经分配过的IP地址中,以便后续重新分配给该客户端,或者其他客户端:在没用其他空闲地址可用的情况下,DHCP服务器会把客户端主动释放的IP地址分配给其他客户端。

T1(租期到50%),客户端会自动发送单播的Request报文,请求更新IP地址租期,如果收到ACK报文,则续租成功

T2(租期到87.5%),如果仍未收到服务器的应答,客户端以广播的方式发送Request报文,请求更新IP地址租期,如果收到ACK回应,续租成功

若到租期时间仍未收到回复,客户端停止使用该IP,重新发送Discover报文请求新的IP

在租期到期期间,如果收到NAK报文,则重新发送Discover请求新的IP

客户端非首次接入网络

该情况下可以使用曾经使用过的地址,再次接入网络时,广播发送包含前一次分配的IP地址的Request报文,报文中的Option50字段填入曾经使用过的IP地址

服务器收到该报文后,根据报文中的MAC地址查找是否有租约记录,如果有,返回ACK,否则不响应。

DHCP分配IP地址顺序

按照以下次序为客户选择IP地址:

  • DHCP服务器的数据库中与客户端MAC地址静态绑定的IP地址。
  • 客户端以前曾经使用过的IP地址,即客户端发送的请求报文中请求IP地址选项的地址。
  • 在DHCP地址池中, 顺序查找可供分配的空闲IP地址,最先找到的IP地址。
  • 如果在DHCP地址池中未找到可供分配的空闲IP地址,则依次查询超过租期、发生冲突的IP地址, 如果找到可用的IP地址, 则进行分配,否则报告错误。

DHCP配置

DHCP Relay

DHCP 即 DHCP 中继,为了解决DHCP 服务器和DHCP 客户端不在同一个广播域而存在的,提供了对DHCP广播报文的中继转发功能,能够把DHCP 客户端的广播报文“透明地”传送到其他广播域的DHCP服务器上,同样也能够把DHCP服务器端的应答报文“透明地”传送到其他广播域的DHCP客户端。

DHCP Relay 报文格式与 DHCP报文格式 一致,具体含义可到前文查看。其中要注意的是Hops字段代表了服务器和客户端之间的DHCP中继数目不能超过16个,也就是Hops值不能大于16,否则DHCP报文将被丢弃。

Giaddr字段填充的是DHCP客户端到服务器端的中继中第一个中继器的IP地址,以后都不会变,只有Hops跳数会增加。

工作原理

  1. 发现阶段: DHCP中继收到客户端广播发送的Discover报文后,通过路由转发单播发送到服务器或下一中继

    中继发送Discover报文之前,会对报文进行检查:

    • 检查DHCP报文中的Hops字段,如果大于16,则丢弃DHCP报文;否则,将Hops字段 加1(表明经过一次DHCP中继),并继续下面的操作。

    • 检查DHCP报文中的Giaddr字段。如果是0,将Giaddr字段设置为接收DHCP DISCOVER报文的接口IP地址。如果不是0,则不修改该字段,继续下面的操作。

    • 将DHCP报文的目的IP地址改为DHCP服务器或下一跳中继的IP地址,源地址改为中继 连接客户端的接口地址,通过路由转发将DHCP报文单播发送到DHCP服务器或下一 跳中继。

  2. 提供阶段: 服务器根据Discover报文中的Giaddr字段选择地址池为客户端分配网络参数,中继收到Offer报文后,使用单播或广播的方式发送给客户端

    中继收到Offer报文后,同样会先检查报文:

    • 检查报文中的Giaddr字段,如果不是接口的地址,则丢弃该报文;否则,继续下面的 操作。

    • DHCP中继检查报文的广播标志位。如果广播标志位为1,则将DHCP OFFER报文广播 发送给DHCP客户端;否则将DHCP OFFER报文单播发送给DHCP客户端。

  3. 选择阶段: 中继接收到Request报文,处理过程和发现阶段一样

  4. 确认阶段: 中继收到ACK报文,处理过程和提供阶段一样

DHCH Relay配置

注意
配置DHCP服务器组是在接口视图下的

参考文章