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
服务器的数量太多