数据通信——应用层(DHCP的原理与配置)
引言
假如我们的网络中有N台设备,它们都要设置IP地址,如果人工去一个个配置不仅不方便管理还很麻烦。因此我们用DHCP来自动分配地址。
一,系统的启动流程
不仅是计算机、很多网络设备的启动流程如下:
设备上电后,硬件开启并将初始化的硬件程序(也叫自举程序)装入内存运行后并进行读取,随后装入操作系统中,加载系统和应用软件 。
在这个时刻,我们的主机和路由器等网络设备的功能启动会在硬件开启后进行。不过在它启动前我们要配置好它的一些协议和细节。那这些协议的配置我们可以通过系统自动装配或者人工的方式实现。
比如说,我们运行TCP协议,那么与TCP协议相关的软件就会加载运行,像是其中的IP地址、子网掩码等都要具备。
为此,我们可以通过磁盘来接收协议配置信息,这样虽然快,但是太不灵活,你要一个个设置IP地址?所以说设备自动获取到协议的配置信息更好。因此,自动协议配置是一种可以对客户机分配IP地址的服务。
二,自动协议配置
我们要为设备分配IP地址和掩码等信息。因此我们要一台可以管理地址分配的服务器。这样,每个设备就可以向服务器索要IP地址等信息了。不过这些设备要支持自动向服务器索取IP地址的功能,因为服务器不会自发访问设备。
对此,出现了一个协议叫做RARP(反向地址转换协议)
三,RARP
RARP(Reverse Address Resolution Protocol)介绍这个玩意儿前,要先说说ARP协议,我们之前提到过ARP协议(地址转换协议)是设备进行广播通过IP地址来获取对端的MAC地址。而RARP就是应对设备不知道自己的IP地址,但是知道自己的物理地址的情况。
RARP与ARP相反。RARP发出解析过的物理地址并希望对端返回其对应的IP地址,仍是以广播形式发出,RARP有RARP服务器,它规定只有RARP服务器能产生应答。我们可以设置N多个RARP服务器。

反向地址转换协议(RARP) 允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。
当我们采用了RARP,并且在网关路由器上部署了MAC地址与IP的映射表时,其过程为:
(1)主机发送一个本地的RARP广播,在此广播包中含有自己的MAC地址并且请求收到该请求的RARP服务器给我分配一个IP地址;
(2)本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;
(3)如果存在这个MAC地址与IP的映射,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;
(4)如果不存在,RARP服务器不响应;
(5)源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,超时后表示获取失败。
但这个东西太鸡肋了,我们看下图:

这是一个网络层次的概况。你可以发现ARP和RARP是共同在数据链路层工作的,因此广播发送的数据网关不会进行转发,也就是说每个网段都需要RARP服务器,还是太麻烦了。而且,ARP和RARP一样,都只为IP地址和MAC地址进行互相解析,其它协议配置不提供。
至此我们又有了新的方案——BOOTP(引导程序协议)
四,BOOTP
这个玩意儿我们就简单说说吧!它是基于UDP的C/S模式,是一个应用层协议。设备仍然是向服务器发送请求报文,服务器进行响应。由于设备一开始没有IP地址且通信不再处于数据链路层,因此需要IP报文设置。这个请求的报文将IP报文的首部中的源地址设置为了“0.0.0.0”(默认的源IP地址)目的地址为“255.255.255.255”(默认的目的IP地址)。
我不太想多写这个协议的工作流程,概括来讲,它是通过广播来获取IP,通过MAC获取IP映射。
优点是:可以穿越路由器(因为应用层协议);
缺点是:IP需要静态配置与MAC的映射,网络不具备移动性。
还是有点five,后来这个玩意儿就升级,变成了DHCP
五,DHCP
DHCP(动态主机配置协议)堪称一流的东西,DHCP客户机启动时,它会自动与DHCP服务器通信,由DHCP服务器给它分配IP地址等信息,我们还可以设置租约,规定这个IP使用多久,到期或者设备关机后,IP会被回收。
DHCP一共有三个组件:DHCP服务器(提供分配地址的中心)、DHCP客户机(需获取IP地址的设备)、DHCP中继系统(在客户机和服务器间转发消息)。
DHCP工作流程
发现阶段:客户机通过发送DHCP Discovery广播报文进行请求。如果客户机需要有一个永久性的租用地址,则可以直接请求该地址。这个阶段,源主机发送的IP报文首部的源目IP地址为全0(源)和全1(目)。
提供阶段:收到了IP的广播请求报文,会先分配地址,如果没有要分配的地址则从DHCP的地址池中取出一个可用的IP地址,并且返回一个单播DHCP Offer的报文回应。
选择阶段:客户机收到多个DHCP Offer报文时,往往会选择第一个或者自己所需的那一个IP地址后,广播发送给标识服务器的DHCP Request报文。
确认阶段:被标识的服务器收到后,会单播发回一个DHCP ACK报文表示你可以使用该地址。但是如果发送DHCP Nak。则表示客户机需要重新开始整个过程。也有可能发送DHCP Decline告诉客户机你的IP地址不能用耶!
如果客户机下线并重新登录后,这时就不需要进行发现和提供阶段了,直接将DHCP Request报文发出,服务器收到以后会尝试让客户机继续使用曾经的IP地址。如果我们要更新客户机的IP地址租赁期限,通过DHCP Request进行更新。在上述所有过程中,如果服务器没有返回DHCP ACK则证明服务器没有收到(大概0.875s),需要重发。
客户端获得IP地址后,也可以发送DHCP INFORM这个报文请求获取服务器的其它一些网络配置信息,如DNS等。
DHCP也可以穿越路由器工作,我们可设置DHCP中继代理,这样DHCP就会以单播方式在网络之间传递DHCP的相应报文。

