37 张图详解 DHCP :给你 IP 地址的隐形人

网络
DHCP 协议是从 BOOTP 协议发展而来。但 BOOTP 运行在相对静态的环境中,每台设备配置专门的 BOOTP 参数文件,该文件会在相当长的时间内保持不变。DHCP 从以下两方面对 BOOTP 进行了扩展:DHCP 允许设备动态地获取 IP 地址,而不是静态指定每台主机地址。DHCP 能够分配其它的配置参数,客户端仅用一个消息就获取它所需要的所有配置信息。

DHCP 出现

电脑或手机需要 IP 地址才能上网。大刘有两台电脑和两台手机,小美有一台笔记本电脑、一台平板电脑和两台手机,老王、阿丽、敏敏也有几台终端设备。如果为每台设备手动配置 IP 地址,那会非常繁琐,一点儿也不方便。特别是手机、笔记本电脑、平板电脑等设备,每移动到一个新的地方,接入不同的网络,都要重新设置 IP 地址,实在是太麻烦了。

是就有了 DHCP 协议,会自动配置设备的网络参数,包括 IP 地址、子网掩码、网关地址、DNS 服务器等,替代手动配置。还能统一 IP 地址分配,方便网络管理。

DHCP 简介

DHCP 协议是从 BOOTP 协议发展而来。但 BOOTP 运行在相对静态的环境中,每台设备配置专门的 BOOTP 参数文件,该文件会在相当长的时间内保持不变。DHCP 从以下两方面对 BOOTP 进行了扩展:

  • DHCP 允许设备动态地获取 IP 地址,而不是静态指定每台主机地址。
  • DHCP 能够分配其它的配置参数,客户端仅用一个消息就获取它所需要的所有配置信息。

大刘他们的设备使用 DHCP 功能后,只要连接到网络,就可以进行 TCP/IP 通信。对于路由器和交换机,通常是手动配置 IP 地址等参数。

DHCP 是一种 Client/Server 模式的网络协议,由 DHCP Client 向 DHCP Server 提出配置申请,DHCP Server 返回为 DHCP Client 分配的配置信息。这里的 Client 和 Server 是应用程序,可以运行在电脑、服务器、路由器等设备上。

举个栗子:

大刘的电脑开机后,自动运行 DHCP Client ,DHCP Client 主动向其它设备上的 DHCP Server 提出请求,DHCP Server 根据预先配置的策略,返回相应 IP 配置信息,DHCP Client 使用获得的 IP 配置信息与其它设备进行通信。

DHCP 分配机制

DHCP 提供了两种地址分配机制,可以根据网络需求为不同的 Client 选择不同的分配策略。

  • 动态分配机制:通过 DHCP 为 Client 分配一个有使用期限的 IP 地址。如果 Client 没有及时续约,到达使用期限后,这个地址可能会被其它 Client 使用。绝大多数 Client 使用的都是这种动态分配的地址。
  • 静态分配机制:通过 DHCP 为特定的 Client 分配固定的 IP 地址。固定 IP 地址可以永久使用, Client 通常是打印机、服务器等设备。

在实际情况中,我们发现 DHCP Client 重启后,也能获得相同的 IP 地址。DHCP Server 为 DHCP Client 分配 IP 地址时,采用如下的顺序:

  1. DHCP Server 中与 DHCP Client 的 MAC 地址静态绑定的 IP 地址。
  2. DHCP Client 曾经使用过的 IP 地址。
  3. 最先找到的可用 IP 地址。

如果没找到可用的 IP 地址,就依次查询超过租期、发生冲突的 IP 地址,如果找到就进行分配,否则报错处理。

DHCP 系统组成

