网络:DHCP 协议简介

文章目录

  • 1. 前言
  • 2. DHCP 协议简介
    • 2.1 DHCP 客户端广播 `DHCPDISCOVER` 消息
    • 2.2 DHCP 服务器回复 `DHCPOFFER` 消息
    • 2.3 DHCP 客户端广播 `DHCPREQUEST` 消息
    • 2.4 DHCP 服务器回复 `DHCPACK` 消息
    • 2.5 剩余的工作
  • 3. 参考资料

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. DHCP 协议简介

DHCP,是 Dynamic Host Configuration Protocol 的缩写,译称 动态主机配置协议DHCP 是一个局域网协议,前身为 BOOTP 协议,用来为局域网主机动态管理、分配 IP 地址DHCP 协议位于OSI 7层协议模型应用层,向下调用 UDP 协议工作。
DHCP 的具体实现为 C/S 模式(客户端/服务端 模式)DHCP 请求、分配 IP 地址的过程,可以简单概括为:客户端向服务端发起 IP 地址分配请求,服务端响应该请求返回分配的 IP 地址等信息给客户端,之后客户端使用返回的 IP 地址工作,使用完毕(租期到期、或下线)后释放该地址给 DHCP 服务器。典型的 DHCP 客户端有 dhcpcd 。
接下来细化上述DHCP 请求、分配 IP 地址的过程,先上一张图:
在这里插入图片描述
上图是一个典型的 DHCP 分配地址的过程,下面以每一小节一个消息的组织形式,来细化这一过程。在此之前,有必要把 DHCP 消息的格式做个简要介绍:
在这里插入图片描述
下图为协议对消息字段的解释:
在这里插入图片描述
这里只挑我们重点关注的2个字段进行说明:

yiaddr: DHCP 服务器分配给客户端的 IP 地址,4字节长。
chaddr: 网络设备地址(如以太网卡 MAC 地址),16字节长。像以太网卡 MAC 地址只需6字节,剩余部分填 0

2.1 DHCP 客户端广播 DHCPDISCOVER 消息

DHCP 客户端通过在局域网广播 DHCPDISCOVER 消息,向局域网的所有 DHCP 服务器发起 IP 地址分配请求。我们以找工作的过程,来进行类比:我们(找工作的人),就是 DHCP 客户端;找工作要投递简历,投递简历的过程,就是发送 DHCPDISCOVER 消息,我们找工作通常会投多家公司,这就是广播了;而接收我们简历投递的公司,就是 DHCP 服务器。看一下 DHCP 客户端 DHCPDISCOVER 消息的抓包:
在这里插入图片描述

2.2 DHCP 服务器回复 DHCPOFFER 消息

局域网内的 DHCP 服务器收到 DHCP 客户端广播的 DHCPDISCOVER 消息后,从自身管理的 IP 地址池挑选一个空闲 IP,单播回复一个带可用 IP 地址的 DHCPOFFER 消息给请求 IP 的 DHCP 客户端。还是类比于找工作的过程,我们投递了简历的公司,经过面试后(发现可用 IP),如果发现你合适(有可用 IP),则会给你发一个 Offer (单播 DHCPOFFER 消息给 DHCP 客户端)。当然,如果面试发现你不合适(没有可用 IP 或 其它可能的问题),自然也不会发 Offer 给你(没有 DHCPOFFER 从这些 DHCP 服务器发出)。看一下 DHCP 客户端 DHCPOFFER 消息的抓包:
在这里插入图片描述

2.3 DHCP 客户端广播 DHCPREQUEST 消息

DHCP 客户端在收到 DHCP 服务器DHCPOFFER 消息后,再次向 DHCP 服务器 广播 DHCPREQUEST 消息,告知自己准备要使用 DHCPOFFER 消息给出 IP 地址。之所以是广播,因为还有完全确立使用该 IP。当然,DHCP 客户端 可能收到多个来自 DHCP 服务器的 DHCPOFFER 消息,它回挑选其中一个,通常是挑选最先收到的。还是类比于找工作的过程,在收到公司发给我们的 Offer 后(收到 DHCPOFFER 消息后),我们从中挑选一封 Offer 接受(毕竟烈女不嫁二夫^ - ^),然后告知公司我接受你家的 Offer(向 DHCP 服务器 广播 DHCPREQUEST 消息)。看一下 DHCP 客户端 DHCPREQUEST 消息的抓包:
在这里插入图片描述

