蛮荆

网络基础: DHCP 是如何工作的?

2017-09-16

概述

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是为主机(客户端)自动配置 IP 地址、子网、DNS 服务器、默认网关等信息的网络协议。

虽然 DHCP 依赖于其他协议(如 ARP、UDP 和 IP),但它自身不属于任何一层,而是工作在应用层。

当客户端尝试自动从 DHCP服务器 (例如路由器) 处获取 IP 地址时,如果手动设置每台计算机的 IP 地址,过程会非常麻烦,而且必须考虑到不能分配重复的IP 地址,而使用 DHCP 则可以指定分配的 IP 地址所在的范围,并且自动完成在该范围内的 IP 地址分配,同时也可以自动为默认网关分配地址。

Mac 自动配置 IP

Windows 自动配置 IP

除了技术原因之外,DHCP 的最大价值在于帮助 “非专业用户” 提供自动化管理的操作体验,想象一下:有多少用户知道 IP 地址、子网掩码、网关等一系列专业术语并且可以完成手动配置呢?

三个功能

几乎所有类型的路由器 (包括家用路由器) 都支持 DHCP, 路由器的 DHCP 功能主要分为三个方面:

  1. 作为 DHCP 服务器为客户端分配 IP 地址
  2. 作为 DHCP 客户端从其他 DHCP 服务器中获取 IP 地址
  3. 在 DHCP 服务器和客户端之间完成中继广播消息

当一台新设备连接到家用路由器时,上述三个功能都会执行到。

连接过程

图片来源: 图解网络硬件(三轮贤一)

  1. 客户端在网段内广播 DISCOVER 消息
  2. DHCP 服务器在网络内广播 OFFER 消息
  3. 客户端在网络内广播 REQUEST 消息
  4. 在接收 ACK 消息后,客户端就能使用所分配的 IP 地址(10.1.1.5)

下面展开来说下这个过程中的一些细节:

  • 假设主机 A(客户端)最开始没有 IP 地址以及其它信息,那么就需要先使用 DHCP 来获取
  • 主机生成一个 DHCP 请求报文,并将这个报文放入: 目的端口 67源端口 68 的 UDP 报文段中
  • 将该报文段放入: 广播 IP 目的地址(255.255.255.255)源 IP 地址(0.0.0.0) 的 IP 数据报中
  • 将该数据报放入 MAC 帧中,帧目的地址 FF:FF:FF:FF:FF:FF,通过二层交换机广播到所有连接的设备
  • 连接在交换机的 DHCP 服务器 (也可以是连接到光猫上的家用路由器) 收到广播帧之后,不断地向上分解得到 IP 数据报、UDP 报文段、DHCP 请求报文,之后生成 DHCP ACK 报文,该报文包含以下信息:IP 地址、DNS 服务器的 IP 地址、默认网关路由器的 IP 地址和子网掩码,然后将该报文被放入 UDP 报文段中,再把 UDP 报文段放入 IP 数据报中,最后放入 MAC 帧中
  • Mac 帧的目的地址是请求主机 A 的 MAC 地址,因为交换机具有自学习能力,之前主机 A 发送广播帧之后,顺带就记录了 MAC 地址和其转发接口的 交换表项,因此现在交换机知道应该向哪个接口发送该 Mac 帧
  • 主机收到 Mac 帧后,不断分解得到 DHCP 报文,之后就配置它的 IP 地址、子网掩码和 DNS 服务器的 IP 地址,并在其 IP 转发表中安装默认网关

DHCP 请求报文示例

静态分配

手动分配静态 IP 地址

手动配置好 IP 地址之后,依然会执行上面的连接过程,只不过发起的请求报文不同而已。

例如主机 A 将自己的 IP 地址配置为 192.168.20.10, 那么发起的 DHCP 请求报文中的 请求 IP 地址 就是 192.168.20.10, 剩下的连接过程和动态获取 IP 地址过程一样。


地址分配

分配顺序

