DHCP 协议详解

文章目录

  • [1 DHCP 作用](#1 DHCP 作用)
  • [2 DHCP 的工作机制](#2 DHCP 的工作机制)
  • [3 DHCP 中继代理](#3 DHCP 中继代理)
  • [4 DHCPv4](#4 DHCPv4)
    • [1_DHCP 报文字段解析](#1_DHCP 报文字段解析)
    • [2_DHCP 可选项字段](#2_DHCP 可选项字段)
  • [5 DHCPv6](#5 DHCPv6)

1 DHCP 作用

逐一为每台主机设置 IP 地址是非常烦琐的事情。

尤其是在使用移动笔记本计算机、智能终端及平板电脑等设备时,每移动到一个新的地方,都需要重新设置 IP 地址。

于是,为了实现 IP 地址的自动设置、IP 地址分配的统一管理,DHCP(Dynamic Host Configuration Protocol)应运而生,如下图所示。

有了 DHCP 计算机只要连接到网络就可以进行 TCP/IP 通信。

也就是说,DHCP 即插即用变成可能。

指只要物理上一连通,无须专门设置就可以直接使用物理设备。

而 DHCP 不仅在 IPv4 中可以使用,在 IPv6 中也可以使用。

2 DHCP 的工作机制

使用 DHCP 之前,首先要架设一台 DHCP 服务器(很多时候用该网段的路由器充当 DHCP 服务器)。

然后将 DHCP 所要分配的 IP 地址设置到服务器上。

此外,还需要将相应的子网掩码、路由控制信息及 DNS 服务器的地址等设置到服务器上。

关于从 DHCP 中获取 IP 地址的流程,以下图为例进行简单说明,主要分为两个阶段。

DHCP 的确认之所以分两个阶段,是为了确保在架设了多台 DHCP 服务器的环境中也能正常工作。

第一阶段总共分为两步:

  • 1:要求设置 IP 地址和子网掩码。
  • 2:通知可以使用的网络设置。

在发送 DHCP 发现包与 DHCP 请求包时,DHCP 客户端的 IP 地址尚未确定。

因此,DHCP 发现包的目的地址为广播地址 255.255.255.255,源地址则为 0.0.0.0(表示未知)。

DHCP 在分配 IP 地址时,有两种方法(两种方法可以并用):

  1. 由 DHCP 服务器在特定的 IP 地址池中选出一个进行分配。
  2. 针对 MAC 地址分配一个固定的 IP 地址。

由此,DHCP 的网络设置结束,可以进行 TCP/IP 通信。不需要 IP 地址时,可以发送 DHCP 解除包。

另外,DHCP 的设置中通常会有一个限制时间的设定。DHCP 客户端可以在这个时限之前发送 DHCP 请求包,通知想延长这个时限。

使用 DHCP 时,如果 DHCP 服务器遇到故障,将导致无法自动分配 IP 地址,从而导致网段内所有主机之间无法进行 TCP/IP 通信。

为了避免此类问题的发生,通常人们会架设两台或两台以上的 DHCP 服务器。

不过,当启动多台 DHCP 服务器时,由于每台 DHCP 服务器内部都只记录自身 IP 地址的分配信息,并不知道其他服务器的 IP 地址的分配情况,因此可能会导致某台服务器分配的 IP 地址已被其他服务器分配出去,造成 IP 地址冲突。

为了避免地址重复,应将相互间没有重叠的 IP 地址范围分配给不同的 DHCP 服务器。

为了检查所要分配的 IP 地址及已经分配了的 IP 地址是否可用,DHCP 服务器或 DHCP 客户端必须具备以下功能:

  • DHCP 服务器:在分配 IP 地址前发送 ICMP 回送请求包,确认没有返回应答。
  • DHCP 客户端:针对从 DHCP 获得的 IP 地址发送 ARP 请求包,确认没有返回应答。

在获得 IP 地址之前,做这样的处理可能会耗一点儿时间,但是可以安全地进行 IP 地址分配。

两个请求过程总共对应四个状态分别是: DISCOVER、OFFER、REQUEST、ACK。

DISCOVER 状态对应的 DHCP 发现包抓包如下:

OFFER 状态对应的 DHCP 提供包报文如下:

REQUEST 状态对应的 DHCP 请求包如下:

DHCP 确认应答包报文如下:

另外,DHCP 消息类型不仅仅是这四种,还存在着 PACK、PNAK 等。

DHCP 是基于 UDP 广播的,使用 67、68 两个端口号。

3 DHCP 中继代理

家庭网络大多数只有一个以太网(无线LAN)网段,与其连接的主机不会太多。

因此,只要有一台 DHCP 服务器就足以应对 IP 地址分配的需求,而大多数情况下由宽带路由器充当 DHCP 的角色。

相比之下,在企业或学校等较大规模组织机构的网络环境中,一般会有多个以太网(无线 LAN)网段。

在这种情况下,若要为每个网段都设置 DHCP 服务器,那将会是一个巨大的工程。

即使路由器可以充当 DHCP 的角色,如果网络中有 100 个路由器,就要为 100个 路由器设置它们各自可分配的 IP 地址的范围,并对这些范围进行后续的变更维护,这将是一个极其耗时和难以管理的工作"。

DHCP 服务器分配的 IP 地址范围,有时会随服务器或打印机等固定 IP 设备的增减而发生变化。

也就是说,将 DHCP 服务器分设到各个路由器上,于管理和运维都不是一件有益的事。

因此,在这种网络环境中,往往需要将 DHCP 统一管理。

具体方法可以使用 DHCP 中继代理来实现,如下图所示。

有了 DHCP 中继代理以后,对不同网段的 IP 地址分配可以由一台 DHCP 服务器统一进行管理和运维。

这种方法使得在每个网段架设一台 DHCP 服务器被取代,只需在每个网段设置一个 DHCP 中继代理即可。

DHCP 中继代理大多数为路由器,不过也有在主机中安装某些软件得以实现的情况。

它可以设置 DHCP 服务器的 IP 地址,从而可以在 DHCP 服务器上为每个网段分配 IP 地址的范围。

DHCP 客户端会向 DHCP 中继代理发送 DHCP 请求包,而 DHCP 中继代理在收到广播包以后再以单播的形式发给 DHCP 服务器。

DHCP 服务器收到该数据包以后再向 DHCP 中继代理返回应答,并由 DHCP 中继代理将此数据包转发给 DHCP 客户端。

DHCP 请求包中包含发出请求的主机的 MAC 地址。

DHCP 中继代理正是利用 MAC 地址将数据包返回给 DHCP 客户端。

由此,DHCP 客户端与 DHCP 服务器即使不在同一数据链路上,也可以实现统一分配和管理 IP 地址。

4 DHCPv4

根据 RFC 2131 中的内容描述,DHCP 支持三种 IP 地址分配方式:

  1. 自动分配:即 DHCP 为设备分配一个永久 IP 地址。
  2. 动态分配:DHCP 会为客户端分配一个时间有限的 IP 地址。
  3. 手动分配:客户端的 IP 地址由网络管理员分配,DHCP 仅仅起到一个告知客户端的作用。

动态分配是三种地址分配机制中唯一允许自动重用客户端不再需要的地址的机制。

因此,动态分配特别适用于为仅临时连接到网络的客户端分配地址,或者在不需要永久 IP 地址的客户端组之间共享有限的 IP 地址池。

报文格式如下:

DHCP 没有改变 BOOTP 的报文格式,仍然沿用 BOOTP 的固定头部,所以 DHCP 的创新几乎全部放在 options 字段,这也是协议扩展的经典方式(固定头部 + TLV 扩展区)。

Bootstrap Protocol:静态网络启动协议,只能分配 IP 地址、TFTP server 、boot file,所有映射都要管理员手工配置。

TLV:Type -- Length -- Value,一种自描述的数据编码格式,不需要外部结构定义,接收方看到 Type 就知道怎么解析,看到 Length 就知道读多少字节。

1_DHCP 报文字段解析

Message Type

消息类型,该字段长度为 1 字节,沿用 BOOTP 的字段,有两种取值:

  • 1 = BOOTREQUEST;
  • 2 = BOOTREPLY;

也就是说此字段的作用是区分请求报文和应答报文。

Hardware address type

物理地址类型,该字段长度为 1 字节,通常情况下 1 = Ethernet。

用于告诉服务器 Client hardware address 字段里的地址类型是什么。

Hardware Address Length

物理地址长度,该字段长度为 1 字节,用于告诉服务器 Client hardware address 字段里的有效地址长度。

例如:Ethernet = 6,不能假设一定是 6。

hops

跳数,1 字节,Relay Agent 使用,客户端发送时为 0,每经过一个中继 +1。

Transaction ID

传输 ID,该字段长度为 4 字节,由客户端生成,服务器原样返回。

用于匹配整个 DHCP 过程中的请求与响应。

Sencods elapsed

已过秒数,该字段长度为 2 字节,表示由客户端从开始获取地址到办理续期所经过的时间(一般不使用)。

Flags

总占 2 字节,第一位表示客户端是否能接受单播,其余为保留位。

Client IP address

客户端 IP 地址,4 字节,仅在客户端处于特定状态且能响应 ARP 请求时填写,不然填 0。

Your IP address

服务器分配给客户端的 IP 地址,4 字节,在 Offer 和 ACK 时会填写服务器分配给客户端的 IP 地址。

Next Server IP address

下一服务 IP 地址,该字段长度为 4 字节。

指示客户端要使用的下一 DHCP 服务器的 IP 地址,由服务器在 OFFER 和 ACK 中返回。

Relay Agent IP address

如果存在中继代理,则为中继代理的 IP 地址,服务器看到 ≠ 0 时,必须单播回 Relay Agent IP address 不直接回客户端。

Client Hardware Addres:

客户端物理地址,长度为 16 字节,一般为 Ethernet 地址,与物理地址长度和类型字段配合使用。

为 Ethernet 地址时,前 6 为是 MAC 地址,其余为填充部分。

server host name 与 file:

历史字段,不使用。

options

可选项参数字段,是 DHCP 实现的关键。

2_DHCP 可选项字段

DHCP 可选项的文档为 RFC 2132,所有常见的可选项种类如下表:

Vendor Extensions:

Code Name 作用(RFC 定义语义)
0 Pad 填充字节,用于对齐
255 End 标记选项列表结束
43 Vendor Specific Information 厂商特定信息,格式由厂商定义

IP Layer Parameters per Host:

Code Name 作用
1 Subnet Mask 指定客户端子网掩码
2 Time Offset 与 UTC 的时间偏移(秒)
3 Router 默认网关列表
4 Time Server RFC 868 时间服务器
5 Name Server IEN-116 名称服务器
6 Domain Name Server DNS 服务器列表
7 Log Server MIT-LCS UDP 日志服务器
8 Cookie Server RFC 865 Cookie 服务器
9 LPR Server RFC 1179 打印服务器
10 Impress Server Imagen Impress 服务器
11 Resource Location Server RFC 887 资源定位服务器
12 Host Name 客户端主机名
13 Boot File Size 启动文件大小(512字节块)
14 Merit Dump File 客户端 dump 文件路径
15 Domain Name 客户端域名
16 Swap Server 交换文件服务器
17 Root Path 根路径(NFS)
18 Extensions Path 扩展文件路径
19 IP Forwarding 是否启用 IP 转发
20 Non-Local Source Routing 是否允许源路由
21 Policy Filter 策略过滤
22 Maximum Datagram Reassembly Size 最大重组报文长度
23 Default IP TTL 默认 TTL
24 Path MTU Aging Timeout Path MTU 老化时间
25 Path MTU Plateau Table MTU 平台值表
26 Interface MTU 接口 MTU
27 All Subnets are Local 是否所有子网本地
28 Broadcast Address 广播地址
29 Perform Mask Discovery 是否执行掩码发现
30 Mask Supplier 是否提供掩码
31 Perform Router Discovery 是否执行路由发现
32 Router Solicitation Address 路由请求地址
33 Static Route 静态路由

DHCP Extensions(核心):

Code Name 作用
50 Requested IP Address 客户端请求的 IP
51 IP Address Lease Time 租约时间(秒)
52 Option Overload 指示 file/sname 也承载选项
53 DHCP Message Type DHCP 报文类型
54 Server Identifier DHCP 服务器标识
55 Parameter Request List 客户端请求的参数列表
56 Message 错误或状态信息
57 Maximum DHCP Message Size 客户端可接受最大报文
58 Renewal (T1) Time Value 租约续约时间
59 Rebinding (T2) Time Value 租约重绑定时间
60 Vendor Class Identifier 厂商类别标识
61 Client Identifier 客户端标识

5 DHCPv6

DHCPv6 官方 RFC 文档为 RFC 8415,主要变化为不在使用 BOOTP 固定头部,简化了消息结构,可以更好的支持 IPv6:

客户端/服务端消息格式:

plain 复制代码
       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |    msg-type   |               transaction-id                  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      .                            options                            .
      .                 (variable number and length)                  .
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

中继/服务端消息格式:

plain 复制代码
       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |    msg-type   |   hop-count   |                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
      |                                                               |
      |                         link-address                          |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
      |                               |                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
      |                                                               |
      |                         peer-address                          |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
      |                               |                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
      .                                                               .
      .            options (variable number and length)   ....        .
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
相关推荐
代码改善世界4 小时前
【C语言】线性表之顺序表、单链表、双向链表详解及实现
c语言·网络·链表
嵌入式×边缘AI:打怪升级日志6 小时前
9.2.1 分析 Write File Record 功能(保姆级讲解)
java·开发语言·网络
天荒地老笑话么7 小时前
Bridged 与虚拟机扫描:合规边界与自测范围说明
网络·网络安全
TechubNews7 小时前
燦谷(Cango Inc)入局AI 資本重組彰顯決心
大数据·网络·人工智能·区块链
艾莉丝努力练剑8 小时前
【Linux:文件】进程间通信
linux·运维·服务器·c语言·网络·c++·人工智能
coding随想8 小时前
揭秘V8引擎的类型混淆漏洞:安全开发的警示与启示
网络·安全
隐退山林9 小时前
JavaEE初阶:网络编程
网络
The_Uniform_C@t210 小时前
PWN | 对CTF WIKI的复现+再学习 (第九期)
网络·学习·网络安全