计算机网络:应用层 —— 动态主机配置协议 DHCP
文章目录
- 什么是 DHCP?
- DHCP 的产生背景
- DHCP 的工作过程
- 工作流程
- 地址分配机制
- DHCP 中继代理
- 总结
什么是 DHCP?
动态主机配置协议(DHCP,Dynamic Host Configuration Protocol)是一种网络管理协议,用于自动分配IP地址及其他网络配置参数(如子网掩码、默认网关、DNS服务器地址等)给网络中的设备。它基于客户端/服务器架构,通过集中管理IP地址池,简化了网络设备的配置过程。
DHCP 协议允许网络管理员通过中央服务器来动态分配和管理 IP 地址以及其他网络配置参数,从而减少了网络管理的复杂性。

DHCP 的产生背景
在 DHCP 出现之前,网络管理员需要手动为每台设备配置 IP 地址,这种方式不仅繁琐,还容易导致 IP 地址冲突和资源浪费。随着网络规模的扩大和设备数量的增加,这种手动配置的方式已无法满足需求。因此,IETF 设计了 DHCP 协议,以实现动态、自动化的 IP 地址分配。
DHCP 的工作过程
DHCP 使用客户/服务器方式:
-
在
DHCP服务器上运行DHCP服务器进程,也可简称为DHCP服务器 -
在用户主机上运行
DHCP客户进程,也可简称为DHCP客户。
DHCP 是 TCP/IP 协议体系应用层中的协议,它使用运输层的 UDP 所提供的服务。DHCP报文在运输层会被封装成为 UDP用户数据报,DHCP 服务器使用的UDP端口是67,DHCP 客户使用的UDP端口是68,这两个 UDP 端口都是熟知端口。
封装有 DHCP 报文的 UDP 用户数据报,在网络层会被封装成 IP 数据报,然后再根据所使用的网络接口,封装成相应的数据链路层的帧进行发送,如封装为以太网帧。

工作流程
DHCP 的工作流程主要包括以下四个阶段:
-
发现阶段(DHCP Discover):客户端以广播方式发送
DHCP Discover报文,寻找可用的 DHCP 服务器。 -
提供阶段(DHCP Offer):服务器收到请求后,从地址池中选择一个可用的IP地址,并向客户端发送
DHCP Offer报文。 -
请求阶段(DHCP Request):客户端收到 Offer 后,选择一个服务器的 Offer,并发送
DHCP Request报文,请求确认分配的IP地址。 -
确认阶段(DHCP Ack):服务器确认客户端的请求,发送 DHCP Ack 报文,正式分配IP地址及其他配置信息。
这是一个四步的交互过程,包括客户端的广播请求、服务器的提供回应、客户端的确认地址和服务器的确认并更新数据库。

