计算机网络 (17) 应用层-DHCP协议

313 阅读5分钟

本文引用图片均来自 高军: 计算机网络

假设有如下网络,为了使两台主机联通互联网我们需要根据其所处的网络环境为其手动设定IP地址、子网掩码等信息,这些步骤繁琐且容易出错,当主机数量大时几乎不可能由人工完成

image.png

为了解决上述问题,动态主机配置协议 DHCP(Dynamic Host Configuration Protocol)应运而生。DHCP服务器拥有一批可以分配的IP地址及相应的网络信息,主机可以使用DHCP协议自动地从DHCP服务器中获取IP地址等网络信息以联通互联网

image.png

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号端口,因此它会接收报文并进行处理

image.png

2. 提供报文:

DHCP服务器收到发现报文后首先根据其中的MAC地址查找数据库看是否有相关的配置信息,如果有则使用库中的信息构建DHCP提供报文,否则使用默认配置信息构建DHCP提供报文

报文中包含事务ID、IP地址和子网掩码等信息。报文的源地址是DHCP服务器的地址,而目的地址则为广播地址,这是因为此时的客户主机仍然没有IP地址

提供报文是广播报文,网络上的所有主机都会收到报文。对于DHCP服务器,其并没有监听68端口,该报文会被直接丢弃。对于非DHCP服务器的主机,其运行的DHCP客户进程一直监听着68端口,因此它会接收报文并根据报文中的事务ID来判断该报文是否是自己请求的相关报文

DHCP服务器从地址池中挑选IP地址时会使用ARP协议来确保该IP地址未被网络中其他主机占用

image.png

3. 请求报文:

在本例中DHCP客户会收到两个DHCP提供报文,一般地,客户会选择报文先到达的那个服务器并向其发送DHCP请求报文

报文中包含事务ID、自身MAC地址、接受租约中的IP地址等信息。报文的源地址仍然为0.0.0.0,因为此时客户机才从众多DHCP服务器中选择了一个作为自身的DHCP服务器,客户机得先征得服务器同意才能使用提供报文中的IP地址。报文的目的地址仍为广播地址,这是因为使用广播地址客户机就不必向每一个DHCP服务器单独发送报文告知是否选择了其作为服务器。其他DHCP服务器收到广播的请求报文后发现客户并没有选择自己,那么服务器会收回此前在提供报文中分配的IP地址和删除租约记录

image.png

4. 确认报文:

DHCP服务器接受该请求则会返回DHCP确认报文,确认报文中同样包含事务ID,分配的IP地址等信息

报文的源地址为服务器自身IP地址,目的地址仍为广播地址,这是因为客户机此时仍然没有IP地址

客户机收到确认报文后会使用ARP协议再次确认DHCP服务器提供的IP地址是否被占用,如果地址被占用则向DHCP服务器发送谢绝报文以撤销地址租约并重新发送发现报文,如果未被占用则客户机正式使用该IP地址与其他主机通信

image.png

5. 续租与停租:

当租期过了50%,客户机需要向DHCP服务器发送请求报文来更新租用期:

  1. 服务器同意请求则返回确认报文,此时客户的IP地址租期得到更新
  2. 服务器不同意则返回否认报文,此时客户必须马上停止使用租借的IP地址并重新发送发现报文来申请新的IP地址
  3. 服务器无响应,客户机会在租期过去87.5%时重新发送请求报文并等待服务器响应

如果服务器一直没有响应,那么在租期到期后客户必须马上停止使用租借到的IP地址并重新发送发现报文来申请新的IP地址

在租期时间范围内,客户可以随时提前终止租期,此时客户只需向DHCP服务器发送DHCP释放报文

image.png

另外,在很多时候我们并不愿意在每一个网络中都配置一个DHCP服务器,因为小网络实在太多。但是DHCP发现报文是广播报文,路由器不转发广播报文,这导致主机无法访问位于其他网络的DHCP服务器。为解决上述问题,DHCP中继代理的概念应运而生

在路由器上配置DHCP服务器的地址使其成为中继代理,位于不同网络的主机便可以和DHCP服务器通信

image.png

参考文献