DHCP 服务器需要从 IP 地址池中为客户端分配一个 IP 地址,具体的顺序如下:

  1. DHCP 服务器上已配置,指定客户端的 MAC 地址静态绑定的 IP 地址
  2. 客户端发送的 DISCOVER 请求报文中指定的 IP 地址
  3. DHCP 服务器的 IP 地址池中查找 “Expired” 状态的 IP 地址,也就是租期到期的 IP 地址
  4. DHCP 服务器的 IP 地址池中查找 “Idle” 状态的 IP 地址,也就是空闲的 IP 地址
  5. 如果上述步骤均未找到可分配的 IP 地址,DHCP 服务器地址池依次回收租期到期状态的(Expired)和处于冲突状态(Conflict)的 IP 地址,回收后如果找到可用的 IP 地址,分配给客户端,否则,客户端等待 DHCP 服务器应答超时后,重新发送 DISCOVER 请求报文来申请 IP 地址

静态 IP

对于客户端申请静态 IP (已经指定了 IP 地址) 的请求报文,DHCP 服务器收到请求之后,会先检查该 IP 是否已经分配,如果已经分配给其他主机,直接回复 NACK 消息拒绝。

DHCP 服务器检测 IP 是否已经分配

除了客户端申请静态 IP 地址外,网络管理员也可以通过 DHCP 服务器静态分配机制来分配 IP, 避免客户端手动配置错误的情况。

确认分配

那么如何确认指定的 IP 是否已经分配了呢?DHCP 服务器只需要 ping 一下申请的 IP 地址即可。

对于申请动态 IP (没有指定了 IP 地址) 的请求报文,DHCP 服务器只需要找一个没有使用的 IP 地址返回就可以了。


地址冲突

假设当前主机 A 已经通过 DHCP 获取到 IP: 192.168.20.10。

那么当主机 A 休眠时,无法回复 Ping,DHCP 服务器就会认为该 IP 地址没有被使用,于是将 192.168.20.10 分配给其他主机,等到主机 A 休眠结束后,IP 地址就与主机 B 发生了冲突。

如果主机 A 是关机而非休眠的话,是否会产生 IP 地址冲突呢?

不会,因为当主机 A 开机时,首先要完成 TCP/IP 模块的初始化,在配置其静态 IP 192.168.20.10 时,会发三次 ARP 消息 (目的: 确认有没有主机在使用 IP 192.168.20.10),如果有其他主机使用了这个 IP, 主机 A 就会收到对应的回复,也就不会继续使用这个 IP 地址了。


地址回收

DHCP 服务器的 IP 地址池中会指定 IP 地址的租期,如果客户端发送的 DISCOVER 报文中携带了期望租期,服务器会将 客户端的期望租期 与 分配 IP 的租期 进行比较,选择其中时间较短的租期分配给客户端。

1. 租期到期和续期

如果客户端希望租期到期后,继续使用当前的 IP 地址,需要更新 IP 地址的租期。

  1. 当客户端 IP 地址租期剩余 50% 时,会以单播的方式向 DHCP 服务器发送 REQUEST 请求报文,请求更新 IP 地址租期,如果收到 ACK 报文,租期更新成功(即租期重新从 0 开始计算),如果收到 NAK 报文,则向 DHCP 服务器重新发送 DISCOVER 报文请求新的 IP 地址
  2. 当客户端 IP 地址租期剩余 87.5% 时,如果还未收到 DHCP 服务器的应答报文,客户端会以广播的方式向 DHCP 服务器发送 REQUEST 报文 (为什么这里是广播呢? 因为收不到 DHCP 服务器的应答,说明 DHCP 服务器可能已经发生变更),请求更新 IP 地址租期,如果收到 ACK 报文,租期更新成功(即租期重新从 0 开始计算),如果收到 NAK 报文,则向 DHCP 服务器重新发送 DISCOVER 报文请求新的 IP 地址
  3. 如果租期到期时,都没有收到 DHCP 服务器的应答,客户端停止使用当前 IP 地址,重新发送 DISCOVER 报文请求新的 IP 地址

2. 手动释放

客户端在租期到期之前,如果不想再使用当前的 IP 地址 (例如笔记本电脑从宿舍移动到了教室),客户端会向 DHCP 服务器发送 RELEASE 请求报文,通知 DHCP 服务器释放 IP 地址的租期,便于该 IP 地址后续被其他客户端继续使用。

3. 超时和断线

如前文中提到的,当客户端因为休眠和断线 (例如网线被拔掉) 而无法响应 DHCP 服务器的检测时,DHCP 服务器将回收该客户端的 IP 地址。


Reference

转载申请

本作品采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,商业转载请联系作者获得授权。