DHCP 系统由 DHCP Server( DHCP 服务器)、DHCP Client( DHCP 客户端)、DHCP Relay( DHCP 中继)等组成。

  • DHCP Server
    DHCP Server 提供网络参数给 DHCP Client ,通常是一台提供 DHCP 服务功能的服务器或网络设备(路由器或三层交换机)。比如:家里用的无线路由器。
  • DHCP Client
    DHCP Client 通过 DHCP Server获取网络参数,通常是一台主机或网络设备。比如:大刘的电脑、小美的手机。
  • DHCP Relay
    通常情况下,DHCP 采用广播方式实现报文交互,DHCP 服务仅限在本地网段使用。如果需要跨网段实现 DHCP ,那么使用 DHCP Relay 技术实现。
    在 DHCP Server 和 DHCP Client 之间转发跨网段 DHCP 报文的设备,通常是三层网络设备。

DHCP 基本流程

DHCP 协议报文采用 UDP 方式封装,DHCP Server 侦听的端口号是 67 ,DHCP Client 的端口号是 68 。DHCP 设备通过发送和接收 UDP 67 和 UPD 68 端口的报文进行协议交互。DHCP 的基本工作流程分为 4 个阶段,即发现阶段、提供阶段、请求阶段、确认阶段。我们假设大刘的 PC 是一台新电脑,下面将描述 PC 第一次是如何通过 DHCP 获取 IP 地址的

为方便描述,DHCP Server 简称 小 S ,DHCP Client 简称 小 C 。

1、发现阶段

小 C 在本地网段中广播一个 DHCP Discover 报文,目的寻找能够分配 IP 地址的 小 S 。

2、提供阶段

本地网段的 小 S 收到 DHCP Discover 报文后,回应 DHCP Offer 报文。DHCP Offer 报文包含了可用 IP 地址和其它网络参数。

小 C 通过对比 Discover 报文和 Offer 报文中的 xid 字段是否相同,来判断 Offer 报文是不是发给自己的

3、请求阶段

小 C 会收到 小 S 发送的 DHCP Offer 报文。如果有多个 小 S ,那么每个 小 S 都会回应 DHCP Offer 报文。通常 小 C 会选择最先收到的 Offer 报文,并广播 DHCP Request 报文来表明哪个 小 S 被选择,其余 小 S 就凉凉了。

如果 小 C 在一定时间后一直没收到 DHCP Offer 报文,那么它就会重新发送 DHCP Discover 报文。

4、确认阶段

小 S 收到 DHCP Request 广播报文后,发送 DHCP Ack 报文作为回应,其中包含 小 C 的网络参数。DHCP Ack 报文和之前 DHCP Offer 报文的参数不能有冲突,否则 小 S 会回应一个 DHCP Nak 报文。

当 小 C 收到 DHCP Ack 报文后,会发送免费 ARP 报文进行探测,目的地址为获得的 IP 地址,如果探测此地址没有被使用,那么 小 C 就会使用这个地址,并完成配置。

DHCP 租期

从 DHCP 协议上看,小 S 才有 IP 地址的所有权,而 小 C 只有 IP 地址的使用权。小 S 每次给 小 C 分配一个 IP 地址时,会约定一个 IP 地址的租期,通常是 24 小时。在租期内,小 C 才能使用相应的 IP 地址。当租期到期后,小 C 将不能继续使用这个 IP 地址。当然了,在租期还没到期的时候,小 C 是可以申请续租这个 IP 地址的。

T1 时刻是租期到一半的时候,T2 时刻是租期到 87.5% 的时候。在 T1 时刻 小 C 会单播一个 DHCP Request 报文给 小 S ,请求续租 IP 地址。如果 小 C 收到了 DHCP Ack 回应报文,则说明续租成功。

如果直到 T2 时刻,小 C 都未收到 DHCP Ack 回应报文,那么会广播发送一个 DHCP Request 报文,继续请求续租 IP 地址。如果 小 C 收到了 DHCP Ack 回应报文,则说明续租成功。

如果直到租期到期, 小 C 都未收到 DHCP Ack 回应报文,那么必须停止使用原来的 IP 地址。 小 C 将从发现阶段开始,重新来申请一个 IP 地址。

DHCP Relay

动态获取 IP 地址的过程中,使用广播方式发生报文,因此 DHCP 只适用于 小 C 和 小 S 在同一个子网内的情况。如果为每个网段配置一个 小 S ,这显然太浪费了。

