1、DHCP的作用
如下所示,我们如何配置用户主机,才能是用户主机正常访问网络中的 Web 服务器

即:需要给网络中的各主机正确配置 IP 地址、子网掩码、默认网关、DNS 服务器等网络相关配置信息
例如:如下所示,手工配置的网络相关配置信息

若配置的主机比较多,则手工配置的工作量比较大,且容易出错!

若给该网络配置一台 DHCP 服务器,在该服务器中设置好可为网络中其他各主机配置的网络配置信息
网络中各主机开机后自动给启动 DHCP 程序,向 DHCP 服务器请求自己的网络配置信息
- 这样网络中的各主机就都可以从
DHCP服务器自动获取网络配置信息

2、DHCP的工作过程
2.1、前提说明
假设网络中有两台 DHCP 服务器和一台用户主机

DHCP 使用 C/S 方式,在 DHCP 服务器上运行 DHCP 服务器进程
- 也可以简称为
DHCP服务器
在用户主机上运行 DHCP 客户进程
- 也可以简称为
DHCP客户

DHCP 是应用层的协议,它使用 UDP 所提供的服务
- 也就是说
DHCP报文在运输层会被封装成为UDP用户数据报
DHCP 服务器使用的 UDP 端口:
67
67
67
DHCP 客户使用的 UDP 端口:
68
68
68
这两个 UDP 端口都是熟知端口
封装有 DHCP 的用户数据报在网络层会被封装成 IP 数据报
- 然后再根据所使用的网络接口封装成相应的相应的数据链路层的帧进行发送
- 例如:封装成以太网帧
2.2、DHCP 客户与DHCP服务器的交互过程

当启用主机的 DHCP 后,DHCP 客户将广播发送
DHCP
发现报文
\color{blue}\texttt{DHCP}发现报文
DHCP发现报文
封装该报文的 IP 数据报的源 IP 地址为
0.0.0.0
0.0.0.0
0.0.0.0
- 这是因为主机目前还未分配到
IP地址,因此使用该地址来代替
目的 IP 地址为广播地址
255.255.255.255
255.255.255.255
255.255.255.255
- 之所以进行
广播发送,是因为主机现在并不知道网络中有哪几个DHCP服务器
由于是广播的 IP 数据报,因此网络中的所有设备都会收到该 IP 数据报
- 并对其层层解封
解封出封装有 DHCP 发现报文的 UDP 用户数据报

对于 DHCP 客户,其应用层没有监听该 UDP 用户数据报目的端口
67
67
67 的进程
- 也就是没有监听
DHCP服务器进程
因此无法交付 DHCP 发现报文,只能丢弃(网络中其他客户机丢弃了这个 DHCP 发现报文)
对于 DHCP 服务器,其应用层始终运行着 DHCP 服务器进程,
- 因此会接受该
DHCP发现报文并作出响应
DHCP 报文的格式比较复杂,对于 DHCP 发现报文
- 我们只需要知道其内部封装有事务
ID和DHCP客户端的MAC地址即可

DHCP 服务器收到 DHCP 发现报文后,根据其中封装的 DHCP 客户端的 MAC 地址来查找自己的数据库。
- 看是否有针对该
MAC地址的配置信息。
若有,则使用这些配置信息来构建并发送
DHCP
提供报文
\color{blue}\texttt{DHCP} 提供报文
DHCP提供报文;
若没有,则采用默认配置信息来构建并发 DHCP 提供报文
封装有该报文的 IP 数据报的源 IP 地址为 DHCP 服务器的 IP 地址
目的 IP 地址仍为广播地址
- 原因是:主机目前没有配置
IP地址,为了使主机可以收到,只能发送广播
这样一来网络中的所有设备都会收到该 IP 数据报,并对其层层解封
- 解封出封装有
DHCP提供报文的UDP用户数据报
对于 DHCP 服务器,其应用层没有监听该 UDP 用户数据报目的端口
68
68
68 的进程
- 也就是
DHCP客户进程,因此无法交付DHCP提供报文,只能丢弃

而对于 DHCP 客户,其应用层运行着 DHCP 进程
- 因此会接受该
DHCP提供报文并作出相应处理
DHCP 客户会根据 DHCP 提供报文中的事务 ID 来判断该报文是否是自己所请求的报文
-
若该事务
ID与自己之前发送的DHCP发现报文中封装的事务ID相等就表明这是自己所请求的报文,就可以接收该报文;否则丢弃该报文