2.4 DHCP 服务器回复 DHCPACK 消息

DHCP 服务器接收到 DHCP 客户端的 IP 请求消息 DHCPREQUEST 后,单播回复一个 DHCPACK 告知 DHCP 客户端,你申请的 IP 成功了,DHCP 服务端会将之记录在案:该 IP 已经分配出去了。当然,也可能回复 DHCPNAK 消息,告知 DHCP 客户端 你申请的 IP 不批准:毕竟消息中间存在间隙,别的客户端也可能已经将这个 IP 拿走了。再类比到找工作,即使你拿到 Offer 了,入职前还是要跟公司再次确认(收取 DHCPACK 消息确认),因为有可能别人抢了你的职位(别的客户端捷足先登拿走了你申请的 IP)。会有公司这么干,发了 Offer 也不给你入职,公司可能找了一个性价比更优的。虽然无耻,但很现实 ^ - ^ 。看一下 DHCP 客户端 DHCPACK 消息的抓包:
在这里插入图片描述

2.5 剩余的工作

看起来一切都已经完成了,是这样吗?对于 DHCP 协议来讲,确实工作已经结束了。但是,如果局域网内,有其它的设备静态配置了 DHCP 客户端申请的 IP ,而 DHCP 服务端不会知道这一点,所以可能分配了一个和局域网内设备冲突的 IP 给客户端,这是 DHCP 客户端拿到 DHCPACK 消息确认的 IP 后,通过发送一个 ARP 广播,来确认是不是局域网内有和自己刚申请到的 IP 冲突的设备,看下 DHCP 客户端在拿到申请的 IP 后,在局域网内发 ARP 广播来确认是否存在冲突 IP 的抓包:
在这里插入图片描述
DHCP 客户端 发几个 ARP 广播,没设备回应的话,就认为没人使用申请的 IP,接下来就使用该 IP 愉快的玩耍了。这一部分内容,已经不属于 DHCP 协议的内容了。

3. 参考资料

[1] DHCP协议详解
[2] DHCP协议: RFC 2131

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/483798.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

h5增强表单---数据列表和属性

h5增强表单---数据列表 下拉列表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</ti…

Echarts功能记录

基础配置 工具箱toolbox 对应功能 案例中使用到的第三方脚本

力扣450 删除二叉搜索树中的节点 Java版本

文章目录 题目描述思路代码 题目描述 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除…

学生如何帮老师撰写审稿意见

开头先介绍这篇文章做了什么&#xff0c;达到了什么样的目的、有什么创新点、应用&#xff0c;然后第一段最后一句写上&#xff0c;如果你进行了如下补充&#xff0c;明确表达了相关内容等&#xff0c;就能够接收你的文章&#xff08;在我们暂时不想接收他的文章的情况下&#…

JetPack之ViewModel

目录 一、简介1.1 优点1.2 生命周期 二、使用2.1 ViewModel保证数据稳定性demo2.2 ViewModel中如何传递上下文Context 三、注意点 一、简介 ViewModel 组件用于管理界面相关的数据&#xff0c;并且在配置更改&#xff08;如屏幕旋转&#xff09;时保持数据的一致性。ViewModel…

不可变集合及Stream流

若希望某个数据是不可修改的&#xff0c;就可以考虑使用不可变集合&#xff0c;以提高安全性&#xff1b;&#xff08;JKD9之后才有&#xff09; List不可变集合&#xff1a; public static void main(String[] args) {/*创建不可变的List集合"张三", "李四&q…

快速修复找不到msvcp140.dll,无法继续执行此代码问题

在电脑使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“无法找到msvcp140.dll”的错误。那么&#xff0c;msvcp140.dll究竟是什么呢&#xff1f;它为什么会出现这样的错误呢&#xff1f;通过查阅资料和自己的实践经验&#xff0c;我对msvcp140.dll…

odoo 官方常用 widgets 小部件清单

在Odoo中&#xff0c;小部件&#xff08;Widgets&#xff09;是用于构建用户界面的组件&#xff0c;它们决定了表单、列表视图以及更多交互元素的显示和行为方式。虽然无法提供Odoo14及之后所有版本的确切小部件清单&#xff0c;但可以列举一些常见和重要的内置小部件类型&…