实际上还有 DHCP Relay 这种角色。小 C 通过 DHCP Relay 实现跨网段与 小 S 通信,获取 IP 地址。这样,多个子网上的 小 C 可以使用同一个 小 S ,既节省成本,又方便集中管理。

DHCP Relay 的工作原理如下:

  1. 小 C 发送 DHCP Discover 或 DHCP Request 广播报文,具有 DHCP Relay 功能的网络设备收到后,根据配置将报文单播给指定的 小 S ;
  2. 小 S 进行 IP 地址的分配,单播发送给 DHCP Relay ,DHCP Relay 再将配置信息广播给 小 C ,完成对 小 C 的动态配置。

DHCP 协议报文

前面的内容有提到 DHCP 的一些报文类型,现在讲讲 DHCP 主要的 8 种报文类型。常见的 5 种报文类型有:DHCP Discover 、DHCP Offer 、DHCP Request 、DHCP Ack 和 DHCP Release ,用得少的 3 种报文类型有:DHCP Nak 、DHCP Decline 和 DHCP Inform 。

  • DHCP Discover 报文
    它是 DHCP Client 首次接入网络,DHCP 交互过程的第一个报文,用来寻找 DHCP Server的请求报文。
  • DHCP Offer 报文
    它是 DHCP Server 用来回应  DHCP Discover 报文的,并携带网络参数,包括:IP 地址、子网掩码、默认网关、DNS 服务器等。
  • DHCP Request 报文
    它是 DHCP Client 发送的报文,有三种使用场景:
  • 根据策略选择相应的 DHCP Server,并回应 DHCP Offer 报文;
  • DHCP Client 非首次接入网络,直接发送 DHCP Request 报文来申请之前使用过的 IP 地址等参数;
  • 当 IP 地址的租约到期后,发送 DHCP Request 进行租期更新。
  • DHCP Ack 报文
    它是 DHCP Server 对 DHCP Request 报文的回应报文,进行最终确认。DHCP Client 收到这个报文后,才能获得 IP 地址和相应网络参数。
  • DHCP Nak 报文
    它也是 DHCP Server 对 DHCP Request 报文的回应报文,当 DHCP Request 报文中的各个参数都正确时,回应 DHCP Ack 报文,否则回应 DHCP Nak 报文,告诉 DHCP Client 禁止使用获得的 IP 地址。
  • DHCP Decline 报文
    当 DHCP Client 收到 DHCP Ack 报文后,还会发送免费 ARP 报文,确认申请的 IP 地址是否已经在网络上使用了。如果 IP 地址已经被其它 Client 使用,那么 DHCP Client 发送 DHCP Decline 报文,拒绝分配的 IP 地址,并重新向 DHCP Server 申请地址。
  • DHCP Release 报文
    当 DHCP Client 想要释放获得的 IP 地址时,向 DHCP Server 发送 DHCP Release 报文,DHCP Server 收到报文后,可将这个 IP 地址分配给其它的 Client 。
  • DHCP Inform 报文
    DHCP Client 通过手动方式获得 IP 地址后,还想向 DHCP Server 获取更多网络参数时,比如:默认网关地址、DNS 服务器地址,DHCP Client 就向 DHCP Server 发送 DHCP Inform 报文进行申请。

DHCP 状态机

如果把功能各异的 8 种报文串起来,就是整个 DHCP 协议交互流程。前面讲的 4 种阶段(发现、提供、请求、确认)不能完全展现出来,这就需要使用 DHCP 协议的状态机。状态指出下一步使用的报文类型,状态转换是通过报文的接收、发送或超时。下面是 Client 的状态机。

Client 从 INIT 状态开始,广播 DHCP Discover 报文。在选择状态时,它收到 DHCP Offer 报文,并决定使用哪个地址和 Server 。做出选择后,通过 DHCP Request 报文进入请求状态。如果分配的地址和曾使用过的地址不一致,那么回应 DHCP Nak 报文进行拒绝,并返回 INIT 状态;如果分配的地址已经被占用,那么回应 DHCP Decline 报文进行拒绝,也返回到 INIT 状态。通常是收到一个需要的地址,回应 DHCP Ack 报文,获得租期超时值 T1 和 T2 ,并进入绑定状态,这个时候就可以使用这个地址直到租期到期。当 T1 到期时,进入更新状态并进行续租申请。如果续租成功,那么可以收到 DHCP Ack 报文,并返回到绑定状态;如果续租不成功,那么在 T2 到期时,再次进行续租申请。如果租期最终到期,那么 Client 将禁止使用所租用的地址,并返回到 INIT 状态。