因此,我们可以发现,DHCP几乎涵盖了RARP和BOOTP的功能,并在此基础上拓展了许多新的概念,下面我们用实验来看一下这个DHCP。
六,DHCP配置
首先,如下连接拓扑,将两台PC机均设置为DHCP模式后并开启抓包软件:



我们开启抓包后,会发现开启DHCP的PC机会源源不断的发送DHCP Discovery报文:

接下来我们配置DHCP服务器,我们在路由器接口上进行配置:
<Huawei>sys
Enter system view, return user view with Ctrl+Z.
[Huawei]int g0/0/0
[Huawei-GigabitEthernet0/0/0]ip add 192.168.1.254 24 //设置网关IP地址
[Huawei-GigabitEthernet0/0/0]quit
[Huawei]dhcp enable //开启DHCP服务
[Huawei]int g0/0/0
[Huawei-GigabitEthernet0/0/0]dhcp select interface //选择此接口作为地址池让客户端获取
[Huawei-GigabitEthernet0/0/0]dhcp server dns-list 114.114.114.114 8.8.8.8 //配置DNS
[Huawei-GigabitEthernet0/0/0]dhcp server lease day 0 hour 23 minute 0//设置地址池租赁时间为23小时
[Huawei-GigabitEthernet0/0/0]dhcp server excluded-ip-address 192.168.1.10//配置不被分配的地址段,这些地址段可以保留后用来做其他配置
[Huawei-GigabitEthernet0/0/0]dhcp server excluded-ip-address 192.168.1.200
好了,我们配置完后观察抓包的流量:

上图中的黄条就是配置接口IP后出现的,通过ARP协议检测到了它的IP地址与MAC地址的映射

上图可以看到,DHCP服务器与DHCP客户机迅速完成了建立。其报文传递也是很快。发现报文到达后,DHCP主机立刻回复了一个Offer报文 ,可以看到DHCP服务器为PC暂时分配的IP地址是192.168.1.252。但是我们看到主机并不确认自己是否可以使用这个报文,因此广播发送Request报文,经过服务器的ACK报文确定,并发向目的IP地址为192.168.1.252的设备,告诉其可以使用。
我们也能发现在1和3阶段均是以广播形式发送源目为全0和全1的字段,而2和4阶段则是单播方式发送报文。
我们最后在用主机Ping一下路由器的接口,发现可以Ping通的:


ipconfig命令也可以观察到:
后续
这些就是DHCP的内容,它只是个很简单的利用工具。在我们实际进行网络配置的时候使用它会非常方便,节省我们很多的时间。而且DHCP 服务器的网络规划做的也很好,让我们方便了后续的路由聚合与汇总。
相关文章:
数据通信——应用层(DHCP的原理与配置)
引言 假如我们的网络中有N台设备,它们都要设置IP地址,如果人工去一个个配置不仅不方便管理还很麻烦。因此我们用DHCP来自动分配地址。 一,系统的启动流程 不仅是计算机、很多网络设备的启动流程如下: 设备上电后,硬件…...
力扣151.反转字符串中的单词
原题链接:力扣151.反转字符串中的单词 全代码: 需要复刷 class Solution { public:void reverse(string& s, int start, int end){ //翻转,区间写法:左闭右闭 []for (int i start, j end; i < j; i, j--) {swap(s[i],…...
vim三种模式,文本操作(操作字符/光标,列出行号可视化块模式/多文件查看)
目录 vim--文本编辑器 功能 基本概念 命令/默认模式 插入模式 底行模式 文本操作 引入 移动光标位置 删除字符 -- x/dd 复制/粘贴字符 -- yw/yyp 替换文本 -- r / %s 底行模式 全局替换 -- /g 撤销操作 -- u / ctrlr 修改字符 -- cw 示例 跳行 -- ctrlg 底行…...
jquery控制easyui中combobox、textbox显示隐藏
//combobox下拉框 $("#下拉框id.combo").hide();//textbox输入框 $("#输入框id.textbox").hide(); 参考网址: https://blog.csdn.net/Coldmood/article/details/128279727...
Android拖放startDragAndDrop拖拽onDrawShadow静态添加xml布局View,Kotlin(4)
Android拖放startDragAndDrop拖拽onDrawShadow静态添加xml布局View,Kotlin(4) import android.content.ClipData import android.graphics.Canvas import android.graphics.Point import android.os.Bundle import android.util.Log import a…...
Servlet 初始化参数(web.xml和@WebServlet)
1、通过web.xml方式 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://xmlns.jcp.org/xm…...
shell_62.shell脚本生成一个标准的 SQL INSERT 语句
无论是将文件读入脚本,还是将数据从脚本输出到文件,都会用到文件重定向,这是一种很 常见的操作。本节中的示例脚本两种功能皆有。它会读取 CSV 格式的数据文件,输出 SQL INSERT 语句,并将数据插入数据库。 shell 脚本使…...
华为ICT——第五章语音处理理论与实践
目录 语言学: 主要应用场景: 语言学: 语言学: 语音学(1) 语音学(2) 语音处理介绍: 人类语音的来源: 语言数据: 语言信号预处理: …...
ardupilot开发 --- SLAM 篇
1. 视觉SLAM 1.1 深度相机的种类 结构光相机,如 Kinect1.0、RealSenseTOF相机,如 Kinect2.0双目相机,如 ZED详细参考:https://zhuanlan.zhihu.com/p/282776636 1.2 视觉SLAM算法 2D slam 与3D slam 应用场景有哪些不同&#x…...
Elasticsearch:在你的数据上训练大型语言模型 (LLM)
过去的一两年,大型语言模型(LLM)席卷了互联网。 最近 Google 推出的 PaLM 2 和 OpenAI 推出的 GPT 4激发了企业的想象力。 跨领域构思了许多潜在的用例。 多语言客户支持、代码生成、内容创建和高级聊天机器人都是一些例子。 这些用例要求 LL…...
拓展卡尔曼滤波EKF
How to fusion two Gauss Distribution N ( x , μ 0 , σ 0 ) N ( x , μ 1 , σ 1 ) N ( x , μ ′ , σ ′ ) \begin{equation} \begin{aligned} \mathcal{N}(x,\mu_0,\sigma_0) \mathcal{N}(x,\mu_1,\sigma_1) \mathcal{N}(x,\mu,\sigma) \\ \end{aligned} \end{equatio…...
第四章 应用SysML基本特性集的汽车示例 P2(断更)|系统建模语言SysML实用指南学习
仅供个人学习 使用试用版CSM很鸡肋,然后书中一些内容没有说明,自定义方面有点困难,第四章暂时停止 同时感觉画图的顺序也很随意?甚至需求图放在了后面,觉得很离谱。 准备跳过这一章节 汽车模型 续P1 序列图表示启…...
Vue入门——核心知识点
简介 Vue是一套用于构建用户界面的渐进式JS框架。 构建用户界面:就是将后端返回来的数据以不同的形式(例如:列表、按钮等)显示在界面上。渐进式:就是可以按需加载各种库。简单的应用只需要一个核心库即可,复杂的应用可以按照需求…...
使用opencv的tracking模块跟踪目标
OpenCV跟踪模块算法介绍 OpenCV的tracking模块是一个功能强大的跟踪算法库,包含多种用于跟踪对象的算法。它可以帮助你在连续的视频帧中定位一个物体,例如人脸、眼睛、车辆等。 在OpenCV的tracking模块中,一些主要的跟踪算法包括࿱…...
Debian或Ubuntu静态交叉编译arm和aarch64
Debian或Ubuntu静态交叉编译arm和aarch64 介绍术语ARM架构前置条件从源代码编译一个简单的C程序configure和make交叉编译关于静态链接和依赖关系使用 musl libc 实现与 configure 和 make 进行交叉编译 ARM 正在获得越来越多的关注,并且越来越受欢迎。直接在这些基于…...
最新ai系统ChatGPT程序源码+详细搭建教程+以图生图+Dall-E2绘画+支持GPT4+Midjourney绘画
一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…...
【设计模式】第16节:行为型模式之“命令模式”
一、简介 命令模式:将请求(命令)封装为一个对象,这样可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、…...
安装pytorch报错torch.cuda.is_available()=false的解决方法
参考文章: https://blog.csdn.net/qq_46126258/article/details/112708781 https://blog.csdn.net/Andy_Luke/article/details/122503884 https://blog.csdn.net/anmin8888/article/details/127910084 https://blog.csdn.net/zcs2632008/article/details/127025294 …...
自定义表格的表头根据后端的数据进行筛选是否进行自定义表头添加按钮
自定义表格的表头根据后端的数据进行筛选是否进行自定义表头添加按钮 自定义表格的表头根据后端的数据进行筛选是否进行自定义表头添加按钮 <template><div class"box"><el-table :data"msgMapList" border class"table">&l…...
海上风电应急救援vr模拟安全培训提高企业风险防范能力
相比传统的发电厂,海上风电作业积累的经验少,风险高,因此为了规范施工人员的行为和操作,保障生产安全进行,开展海上风电VR安全培训具有重要意义。 有助于提高员工的安全意识 通过模拟真实的海上风电作业环境࿰…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