-
客户端广播请求(Discover)
-
当
DHCP客户端(如计算机、路由器等)启动时,它会在网络上广播一个 DHCP Discover 消息(因为主机现在并不知道网络中有哪几个DHCP服务器),请求可用的 IP 地址和其他网络配置参数。这个广播消息会被网络上的所有设备接收,但只有DHCP服务器会对此作出响应。 -
DHCP Discover消息报文封装有事务ID、DHCP 客户端的 MAC 地址等信息
-
-
DHCP服务器提供回应(Offer)
-
当 DHCP 服务器接收到客户端的
DHCP Discover广播后,它会从预定义的IP地址池中选择一个未使用的IP地址,根据其中封装的 DHCP 客户端的 MAC 地址实查找自己的数据库,看是否有针对该 MAC 地址的配置信息。如果有,则使用这些配置信息来构建并发送 DHCP 提供报文;则采用默认配置信息来构建并发送 DHCP 提供报文。并通过广播或单播方式向客户端发送一个 DHCP Offer 消息。
DHCP 服务器从自己的 IP 地址池中挑选待租用给主机的IP地址时,会使用ARP确保所选IP地址未被网络中其他主机占用。
-
这个
Offer消息中包含了分配的 IP 地址、子网掩码、地址租期、默认网关、DNS服务器地址等配置信息。 -
如果网络中存在多个 DHCP 服务器,客户端可能会收到多个
Offer消息。在这种情况下,客户端通常会选择第一个收到的Offer或根据其他标准(如服务器优先级)选择一个Offer。
-
-
DHCP客户端确认地址(Request)
-
客户端在收到
DHCP Offer后,DHCP 客户会根据 DHCP 提供报文中的事物 ID,来判断该报文是否是自己所请求的报文,然后发送一个 DHCP Request 消息给选定的 DHCP 服务器,表示它接受该服务器提供的IP地址和其他配置参数。这个
Request消息是一个广播消息(目的IP地址为广播地址),因为首先需要征得该服务器的同意,之后才能正式使用向该DHCP服务器租用的IP地址。DHCP 请求报文中封装有事物 ID、DHCP 客户端的 MAC 地址、接受的租约中的 IP 地址、提供此租约的 DHCP 服务器端的 IP 地址等信息。
-
-
DHCP服务器确认并更新数据库(Ack/Decline)
-
当 DHCP 服务器收到客户端的
DHCP Request消息后,它会发送一个 DHCP Ack 消息作为响应(目的IP地址为广播地址),确认客户端可以使用请求的IP地址和其他配置参数。这个Ack消息也会更新DHCP服务器的数据库,标记该 IP 地址已经被分配出去。 -
此时,
DHCP服务器仍会使用ARP检测所分配到的 IP 地址是否已被网络中其他主机占用,如果 DHCP 服务器提供的 IP 地址已经被其他客户端使用(由于某种原因),则服务器会发送一个 DHCP DECLINE 消息给客户端,撤销地址租约,表示IP地址分配失败,客户端需要重新发送DHCP Discover消息以获取新的IP地址。若未被占用,则可以使用租约中的IP地址与网络中其他主机通信了
-
地址分配机制
DHCP 提供了两种主要的地址分配机制:
-
动态分配:为客户端分配一个有使用期限的IP地址(租期)。租期到期前,客户端需要续租。这种方式适用于临时接入网络的设备。
-
静态分配:网络管理员可以为特定设备分配固定的IP地址,避免手动配置错误
在工作过程中:
-
DHCP客户端更新租约(Request/Discover)
-
当 DHCP 客户端已经和某个 IP 地址绑定后,经过 0.5 倍的租用期时间后,为了更新 IP 地址的租约,它会发送 DHCP REQUEST 单播报文。在这种情况下,客户端知道服务器的具体地址,因此可以直接向该地址发送单播请求。
-
DHCP 服务器若同意,则发回 DHCP ACK 确认报文,这样,DHCP 客户就得到了新的租用期。
-
DHCP 服务器若不同意,则发回DHCP NACK否认报文,这时,DHCP 客户必须立即停止使用之前租用的IP地址,并重新发送 DHCP Discover 发现报文来重新申请IP地址。
-
DHCP 服务器者未做出响应,则在租用期过了 87.5% 时,DHCP 客户必须重新发送
DHCP REQUEST请求报文,然后继续等待 DHCP 服务器可能做出的反应。 -
若 DHCP 仍未做出响应,当租用期到期后,DHCP 客户必须立即停止使用之前租用的 IP 地址,并重新发送 DHCP 发现报文来重新申请 IP 地址。
-
-
DHCP客户终止租用期(Release)
- DHCP 客户可以随时提前终止 DHCP 服务器所提供的租用期,这时只需向 DHCP 服务器发送 DHCP RELEASE 释放报文段即可。
DHCP 中继代理
在每一个网络上都设置一个 DHCP 服务器会使 DHCP 服务器的数量太多。因此,在实际应用中,是使每一个网络至少有一个DHCP中继代理(通常是一台路由器),它配置了 DHCP 服务器的 IP 地址信息,作为各网络中计算机与 DHCP 服务器的桥梁。