DHCP 网络实战

DHCP 协议是为解决网络问题而生,现在我们就来模拟实际环境,动手操作,验证下 DHCP 的功能。

DHCP Server 示例

网络拓扑

实验要求

  • RT(路由器)配置 DHCP Server ,PC 动态获取 IP 地址等网络参数。

操作步骤

配置思路:

  1. 在 RT 上开启 DHCP 功能。
  2. 创建一个地址池。
  3. 配置地址池的相关参数。
  4. 在 RT 的接口下引用地址池,实现 DHCP Server 功能。

配置命令:

使用 DHCP 功能之前,先要开启 DHCP 功能。系统视图下,使用命令 dhcp enable 启动 DHCP 功能。

动态分配 IP 地址,就需要有多个可分配的 IP 地址,使用 ip pool ip-pool-name 命令来创建全局地址池,ip-pool-name 表示地址池的名称。

在全局地址池视图下,通过命令 network ip-address [ mask { mask | mask-length } ] 配置可分配的 IP 地址段。mask { mask | mask-length } 表示子网掩码,通常根据设备数量来确定掩码长度。

有了 IP 地址和子网掩码,再加上默认网关,终端设备就能网络互通了。在全局地址池视图下,使用命令 gateway-list ip-address 配置网关 IP 地址。

网络互通,还不能正常访问网站,需要配置 DNS 服务器,用于域名解析。在全局地址池视图下,使用 dns-list ip-address 配置 DNS 服务器的 IP 地址。

地址池配置中,常用的可选命令如下,可根据需求进行选择性设置。

lease { day day [ hour hour [ minute minute ] ]  | unlimited } :配置 IP 地址的租期,默认租期是 1 天。

excluded-ip-address start-ip-address [ end-ip-address ] :在可分配的地址池中,设置不分配的 IP 地址。比如:地址池是 192.168.100.0/24 ,可设置 192.168.100.1 - 192.168.100.10 不参与地址分配。

static-bind ip-address ip-address mac-address mac-address :为 Client 固定分配一个 IP 地址。

配置完地址池,还需要进行引用,DHCP Server 功能就能正常使用了。在 RT 的接口下配置引用,命令为 dhcp select global 。

功能验证

配置完成后,理论上是 DHCP 功能正常工作了,实际情况的话,可通过命令 display ip pool name pool-name used,查看地址池的配置情况,和地址分配情况。

在 RT 上查看 DHCP Server 地址分配状态。

同时也在 PC 上查看动态获取地址情况,进行双向验证。

抓包还可以看到 DHCP 报文交互的详细过程,同时也是检验理论知识是否正确。

这里我们发现抓包看到的是 DHCP Offer 单播报文,而前面介绍的时候,DHCP Offer 是广播报文。其实 DHCP Offer 报文有可能是单播,也有可能是广播。DHCP 在报文的标志字段有一个广播位,如果 Client 支持接收 Offer 单播报文,那么 Client 就会将发送报文中的广播位设为 0 ,否则为 1 。

DHCP Relay 示例

网络拓扑

实验要求
  • DHCP Client 和 DHCP Server 在不同网段,DHCP Client 通过 DHCP Relay 获取到 IP 地址等网络参数。
操作步骤
  1. PC( DHCP Client )开启 DHCP 功能。

  1. RT1( DHCP Relay )使用 dhcp select relay 命令开启 DHCP Relay 功能,在 G0/0/1 口下使用 dhcp relay server-ip ip-address 命令,配置 DHCP Server 的 IP 地址。

  1. RT2(DHCP Server)开启 DHCP 功能,创建地址池并配置相关参数,在接口下引用地址池,实现 DHCP Server 功能。

