本文引用图片均来自 高军: 计算机网络
假设有如下网络,为了使两台主机联通互联网我们需要根据其所处的网络环境为其手动
设定IP地址、子网掩码等信息,这些步骤繁琐且容易出错,当主机数量大时几乎不可能由人工完成
为了解决上述问题,动态主机配置协议 DHCP(Dynamic Host Configuration Protocol)
应运而生。DHCP服务器拥有一批
可以分配的IP地址
及相应的网络信息,主机可以使用DHCP协议自动
地从DHCP服务器中获取IP地址等网络信息以联通互联网
DHCP协议属于应用层
,使用运输层的UDP服务
,DHCP报文在运输层会被封装成UDP报文。DHCP服务进程
默认使用67号端口
,客户进程
则使用68号端口
以下举例说明DHCP工作流程:
1. 发现报文:
首先主机开机后自动开启DHCP客户进程,DHCP客户进程向网络广播DHCP发现报文
报文中包含事务ID
和主机的MAC地址
。报文的源地址是0.0.0.0
,因为此时主机还没有
IP地址。目的地址是广播地址255.255.255.255
,因为主机并不知道网络上哪个是DHCP服务器
发现报文是广播报文,网络上的所有主机都会收到报文。对于非DHCP服务器
的主机,其并没有监听67号端口,该报文会被直接丢弃
。对于DHCP服务器
,其运行的服务进程一直监听着67号端口,因此它会接收
报文并进行处理
2. 提供报文:
DHCP服务器收到发现报文后首先根据其中的MAC地址
查找数据库看是否有相关的配置信息,如果有则使用库中的信息
构建DHCP提供报文
,否则使用默认配置信息
构建DHCP提供报文
报文中包含事务ID、IP地址和子网掩码
等信息。报文的源地址是DHCP服务器的地址,而目的地址
则为广播地址
,这是因为此时的客户主机仍然
没有IP地址
提供报文是广播报文,网络上的所有主机都会收到报文。对于DHCP服务器
,其并没有监听68端口,该报文会被直接丢弃
。对于非DHCP服务器的主机
,其运行的DHCP客户进程一直监听着68端口,因此它会接收报文并根据
报文中的事务ID
来判断该报文是否是自己请求的相关报文
DHCP服务器从地址池
中挑选IP地址时会使用ARP协议
来确保该IP地址未被网络中其他主机占用
3. 请求报文:
在本例中DHCP客户会收到两个DHCP提供报文,一般地,客户会选择报文先到达的那个服务器并向其发送DHCP请求报文
报文中包含事务ID、自身MAC地址、接受租约中的IP地址
等信息。报文的源地址仍然为0.0.0.0
,因为此时客户机才从众多DHCP服务器中选择了一个作为自身的DHCP服务器,客户机得先征得服务器同意
才能使用提供报文中的IP地址。报文的目的地址
仍为广播地址
,这是因为使用广播地址客户机就不必向
每一个DHCP服务器单独
发送报文告知是否选择了其作为服务器。其他DHCP服务器收到广播的请求报文后发现客户并没有选择自己,那么服务器会收回
此前在提供报文中分配的IP地址和删除
租约记录
4. 确认报文:
DHCP服务器接受该请求则会返回DHCP确认报文
,确认报文中同样包含事务ID,分配的IP地址
等信息
报文的源地址为服务器自身IP地址,目的地址
仍为广播地址
,这是因为客户机此时仍然没有IP地址
客户机收到确认报文后会使用ARP协议
再次确认DHCP服务器提供的IP地址是否被占用
,如果地址被占用则向DHCP服务器发送谢绝报文
以撤销地址租约并重新发送发现报文
,如果未被占用则客户机正式使用该IP地址与其他主机通信
5. 续租与停租:
当租期过了50%
,客户机需要向DHCP服务器发送请求报文来更新租用期:
- 服务器
同意
请求则返回确认报文
,此时客户的IP地址租期得到更新
- 服务器
不同意
则返回否认报文
,此时客户必须马上停止
使用租借的IP地址并重新发送发现报文
来申请新的IP地址 - 服务器
无响应
,客户机会在租期过去87.5%
时重新发送请求报文
并等待服务器响应
如果服务器一直没有响应,那么在租期到期后
客户必须马上停止
使用租借到的IP地址并重新发送发现报文
来申请新的IP地址
在租期时间范围内,客户可以随时提前终止
租期,此时客户只需向DHCP服务器发送DHCP释放报文
另外,在很多时候我们并不愿意
在每一个网络中都配置一个DHCP服务器,因为小网络实在太多。但是DHCP发现报文是广播报文,路由器不转发
广播报文,这导致主机无法访问位于其他网络的DHCP服务器。为解决上述问题,DHCP中继代理
的概念应运而生
在路由器上配置DHCP服务器的地址
使其成为中继代理
,位于不同网络
的主机便可以和DHCP服务器通信