11.创建后台系统项目

后台系统项目 兼容性 vite官网&#xff1a;https://vitejs.dev/ vite中文网&#xff1a;https://cn.vitejs.dev/ vite需要node.js版本 >14.0.0&#xff0c;建议16 node -v 查看版本号 创建项目 进入存放目录 执行命令 npm create vitelatest 选择vue框架 选择typescript…

V R元宇宙平台的未来方向|V R主题馆加 盟|游戏体验馆

未来&#xff0c;VR元宇宙平台可能会呈现出以下发展趋势和可能性&#xff1a; 全面融合现实与虚拟世界&#xff1a; VR元宇宙平台将更加无缝地融合现实世界和虚拟世界&#xff0c;用户可以在虚拟环境中进行各种活动&#xff0c;与现实世界进行互动&#xff0c;并且体验到更加逼…

【PostGresql】------ pg多表数据多个条件汇总 使用 union 方法示例代码

1. 示例代码如下&#xff1a; SELECT"ID","DT_DATE","CNAME","RMAN_NAME","DEP_NAME","DEP_ID","INVEST_MAN_NAME","TYPE_NAME","INVEST_LEVEL_NAME","POSITION_NAME",…

详细教程与使用指南助您轻松上手Sora

在2024年2月16日&#xff0c;OpenAI团队宣布了一项革命性的技术突破——推出了首个能够将文本描述转化为视频内容的人工智能模型&#xff0c;名为Sora。这一创新标志着人工智能在多媒体内容创作领域迈出了重要一步。Sora模型不仅能够根据用户的文字描述生成长达60秒的动态视频&…

复习Day3

1231. 航班时间 - AcWing题库 #include<bits/stdc.h> using namespace std; int getTime(){//得到时间 int h1,m1,s1,h2,m2,s2,d0;scanf("%d:%d:%d %d:%d:%d (%d)",&h1,&m1,&s1,&h2,&m2,&s2,&d);//补匹配直接跳过 int timed*24*3…

leetcode 1047. 删除字符串中的所有相邻重复项

题目 思路 这是一道easy题&#xff0c;很明显要用栈。 有三种情况&#xff1a; 如果栈空&#xff0c;则直接入栈。 如果栈顶元素和当前元素不同则入栈。 如果栈顶元素和当前元素相同则栈顶元素出栈 最后再将栈中的元素依次pop&#xff0c;添加到一个字符串中就行。 代码…

Java设计模式 | 抽象工厂模式

抽象工厂模式 工厂方法模式中考虑的是一类产品的生产&#xff0c;如幼儿园只培养小朋友&#xff0c;鞋厂只生产鞋子。这些工厂只生产同种类产品&#xff0c;同种类产品称为同等级产品&#xff0c;即工厂方法模式只考虑生产同等级的产品&#xff0c;但是在现实生活中许多工厂都…

一文搞懂数据链路层

数据链路层 1. 简介2. MAC3. 以太网 1. 简介 &#xff08;1&#xff09;概念 链路(link)是一条无源的点到点的物理线路段&#xff0c;中间没有任何其他的交换结点。 数据链路(data link) 除了物理线路&#xff08;双绞线电缆、同轴电缆、光线等介质&#xff09;外&#xff0…

利用LoadRunner 测试MySQL Server 性能

1&#xff09;将本次实验材料文件夹中bin文件夹和 include文件夹下文件分别拷贝到 LoadRunner 安装路径下的 bin 文件夹和下include文件夹下。 2&#xff09;在mysql中创建相应的数据库和表(创建数据库的和表的脚本在附录2中) 3&#xff09;机房mysql启动需要在winr之后输入ser…

刷题日记——BFS:离开迷宫最短时间、生化武器(天津大学/南开大学机试)

例题 分析 需要注意地图的输入&#xff0c;每一行都有个换行符&#xff0c;需要扔掉写完地图的输入&#xff0c;最好输出一下验证一下输入的对不对由于是求最短的时间&#xff0c;BFS第一次找到终点就输出即可考虑到连续输入多个样例的可能性&#xff0c;如果选择找到终点就输…

手撕算法-二叉树的层平均值

描述 分析 二叉树的层序遍历。层序遍历需要用到队列。 代码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, T…