功能验证

PC 端能获取到 IP 配置,并且获取的配置正确。

在 RT1 的 G0/0/1 抓包,查看 DHCP Client 和 DHCP Relay 的报文交互过程。

在 RT1 的 G0/0/0 抓包,查看 DHCP Server 和 DHCP Relay 的报文交互过程。

DHCP 报文格式

如果想要更深入的了解 DHCP 协议,那就要看它的报文格式。DHCP 设备通过识别报文内容,实现协议功能。

  • op(操作类型):表示报文的格式。当值为 1 时,表示客户端的请求报文;当值为 2 时,表示服务器的响应报文。
  • htype(硬件类型):不同的硬件类型取不同的值,最常见的以太网,值是 1 。
  • hlen(硬件地址长度):表示硬件地址长度,以太网的值是 6 ,也就是 MAC 地址的长度。
  • hops(跳数):DHCP 报文经过的 DHCP 中继的数量。
  • xid(交互 ID ):DHCP 客户端取的随机值,收到 DHCP 服务器的响应报文时,查看 xid 值是否相同,来判断报文是否是发送给自己的。
  • secs(客户端启动秒数):记录 IP 地址的使用时间。
  • flags(标志):广播响应标志位,当值为 0 时,表示服务器以单播形式发送响应报文;当值为 1 时,服务器以广播形式发送响应报文。
  • ciaddr(客户端 IP 地址):客户端的 IP 地址,可以是分配的地址,也可以是正在使用的地址,还可以是的 0.0.0.0 。0.0.0.0 是客户端初始状态没有地址的时候,仅用于临时通信,不是有效的地址。
  • yiaddr(你的 IP 地址):当服务器发送响应报文时,将分配给客户端的 IP 地址填入这个字段。
  • siaddr(服务器 IP 地址):用来标识服务器的 IP 地址。
  • giaddr(中继设备 IP 地址):表示 DHCP 中继的 IP 地址,服务器通过识别这个字段来判断出客户端的网段地址,从而选择合适的地址池,为客户端分配该网段的 IP 地址。
  • chaddr(客户端硬件地址):用来标识客户端的硬件地址,当客户端发送广播发现报文时,这个字段就是自己的硬件地址。
  • sname(服务器名):可选项,DHCP 服务器填写这个字段。
  • file(引导文件名):可选项,DHCP 服务器填写这个字段。
  • options(可选项):可选项,DHCP 客户端获取网络参数,DHCP 服务器提供网络参数,都是使用的这个字段。内容有很多,例如:租期、子网掩码、默认网关地址、DNS 服务器地址等。

拿着 DHCP 报文格式,就可以看懂抓包获取的报文内容。

DHCP Discover 报文:

DHCP Offer 报文:

DHCP Request 报文:

DHCP Ack 报文:

责任编辑:姜华 来源: 网络技术平台
相关推荐

2010-08-30 16:37:48

DHCPIP地址

2010-09-28 15:10:12

DHCP服务固定IP地

2021-01-28 10:55:47

Kubernetes IPLinux

2023-07-05 15:32:59

DHCP配置协议

2024-03-14 09:55:35

DHCP网络IP地址

2010-09-25 16:26:32

DHCP保留特定IP地

2010-09-26 13:49:55

DHCP中继故障

2010-09-27 10:03:05

DHCP服务器IP M

2010-09-29 14:39:32

DHCP服务

2010-08-23 17:35:46

DHCP协议

2010-09-03 11:21:57

2011-03-17 10:04:29

2009-07-27 09:47:00

路由DHCP服务器DHCP

2010-09-26 14:01:30

DHCP中继故障

2010-08-31 17:30:51

DHCP服务

2010-09-27 12:42:31

静态IP dhcp s

2010-08-26 21:52:55

DHCP分配

2010-08-30 09:15:37

DHCP Snoopi

2010-08-31 22:29:54

DHCP分配

2010-09-01 09:22:52

DHCPIP
点赞
收藏

51CTO技术栈公众号