DHCP协议工作流程分析

1.前言

DHCP,Dynamic Host Configuration Protocol,动态主机配置协议,简单来说就是主机获取IP地址的过程,属于应用层协议。DHCP采用UDP68(客户端)67(服务器)端口进行通信。

2.DHCP工作过程

为了动态获取并使用一个合法的IP地址,需要经历以下几个阶段:

  1. 发现阶段:即 DHCP 客户端寻找 DHCP 服务器的阶段。
  2. 提供阶段:即 DHCP 服务器提供 IP 地址的阶段。
  3. 选择阶段:即 DHCP 客户端选择某台 DHCP 服务器提供的 IP 地址的阶段。
  4. 确认阶段:即 DHCP 服务器确认所提供的 IP 地址的阶段。

IP地址的动态获取过程如图2所示,下面将详细介绍每个阶段的工作过程。

2.1 发现阶段

在发现阶段,DHCP客户端通过发送DHCP-DISCOVER报文来寻找DHCP服务器。由于DHCP服务器的IP地址对于客户端来说是未知的,所以DHCP客户端以广播方式发送DHCP-DISCOVER报文。所有收到DHCP-DISCOVER报文的DHCP服务器都会发送回应报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置。

2.2 提供阶段

网络中接收到DHCP-DISCOVER报文的DHCP服务器,会选择一个合适的IP地址,连同IP地址租约期限和其他配置信息(如网关地址,域名服务器地址等)一同通过DHCP-OFFER报文发送给DHCP客户端。

DHCP服务器通过地址池保存可供分配的IP地址和其他配置信息。当DHCP服务器接收到DHCP请求报文后,将从IP地址池中取得空闲的IP地址及其他的参数,发送给DHCP客户端。

DHCP服务器为客户端分配IP地址的优先次序如下:

  1. 与客户端 MAC 地址或客户端 ID 静态绑定的 IP 地址;
  2. DHCP 服务器记录的曾经分配给客户端的 IP 地址;
  3. 客户端发送的 DHCP-DISCOVER 报文中 Option 50 字段指定的 IP 地址;
  4. 在 DHCP 地址池中,顺序查找可供分配的 IP 地址,最先找到的 IP 地址;
  5. 如果未找到可用的 IP 地址,则依次查询租约过期、曾经发生过冲突的 IP 地址,如果找到则进行分配,否则将不予处理。

DHCP服务器为客户端分配IP地址时,服务器首先需要确认所分配的IP没有被网络上的其他设备所使用。DHCP服务器通过发送ICMP Echo Request(ping)报文对分配的IP进行探测。如果在规定的时间内没有应答,那么服务器就会再次发送ping报文。到达规定的次数后,如果仍没有应答,则所分配的IP地址可用。否则将探测的IP地址记录为冲突地址,并重新选择IP地址进行分配。

2.3 选择阶段

如果有多台DHCP服务器向DHCP客户端回应DHCP-OFFER报文,则DHCP客户端只接受第一个收到的DHCP-OFFER报文。然后以广播方式发送DHCP-REQUEST请求报文,该报文中包含Option 54(服务器标识选项),即它选择的DHCP服务器的IP地址信息。

以广播方式发送DHCP-REQUEST请求报文,是为了通知所有的DHCP服务器,它将选择Option 54中标识的DHCP服务器提供的IP地址,其他DHCP服务器可以重新使用曾提供的IP地址。

2.4 确认阶段

收到DHCP客户端发送的DHCP-REQUEST请求报文后,DHCP服务器根据DHCP-REQUEST报文中携带的MAC地址来查找有没有相应的租约记录。如果有,则发送DHCP-ACK报文作为应答,通知DHCP客户端可以使用分配的IP地址。

DHCP客户端收到DHCP服务器返回的DHCP-ACK确认报文后,会以广播的方式发送免费ARP报文,探测是否有主机使用服务器分配的IP地址,如果在规定的时间内没有收到回应,客户端才使用此地址。否则,客户端会发送DHCP-DECLINE报文给DHCP服务器,通知DHCP服务器该地址不可用,并重新申请IP地址。

如果DHCP服务器收到DHCP-REQUEST报文后,没有找到相应的租约记录,或者由于某些原因无法正常分配IP地址,则发送DHCP-NAK报文作为应答,通知DHCP客户端无法分配合适IP地址。DHCP客户端需要重新发送DHCP-DISCOVER报文来请求新的IP地址。

3. DHCP报文格式

DHCP报文格式如下图所示:

DHCP报文的各个字段的具体说明如下:
  • op:报文的操作类型,分为请求报文和响应报文,1 为请求报文;2 为响应报文。具体的报文类型在 option 字段中标识。
  • htype:硬件地址类型。
  • hlen:硬件地址长度。系统目前只对以太网支持,硬件地址长度固定为 6。
  • hops:DHCP 报文经过的 DHCP 中继的数目。DHCP 请求报文每经过一个DHCP 中继,该字段就会增加 1。
  • xid:由客户端软件产生的随机数,用于匹配请求和应答报文。
  • secs:客户端进入 IP 地址申请进程的时间或者更新 IP 地址进程的时间;由客户端软件根据情况设定。目前没有使用,固定为 0。
  • flags:标志字段。第一个比特为广播响应标识位,用来标识 DHCP 服务器响应报文是采用单播还是广播方式发送,0 表示采用单播方式,1 表示采用广播方式。其余比特保留不用。
  • ciaddr:DHCP 客户端的 IP 地址。
  • yiaddr:DHCP 服务器分配给客户端的 IP 地址。
  • siaddr:DHCP 客户端获取 IP 地址等信息的服务器 IP 地址。
  • giaddr:DHCP 客户端发出请求报文后经过的第一个 DHCP 中继的 IP 地址。
  • chaddr:DHCP 客户端的硬件地址。
  • sname:DHCP 客户端获取 IP 地址等信息的服务器名称。
  • file:DHCP 服务器为 DHCP 客户端指定的启动配置文件名称及路径信息。
  • options:可选变长选项字段,包含报文的类型、有效租期、DNS 服务器的IP 地址、WINS 服务器的 IP 地址等配置信息。

4.使用Wireshark抓包分析

通过Wireshark抓取DHCP获取IP过程的数据报文:

  1. 开Wireshark抓包
  2. PC当前已有IP,使用cmd命令释放IP(ipconfig /release),并重新获取IP(ipconfig /renew
3. 停止抓包,使用bootp过滤报文。
4. 根据DHCP报文格式分析抓取的报文,这里举例DHCP Offer报文的分析,如下:

5.参考资料

  1. DHCP技术白皮书:
    http://www.h3c.com/cn/d_200802/333443_30003_0.htm#download

  2. DHCP协议原理及其实现流程:
    https://blog.csdn.net/wuruixn/article/details/8282554

  3. DHCP完整过程详解及Wireshark抓包分析:
    https://bbs.huaweicloud.com/blogs/158906

  4. DHCP协议原理及抓包分析:
    https://blog.csdn.net/andy_93/article/details/78238931

猜你喜欢

转载自blog.csdn.net/ZHONGCAI0901/article/details/109137853