总结
DHCP 是一种高效的网络管理协议,通过自动分配 IP 地址和网络配置信息,极大地简化了网络管理流程,提高了网络的灵活性和可扩展性。它在现代网络中扮演着不可或缺的角色,尤其是在局域网、无线网络和云计算环境中。
相关文章:
计算机网络:应用层 —— 动态主机配置协议 DHCP
文章目录 什么是 DHCP?DHCP 的产生背景DHCP 的工作过程工作流程地址分配机制 DHCP 中继代理总结 什么是 DHCP? 动态主机配置协议(DHCP,Dynamic Host Configuration Protocol)是一种网络管理协议,用于自动分…...
23种设计模式 - 解释器模式
模式定义 解释器模式(Interpreter Pattern)是一种行为型设计模式,用于为特定语言(如数控系统的G代码)定义文法规则,并构建解释器来解析和执行该语言的语句。它通过将语法规则分解为多个类,实现…...
C++中string常用方法操作指南(后续补充)
文章目录 1. 定义和初始化字符串2. 字符串的基本操作2.1 获取字符串长度2.2 检查字符串是否为空2.3 访问字符串中的字符 3. 输入字符串4. 常用的字符串操作4.1 截取子字符串4.2 查找子字符串4.3 替换字符串4.4 插入字符串4.5 删除字符串 5. 字符串的排序6. 字符串与数值的转换6…...
遥感与GIS在滑坡、泥石流风险普查中的实践技术应用
原文>>> 遥感与GIS在滑坡、泥石流风险普查中的实践技术应用 我国是地质灾害多发国家,地质灾害的发生无论是对于地质环境还是人类生命财产的安全都会带来较大的威胁,因此需要开展地质灾害风险普查。利用遥感(RS)技术进行地…...
14天速成PAT-BASIC基础知识!
两周关于PAT的基础学习计划。 Day 1: 基本语法和输入输出 知识点 数据类型(int, long, float, double, char)变量声明和初始化输入输出函数(scanf, printf)控制结构(if-else, switch, for, while, do-while࿰…...
Unity性能优化个人经验总结(不定期更新)
字符串 在使用常量或静态变量 Update、LateUpdate、FixedUpdate等每帧调用或调用频率很高的函数内使用字符串时,均使用常量或静态变量处理。 原因解释:除了常量或静态变量的字符串将会在每一次调用时,将会new一个新的字符串,导…...
vue3面试题进阶版
覆盖 Vue3 的核心知识点、高频考点及实战场景 一、基础与核心概念 MVVM 与 MVC 的区别 MVC:Model(数据)、View(视图)、Controller(控制器),视图更新需手动操作 DOM。MVVM࿱…...
python小项目编程-初级(5、词频统计,6、简单得闹钟)
1、词频统计 统计文本文件中每个单词出现的频率。 实现 import tkinter as tk from tkinter import filedialog, messagebox from collections import Counter import reclass WordFrequencyCounter:def __init__(self, master):self.master masterself.master.title("…...
掌握 ElasticSearch 四种match查询的原理与应用
文章目录 一、引言 (Introduction)二、准备工作:创建索引和添加示例数据三、match 查询四、match_all 查询五、multi_match 查询六、match_phrase 查询七、总结 (Conclusion) 一、引言 (Introduction) 在信息爆炸的时代,快速准确地找到所需信息至关重要…...
Vue 中组件通信的方式有哪些,如何实现父子组件和非父子组件之间的通信?
一、父子组件通信(垂直通信) 1. Props 传值(父 → 子) 实现方案: <!-- Parent.vue --> <template><Child :user"userData" /> </template><script setup> import { ref } …...
微信小程序(uni)+蓝牙连接+Xprint打印机实现打印功能
1.蓝牙列表实现,蓝牙设备展示,蓝牙连接 <template><view class"container"><view class"container_top"><view class"l">设备名称</view><view class"r">{{state.phoneNam…...
QT 建立一片区域某种颜色
绘制一个位于(50, 50)的200x200的红色矩形 #include "widget.h" #include "ui_widget.h" #include <QPainter>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);update(); }Widget::~Widget() {delete…...
Go Web 项目实战:构建 RESTful API、命令行工具及应用部署
Go Web 项目实战:构建 RESTful API、命令行工具及应用部署 Go 语言因其简洁高效、并发支持强大等特点,已经成为了后端开发的热门选择之一。本篇文章将通过实战案例带领你学习如何使用 Go 构建一个简单的 RESTful API,开发命令行工具…...
Eclipse自动排版快捷键“按了没有用”的解决办法
快捷键按了没有用,通常是因为该快捷键方式被其他软件占用了,即别的软件也设置了这个快捷键,导致你按了之后电脑不知道该响应哪个软件。 解决办法:1.将当前软件的这个快捷键改了;2.找到占用的那个软件,把那…...
springboot404-基于Java的校园礼服租赁系统(源码+数据库+纯前后端分离+部署讲解等)
💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm…...
PHP支付宝--转账到支付宝账户
官方参考文档: https://opendocs.alipay.com/open/62987723_alipay.fund.trans.uni.transfer?sceneca56bca529e64125a2786703c6192d41&pathHash66064890 可以使用默认应用,也可以自建新应用,此处以默认应用来讲解【默认应用默认支持…...
推荐一款AI大模型托管平台-OpenWebUI
推荐一款AI大模型托管平台-OpenWebUI 1. OpenWebUI 1. OpenWebUI什么? 官网地址:https://openwebui.com/ GitHub地址: https://github.com/open-webui/open-webui Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离…...
PHP Composer:高效项目依赖管理工具详解
PHP Composer:高效项目依赖管理工具详解 引言 随着Web开发领域的不断扩展,项目的复杂性也在逐渐增加。为了提高开发效率,减少重复劳动,依赖管理工具应运而生。其中,PHP的Composer成为了开发者们的首选。本文将详细介绍PHP Composer的功能、使用方法以及在实际开发中的应…...
代码随想录D50-51 图论 Python
理论基础 理论基础部分依然沿用代码随想录教程中的介绍: 图的种类 度 连通性 连通性用于表示图中节点的连通情况。 如果有节点不能到达其他节点,则为非连通图,想象将多个水分子表示为图,不考虑非键作用,这张图就不是…...
【八股】计算机网络
HTTP 应用层网络层传输层接口层数据链路层 HTTP基本概念 HTTP是什么? HTTP是超文本传输协议 HTTP 常见的状态码有哪些? 200、204、206 成功 301、302、304 重定向 400、403、404 客户端错误 500、501、502、503 服务端错误...
在 Spring Boot 中使用 `@Autowired` 和 `@Bean` 注解
文章目录 在 Spring Boot 中使用 Autowired 和 Bean 注解示例背景 1. 定义 Student 类2. 配置类:初始化 Bean3. 测试类:使用 Autowired 注解自动注入 Bean4. Spring Boot 的自动装配5. 总结 在 Spring Boot 中使用 Autowired 和 Bean 注解 在 Spring Bo…...
Qt 保留小数点 固定长度 QString 格式化
QString的arg()函数格式化输出double类型数值,包括fieldWidth、fmt、prec和fillChar参数的作用。示例代码展示了如何设置精度和填充字符,以及字段宽度的影响。文中提到,当fieldWidth小于实际长度时,前面的填充不会被截断。此外&am…...
Mac M3/M4 本地部署Deepseek并集成vscode
Mac 部署 使用傻瓜集成平台ollama,ollama平台依赖于docker,Mac的M3/M4 因doesn’t have VT-X/AMD-v enabled 所以VB,VM无法使用,导致docker无法启动,需要使用docker的替代品podman, 它完全兼容docker brew install p…...
TikTok账户安全指南:如何取消两步验证?
TikTok账户安全指南:如何取消两步验证? 在这个数字化的时代,保护我们的在线账户安全变得尤为重要。TikTok,作为全球流行的社交媒体平台,其账户安全更是不容忽视。两步验证作为一种增强账户安全性的措施,虽…...
【C++复习专题】—— 类和对象,包含类的引入、访问限定符、类的6个默认成员函数等
1.类的定义 class classname {//类体:由成员函数和成员变量组成 }; class为定义类的关键字,classname为类的名字,{}中为类的主体。 类体中的内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方…...
Spring--BeanDefinition的用法
原文网址:Spring--BeanDefinition的用法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍BeanDefinition的用法。 BeanDefinition是Bean的信息,用于生成Bean。 示例:手动注册Bean 待填充 BeanDefinition的作用 get 下图是通过beanDefinitio…...
关于C#的一些基础知识点汇总
1.C#结构体可以继承接口吗?会不会产生GC? 在 C# 中,结构体不能继承类,但可以实现接口。 代码: interface IMyInterface {void MyMethod(); }struct MyStruct : IMyInterface {public void MyMethod(){Console.Write…...
一文讲解Redis为什么读写性能高以及I/O复用相关知识点
Redis为什么读写性能高呢? Redis 的速度⾮常快,单机的 Redis 就可以⽀撑每秒十几万的并发,性能是 MySQL 的⼏⼗倍。原因主要有⼏点: ①、基于内存的数据存储,Redis 将数据存储在内存当中,使得数据的读写操…...
Hadoop-HA(高可用)机制
首先:在每个NAMENODE上都会有一个zkfc(zookeeper failover colltroller) ,负责这两个的状态管理。哪个是(active和standby)然后写入zk集群里面。同时监控自己所在的机器是否正常。一旦active上zkfc的发现异…...
51单片机-按键
1、独立按键 1.1、按键介绍 轻触开关是一种电子开关,使用时,轻轻按开关按钮就可使开关接通,当松开手时,开关断开。 1.2、独立按键原理 按键在闭合和断开时,触点会存在抖动现象。P2\P3\P1都是准双向IO口,…...