DHCP 提供报文中还封装有配置信息
- 例如:
IP地址,子网掩码, 地址租期,默认网关,DNS服务器等
注意:DHCP 服务器从自己的 IP 地址池中挑选待租用给主机 IP 地址时,
- 会使用
ARP来确认所选IP地址未被网络中其他主机占用

在本例中,DHCP 客户会收到两个 DHCP 服务器发来的 DHCP 提供报文,
DHCP客户从中选择一个,一般来说,选择先到的那个- 并向所选择的
DHCP服务器发送 DHCP 请求报文 \color{blue}\texttt{DHCP} 请求报文 DHCP请求报文
封装该该报文的 IP 数据报的源 IP 地址仍为
0.0.0.0
0.0.0.0
0.0.0.0
-
因为此时
DHCP客户才从多个DHCP服务器中挑选一个作为自己的DHCP服务器,它首先需要征得该服务器的同意,之后才能正是使用向该
DHCP服务器租用的IP地址
目的地址仍为广播地址
-
因为不用向网络中的每一个
DHCP服务器单播发送DHCP请求报文,来告知它们是否请求它们作为自己的
DHCP服务器
DHCP 请求报文中封装有事务 ID
DHCP客户端的MAC地址- 接受的租约中的
IP地址 - 提供此租约的
DHCP服务器端的IP地址

在本例中,假设 DHCP 客户选择 DHCP 服务器
1
1
1 作为自己的 DHCP 服务器
- 并且
DHCP服务器 1 1 1 接收该请求
于是 DHCP 服务器
1
1
1 给 DHCP 客户发送 DHCP 确认报文
封装该该报文的 IP 数据报的源 IP 地址为 DHCP 服务器
1
1
1 的 IP 地址
- 目的地址仍为广播地址(
DHCP客户还没有所提供的使用IP地址)

DHCP 客户收到该确认报文后,就可以使用所租用的 IP 了
注意:在使用租用到的 IP 地址之前
DHCP 客户使用 ARP 检测所分配到的 IP 地址是否已被网络中其他主机占用:
若被占用:给 DHCP 服务器发送 DHCP DECLINE” (DHCP 谢绝)报文撤销(谢绝) IP 地址租约,并重新发送 “DHCP DISCOVER” (DHCP 发现)报文;
若未被占用:可以使用租约中的 IP 地址与网络中其他主机通信了。

当租用期过了一半时,DHCP 客户会向 DHCP 服务器发送 DHCP 请求报文
- 来请求更新租用期
封装该报文的 IP 数据报的源 IP 地址为 DHCP 客户之前租用到的 IP 地址
- 目的
IP地址为DHCP服务器 1 1 1 的地址
① DHCP 服务器若同意,则发回 DHCP 确认报文
- 这样
DHCP客户就得到了新的租用期
② DHCP 服务器若不同意,则发回 DHCP 否认报文
-
这时
DHCP客户必须立即停止使用之前租用的IP地址并重新发送
DHCP发现报文来重新申请IP地址
③ DHCP 服务器若未作出响应,则在租用期过了
87.5
%
87.5\%
87.5%
-
DHCP客户必须重新发送DHCP请求报文然后继续等待
DHCP服务器可能做出的响应
若DHCP 服务器若未作出响应,则当租用期到期后
-
DHCP客户必须立即停止使用之前租用的IP地址并重新发送
DHCP发现报文来重新申请IP地址
DHCP 客户可以随时提前终止 DHCP 服务器所提供的租用期,
- 这时只需要向
DHCP服务器发送DHCP释放报文段即可

注意:DHCP 服务器再给 DHCP 客户挑选 IP 地址时,使用 ARP 来确保所挑选的 IP 地址未被网络中其他主机占用
- 在
DHCP客户在使用IP地址之前也会使用ARP来检测该IP地址是否被网络中其他主机占用
综上:

3、DHCP中继代理

该网络中的主机广播发送 DHCP 发现报文,但该广播报文不会被路由器转发,而是丢弃!

解决办法

当该路由器收到广播的 DHCP 发现报文后,会单播转发给 DHCP 服务器

使用中继代理的原因:
- 并不愿意在每一个网络上都设置一个
DHCP服务器,因为这样会使DHCP服务器的数量太多
4、小结



















