目录
1. DHCP 简介
1.1 DHCP 作用
1.2 DHCP 工作机制
2. DHCP 交互流程
2.1 正常交互流程
2.2 租约
2.3 客户端状态机
2.4 参数配置
3. DHCP 报文
3.1 报文类型
3.2 报文格式
3.3 抓包
4. DHCP 中继代理
DHCP(Dynamic Host Configurations Protocol),动态主机配置协议,前身是 BOOTP 协议,是一个局域网的网络协议,使用 UDP 协议工作。
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 资源短缺的问题。
DHCP 服务器管理IP的方式有三种:
1) 人工配置(由管理员对每台具体的计算机指定一个地址)
2) 自动配置(服务器为第一次连接网络的计算机分配一个永久地址)
3) 动态配置(在一定的期限内将地址租给计算机,租期结束后客户必须续租或者停用该地址),路由器经常使用的是动态配置。
DHCP 维护了两个租约表:静态租约表及动态租约表。
静态租约表:对应一个静态租约存储文件, Server 运行时从文件中读取静态租约表。
动态租约表:对应一个周期存储文件, Server 周期性将租约表存进该文件,在程序开始时将会读取上次存放的租约表。(租约表记录了当前所有分配的租约,包括静态链接的)。
客户端发起请求,服务器读取客户端信息,并在租约表中进行检索找到相应的表项,再根据客户端的状态执行不同的回复。当收到客户端的首次请求时,DHCP 服务器先查找静态租约表;若存在请求的表项,返回这个客户的静态 IP 地址;否则,从 IP 地址池中选择可用的 IP 分配给客户,并添加信息到动态数据库中。此外,服务器将会周期性的刷新租约表写入文件存档,在这个过程中会顺便对动态租约表进行租期检查。
DHCP 正常交互流程如图 1所示:
图 1 客户端服务器正常交互流程
1) 客户端请求 DHCP 服务器:发送 DHCP DISCOVER 包
当 DHCP 客户端第一次登录网络的时候(也就是客户端上没有任何IP地址数据时),它会通过 UDP 67 端口向网络上发出一个 DHCP DISCOVER 数据包(包中包含客户端的 MAC 地址和计算机名等信息)。因为客户端还不知道自己属于哪一个网络,所以封包的源地址为0.0.0.0,目标地址为 255.255.255.255,然后再附上 DHCP DISCOVER 的信息,向网络进行广播。
DHCP DISCOVER 的等待时间预设为 1 秒,也就是当客户端将第一个DHCP DISCOVER 封包送出去之后,在 1 秒之内没有得到回应的话,就会进行第二次 DHCP DISCOVER 广播。若一直没有得到回应,客户端会将这一广播包重新发送四次(以 2,4,8,16 秒为间隔,加上 1-1000 毫秒之间随机长度的时间)。如果都没有得到DHCP Server的回应,客户端会从 169.254.0.0/16 这个自动保留的私有 IP 地址中选用一个IP地址。并且每隔 5 分钟重新广播一次,如果收到某个服务器的响应,则继续IP租用过程。
2) 服务端提供 IP 地址租用:发送 DHCP OFFER 包
当 DHCP Server 监听到客户端发出的 DHCP DISCOVER 广播包后,它会从那些还没有租出去的地址中,按照一定的规则选择一个空置 IP ,通过 UDP 68 端口发送 DHCP OFFER 广播包(包中包含IP地址、子网掩码、地址租期等信息)。DHCP Server 为此客户保留它提供的 IP 地址,从而不会为其他DHCP客户分配此IP地址。
静态租用:首先匹配 MAC 地址,看是否能在静态租约表中找到对应的项,若能找到就把 IP 分配给他。静态表中的IP不能被其他客户使用。
动态租用:
a) Server 试图分配给 Client 上次分配过的IP,在这之前检查这个 IP 是否正在使用
b) DISCOVER 中含有 Request IP 时,检查该IP是否在地址池范围,是否正在使用,是否到期,是否是静态 IP,网络上是否已经存在
c) DISCOVER 不含 Request IP,从地址池上寻找一个最小的可用 IP 分配
3) 接受 IP 租约::发送 DHCP REQUEST 包
如果客户端收到网络上多台 DHC P服务器的响应,按照一定的规则挑选其中一个 DHCP OFFER (一般是最先到达的那个),并且会向网络发送一个 DHCP REQUEST 广播数据包(包中包含客户端的 MAC 地址、接受的租约中的IP地址、提供此租约的 DHCP 服务器地址等),告诉所有 DHCP Server 它将接受哪一台服务器提供的IP地址,其他的 DHCP 服务器撤销它们未被采用的 IP。
4) 租约确认:ACK
当 DHCP Server 接收到客户端的 DHCP REQUEST 之后,会广播返回给客户端一个 DHCP ACK 消息包,表明已经接受客户端的选择,并将这一IP地址的合法租用以及其他的配置信息都放入该广播包发给客户端。
客户端在接收到 DHCP ACK 广播后,会向网络发送三个针对此 IP 地址的 ARP 解析请求以执行冲突检测,查询网络上有没有其它端器使用该 IP 地址;如果发现该 IP 地址已经被使用,客户端会发出一个 DHCP DECLINE 数据包给 DHCP Server,拒绝此IP地址租约,并重新发送 DHCP DISCOVER 信息。此时,在 DHCP 服务器管理控制台中,会显示此 IP 地址为 BAD_ADDRESS。
如果网络上没有其它主机使用此IP地址,则客户端的 TCP/IP 使用租约中提供的 IP 地址完成初始化,从而可以和其他网络中的主机进行通讯。
5) 租约 NAK
REQUEST 失败,出现此种问题有如下两种原因:
a) 请求的 IP 是静态 IP,但是 MAC 地址无法与其对应。
b) DHCP ACK 中验证失败。
租约生命周期分为如下几个阶段
a) 分配(Allocation:):客户端没有租约,没有IP地址,通过“分配”阶段请求租约
b) 重新分配(Reallocation:):客户端已经有了租约,因此有了 IP 地址,但是重启了。于是向授权其租约的服务器确认租约以及获取操作参数
c) 正常操作(Normal Operation):租约有效,客户端使用其分配的IP地址和其他参数进行业务
d) 更新(Renewal):在租约快过期时,客户端向授予其租约的服务器请求更新租约
e) 重新绑定(Rebinding):如果更新失败,那么客户端向任意有效的服务器请求重新绑定租约
f) 释放(Release):客户端不在使用被分配的IP地址,因此释放该IP。
租约生命周期如图 2所示:
图 2 租约生命周期示意图租约分配流程如图 3所示:
图 3 租约分配流程租约重新分配流程如图 4所示:
图 4 租约重新分配过程租约更新和重新绑定如图 5所示:
图 5 租约更新和重新绑定过程客户端的有限状态机如图 6、图 7、图 8所示:
图 6 客户端状态机图1图 7 客户端状态机图2
图 8 客户端状态机图3
客户端状态机切换如图 9所示:
图 9 客户端状态机变化参数配置流程如下图 10所示:
图 10 参数配置过程路由器上的 DHCP 服务器配置信息如图 11所示:
图 11 路由器上DHCP服务器配置信息DHCP 涉及报文如下:
DHCP报文类型 |
描述 |
DHCP DISCOVER |
DHCP客户端请求地址时,并不知道DHCP服务器的位置,因此DHCP客户端会在本地网络内以广播方式发送请求报文,这个报文就是DISCOVER报文,目的是发现网络中的DHCP服务器,所有收到DISCOVER报文的DHCP服务器都会发送回应报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置。 |
DHCP OFFER |
DHCP服务器收到DISCOVER报文后,就会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如网关、DNS服务器等),构造一个OFFER报文,发送给用户,告知用户本服务器可以为其提供IP地址。< 只是告诉client可以提供,是预分配,还需要client通过ARP检测该IP是否重复> |
DHCP REQUEST |
DHCP客户端可能会收到很多OFFER,所以必须在这些回应中选择一个。Client通常选择第一个回应OFFER报文的服务器作为自己的目标服务器,并回应一个广播REQUEST报文,通告选择的服务器。DHCP客户端成功获取IP地址后,在地址使用租期过去1/2时,会向DHCP服务器发送单播REQUEST报文续延租期,如果没有收到DHCP ACK报文,在租期过去3/4时,发送广播REQUEST报文续延租期。 |
DHCP ACK |
DHCP服务器收到REQUEST报文后,根据REQUEST报文中携带的用户MAC来查找有没有相应的租约记录,如果有则发送ACK报文作为回应,通知用户可以使用分配的IP地址。 |
DHCP NAK |
如果DHCP服务器收到REQUEST报文后,没有发现有相应的租约记录或者由于某些原因无法正常分配IP地址,则发送NAK报文作为回应,通知用户无法分配合适的IP地址。 |
DHCP RELEASE |
当用户不再需要使用分配IP地址时,就会主动向DHCP服务器发送RELEASE报文,告知服务器用户不再需要分配IP地址,DHCP服务器会释放被绑定的租约。 |
DHCP DECLINE |
DHCP客户端收到DHCP服务器回应的ACK报文后,通过地址冲突检测发现服务器分配的地址冲突或者由于其他原因导致不能使用,则发送DECLINE报文,通知服务器所分配的IP地址不可用。 |
DHCP INFORM |
DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送INFORM报文向服务器进行请求,服务器收到该报文后,将根据租约进行查找,找到相应的配置信息后,发送ACK报文回应DHCP客户端。 |
下文对主要的报文格式进行介绍。
报文格式如图 12所示:
图 12 报文格式各字段含义如图 13、图 14、图 15所示:
图 13 报文字段含义图1图 14报文字段含义图2 图 15报文字段含义图3
Op:操作码,客户端发包是1,服务端回复是2
HType:用于本地网络的硬件类型
HLen:硬件地址长度,对于用 MAC 地址的网络,该值为6(6字节,48位)
XID: 随机生成的一段字符串,两个数据包拥有相同的XID说明他们属于同一次会话
CIAddr:客户端会在发送请求时将自己的 IP 地址放在此处(更新租约时用)
YIAddr:服务器会将想要分配给客户端的 IP 地址放在此处
SIAddr:一般来说是服务器的 IP 地址.
Chaddr:客户端的 MAC 地址
GIAddr:如果需要跨子网进行 DHCP 地址发放,则在此处填入经过的路由器的 IP 地址
SName:服务器主域名
Options:可以自由添加的部分,用于存放客户端向服务器请求信息和服务器的应答信息
Options 字段格式如图 16所示:
图 16 Options字段格式Option 格式如图 17所示:
图 17 Option格式DHCP Option 类别如下图 18所示:
图 18 Option类别说了那么多,通过 Wireshark 抓包实战,看一下 DHCP 交互的具体流程及报文信息。
首先查看一下电脑的网络配置,如图 19所示
图 19 DHCP使能1) 通过 Wireshark 抓包
2) 通过命令 ipconfig /renew 更新网络信息
通过 udp.port==67 过滤报文,只看到了两个报文,一个是 REQUEST,另一个是 ACK ,具体信息如下:
图 20 Request报文由于之前电脑已经被分配了 192.168.0.100 的 IP 地址,因此在图 20中的 Client IP 地址的值是 192.168.0.100。
ACK 报文如图21所示:
图 21 ACK报文可以看到,电脑又被分配了 192.168.0.100 的地址(租约重新分配)。
如果想看一下 DISCOVER 及 OFFER 报文,该怎么办?通过如下命令:
1) ipconfig /release
2) ipconfig /renew
通过 udp.port==67 过滤报文,结果如图 22 所示:
图 22 DHCP操作过程DISCOVER 报文格式如图 23 所示:
图 23 Discover 报文格式OFFER 报文格式如图 24 所示:
图 24 Offer报文格式INFORM 报文格式如图 25 所示:
图 25 Inform报文格式RELEASE 报文格式如图 26 所示:
图 26 Release报文格式家庭网络大多只有一个以太网的网段,与其连接的主机台数也不会太多。因此,一台 DHCP 服务器即可满足 IP 地址分配的需求,而大多情况下都由宽带路由器充当这个 DHCP 的角色。
但是,对于企业或者学校等大规模组织机构的网络环境,一般会有多个以太网网段。这种情况下,如果为每个网段都设置 DHCP 服务器将会很繁琐,并且容易出错。即使路由器可以分担 DHCP 的概念,但是如果网络中有 10 个路由器,就要为路由器设置它们各自可分配 IP 地址的范围,并且对这些范围进行后续的变更维护,这样就很耗时和难以管理了。
于是,DHCP 中继代理器应运而生。有了中继代理器后,对不同网段的IP地址分配可以由一个 DHCP 服务器统一进行管理和运维。
在每个网段设置一个 DHCP 中继代理(可以用路由器或者直接在主机上配置),它可以设置 DHCP 服务器的IP地址,这样就可以在 DHCP 服务器上为每个网段注册IP地址的分配范围。
DHCP 客户端向 DHCP 中继代理发送 DHCP 请求包,DHCP 中继代理在收到这个广播包后,再以单播的形式发送给 DHCP 服务器。服务器收到该包以后再向 DHCP 中继代理返回应答,并由 DHCP 中继代理将此包转发给 DHCP 客户端( DHCP 包中包含发出请求的主机的 MAC 地址。DHCP 代理正是利用这个 MAC 地址将包返回给 DHCP 客户端)。由此,即使 DHCP 服务器不在同一个链路上也可以实现统一分配和管理 IP 地址
参考资料
1. 《 The TCP/IP Guide 》
2.《 图解 TCP/IP 》
3. DHCP 详解
4.DHCP报文解析
5. DHCP工作过程详解