DHCP执行流程详解

news/2024/4/24 8:33:51/文章来源:https://blog.csdn.net/qq_53578500/article/details/126666506

DHCP执行流程介绍

    • DHCP简介
    • DHCP大致执行流程
      • 新主机向DHCP Server申请IP地址
      • DHCP Server将分配好的IP发送给新主机
      • 新主机发送DHCP Request广播数据包,告知其他DHCP Server
      • 目标DHCP Server广播DHCP ACK消息确认包
    • DHCP的报文种类
    • IP地址的收回与续租

本文大部分参考了:

《趣谈网络协议》

DHCP协议详解

DHCP简介

动态主机配置协议(Dynamic Host Configuration Protocol),简称DHCP。前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,统一使用两个IANA分配的端口:67(服务器端),68(客户端)。DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。

简单来说,它的主要作用就是:用于在内网中当一台新的主机加入的时候,动态的给新加入的内网机器分配IP地址等信息的协议。

另外,DHCP还提供帮助客户机预启动执行环境PXE(Pre-boot Execution Environment)的功能。

这里只是简单的记录一下DHCP分配IP的流程,PXE只是简单带过。


DHCP作为PXE的功能

网络管理员也就是DHCP其实不仅仅只有分配IP的功能,会具有一项比较重要的功能,就是帮助客户机自动安装操作系统(PXE)

在一些没有安装OS的空电脑中,可能就需要在系统启动的时候通过PXE去初始化OS。

现在一般电脑的网卡几乎都支持PXE启动, PXE client 就在网卡的 ROM (只读存储器)中,当计算机引导时,BIOS 把 PXE client 调入内存执行。
安装完成后,将提示重新引导计算机。这个时候,在重新引导的过程中将BIOS修改回从硬盘启动就可以了。这样就实现了只需要安装一次操作系统,后面电脑启动的时候都使用这个操作系统。

在BIOS设置页面,有一项PXE Boot to LAN,若设置为Enabled则表示计算机从网络启动,从PXE服务端下载配置文件和操作系统内核进行启动;若设置为Disabled则表示从本地启动,启动动BIOS后,会去寻找启动扇区,如果没有安装操作系统,就会找不到启动扇区,这个时候就启动不起来。

DHCP在PXE的作用主要是为PXE客户端提供PXE服务端的位置,之后PXE客户端就能够和服务端进行交互,去获得自己想要的文件等信息,完成初始化操作系统的作用。这里就不详细说了,下面是大致的流程图:

img

下面开始正式介绍DHCP分配IP的大致流程!!!

在DHCP协议中,DHCP Server就类似于网络管理员。它只需要配置一段共享的IP地址。之后每一台新接入的机器都通过DHCP协议,来到这个共享的IP地址里进行申请,等待成功申请到IP后就可以正常工作了。等待加入的主机使用完毕(相当于过期等情况)就可以还给DHCP Server供其它机器使用。

在介绍工作流程之前,先介绍一下IP地址分配方式和租约表。

地址分配方式有如下三种:

  • 人工配置:由管理员对每台具体的计算机指定一个地址、或者通过相关的命令设置(ifconfig、ip addr)
  • 自动配置:服务器为第一次连接网络的计算机分配一个永久地址,DHCP客户端第一次成功地从DHCP服务器端分配到一个IP地址之后,就永远使用这个地址
  • 动态配置:在一定的期限内将地址租给计算机,客户端第一次从DHCP服务器分配到IP地址后,并非永久地使用该地址,每次使用完后,DHCP客户端就得释放这个IP地址,并且租期结束后客户必须续租或者停用该地址,而对于路由器,经常使用的地址分配方式是动态配置。

租约表

  • 静态租约表:对应一个静态租约存储文件,server运行时从文件中读取静态租约表。(存放分配的静态IP)
  • 动态租约表:对应一个周期存储文件,server周期性将租约表存进该文件,在程序开始时将会读取上次存放的租约表。(租约表记录了当前所有分配的租约,包括静态链接的)。(存放分配的动态的IP)
  • DHCP服务器是一直处在被动接受请求的状态,当有客户端请求时,服务器会读取获得客户端当前所在的状态以及客户端的信息,并在静态租约表和动态租约表中进行检索找到相应的表项,再根据客户端的状态执行不同的回复。
  • 当收到客户端的首次请求时,DHCP服务器先查找静态租约表;若存在请求的表项,返回这个客户的静态IP地址;否则,从IP地址池中选择可用的IP分配给客户,并添加信息到动态数据库中。此外,服务器将会周期性的刷新租约表写入文件存档,在这个过程中会顺便对动态租约表进行租期检查。

DHCP大致执行流程

DHCP工作流程大致分为以下四步:

  • 新主机向DHCP Server申请IP地址(DHCP DIscover)
  • DHCP Server将分配好的IP发送给新主机(DHCP Offer)
  • 新主机发送DHCP Request广播数据包,告知所有DHCP服务器自己要接受哪台服务器提供的IP等信息(DHCP Request)
  • 目标DHCP Server广播DHCP ACK消息确认包,通知该网络中的所有主机,申请的IP地址即可正常使用(DHCP ACK)

新主机向DHCP Server申请IP地址

当一台主机新加入一个网络时,只知道自己的MAC地址。它需要告诉网络中的其它主机自己的到来,并去申请对应的IP等信息,这个步骤常称为DHCP Discover

新主机会使用IP地址0.0.0.0发送一个广播包,提供自己的MAC地址,并告诉所有主机自己是新来的,现在需要IP地址,请求DHCP Server分配IP!

这个广播包封装了UDP,UDP封装了BOOTP。其实DHCP是BOOTP的增强版,但是如果你去抓包的话,很可能看到的名称还是BOOTP协议。格式如下:

img

DHCP Server将分配好的IP发送给新主机

DHCP Server相当于IP的管理员,在新主机发送请求后,能够立刻接受到并分配一个IP(会从那些还没有租出去的地址中,选择最前面的空置IP)给它,这个过程称为DHCP Offer。同时,DHCP Server为此客户保留为它提供的IP地址,从而不会为其他DHCP客户分配此IP地址。

DHCP Server如何确定新主机?

DHCP Server就是通过MAC地址的唯一性去确定这个发送请求的主机是一个新主机。

DHCP Offer的格式就像这样,里面有给新人分配的地址。

img

上图可以发现,DHCP Server也是发送的广播包。这是因为虽然新主机的MAC确认,但是无法确认对应的IP地址,所以只能通过广播包让新主机接受。

DHCP Server除了分配IP,还会分配子网掩码、网关和IPD地址租用期等信息。

新主机发送DHCP Request广播数据包,告知其他DHCP Server

由于,第一个步骤是广播数据包,当这个网络中有多个DHCP Server的时候,它就可能申请到很多的IP地址。这时,就必须按照一定的规则进行选择,并通知其他DHCP Server。

新主机一般会选择第一个DHCP Offer,即最先到达的。然后会向网络发送一个DHCP Request广播数据包,其中包含==客户端的MAC地址、接受的租约中的IP地址、提供此租约的DHCP服务器地址==等,并告诉所有DHCP Server它将接受哪一台服务器提供的IP地址,这时候其他的DHCP Server会撤销它们提供的IP地址,以便提供给下一个IP租用请求者。

img

此时,由于还没有得到DHCP Server的最后确认,客户端仍然使用0.0.0.0为源IP地址、255.255.255.255为目标地址进行广播。在BOOTP里面,接受某个DHCP Server的分配的IP。

目标DHCP Server广播DHCP ACK消息确认包

当DHCP Server接收到客户机的DHCP request之后,会广播返回给客户机一个DHCP ACK消息包,表明已经接受客户机的选择,并将这一IP地址的合法租用信息和其他的配置信息都放入该广播包,发给客户机。

img

  • 客户端在接收到DHCP ack广播后,会向网络发送三个针对此IP地址的ARP解析请求以执行冲突检测,查询网络上有没有其它机器使用该IP地址;如果发现该IP地址已经被使用,客户机会发出一个DHCP decline数据包给DHCP服务器,拒绝此IP地址租约,并重新发送DHCP discover信息。此时,在DHCP服务器管理控制台中,会显示此IP地址为BAD_ADDRESS。
  • 如果网络上没有其它主机使用此IP地址,则客户机的TCP/IP使用租约中提供的IP地址完成初始化,从而可以和其他网络中的主机进行通讯。

并且这时候,网络中的其他主机也能够通过这个数据包知道新主机的相关信息。

重新登陆后,新加入的主机就不用再重头执行,而是使用之前申请到的IP直接发送DHCP Request。DHCP Server接受到后,就会进行判断当前这个IP是否还可用(没有分配给其他主机),如果可用,就会返回ACK报文。如果不可用,那么回返回DHCP NAK报文段,告知新加入的主机需要重新执行DHCP Discover以及后面的流程。

DHCP的报文种类

其实上面的四个步骤,都对应的四种报文类型。

也可以发现,上面其实都是正常工作下的流程,所以肯定还存在不正常的流程。例如,分配的IP地址冲突等等。那么肯定也存在相应的报文来进行处理。

DHCP总共有八种报文类型:

报文类型说明
Discover(0x01)DHCP客户端在请求IP地址时并不知道DHCP服务器的位置,因此DHCP客户端会在本地网络内以广播方式发送Discover请求报文,以发现网络中的DHCP服务器。所有收到Discover报文的DHCP服务器都会发送应答报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置。
Offer(0x02)DHCP服务器收到Discover报文后,就会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如网关、DNS服务器等),构造一个Offer报文,发送给DHCP客户端,告知用户本服务器可以为其提供IP地址。但这个报文只是告诉DHCP客户端可以提供IP地址,最终还需要客户端通过ARP来检测该IP地址是否重复。
Request(0x03)DHCP客户端可能会收到很多Offer请求报文,所以必须在这些应答中选择一个。通常是选择第一个Offer应答报文的服务器作为自己的目标服务器,并向该服务器发送一个广播的Request请求报文,通告选择的服务器,希望获得所分配的IP地址。另外,DHCP客户端在成功获取IP地址后,在地址使用租期达到50%时,会向DHCP服务器发送单播Request请求报文请求续延租约,如果没有收到ACK报文,在租期达到87.5%时,会再次发送广播的Request请求报文以请求续延租约
ACK(0x05)DHCP服务器收到Request请求报文后,根据Request报文中携带的用户MAC来查找有没有相应的租约记录,如果有则发送ACK应答报文,通知用户可以使用分配的IP地址。
NAK(0x06)如果DHCP服务器收到Request请求报文后,没有发现有相应的租约记录或者由于某些原因无法正常分配IP地址,则向DHCP客户端发送NAK应答报文,通知用户无法分配合适的IP地址。
Release(0x07)当DHCP客户端不再需要使用分配IP地址时(一般出现在客户端关机、下线等状况)就会主动向DHCP服务器发送RELEASE请求报文,告知服务器用户不再需要分配IP地址,请求DHCP服务器释放对应的IP地址。
Decline(0x04)DHCP客户端收到DHCP服务器ACK应答报文后,通过地址冲突检测发现服务器分配的地址冲突或者由于其他原因导致不能使用,则会向DHCP服务器发送Decline请求报文,通知服务器所分配的IP地址不可用,以期获得新的IP地址。
nform(0x08)DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息,则向DHCP服务器发送Inform请求报文;DHCP服务器在收到该报文后,将根据租约进行查找到相应的配置信息后,向DHCP客户端发送ACK应答报文。目前基本上不用了。

IP地址的收回与续租

IP地址的回收:DHCP申请的地址一般都是有期限的,即分配的IP地址到达期限后就会回收。

IP地址的续租:在DHCP协议中,客户机在租期到达50%时,会直接向为其提供IP地址的DHCP Server发送DHCP request消息包。客户机收到服务器回应的DHCP ACK消息包后,会根据包中所提供的新的租期以及其他已经更新的TCP/IP参数,更新自己的配置。这样,IP租用更新就完成了。

如果在租期过去50%的时候没有更新,则客户端将在租期过去87.5%的时候再次向为其提供IP地址的DHCP联系。如果还不成功,到租约的100%时候,客户端必须放弃这个IP地址,重新申请。如果此时无DHCP可用,客户端会根据之前获取的子网信息随机获取相关的一个地址,并且每隔5分钟再进行尝试。

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

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

相关文章

自定义嵌入一个tomcat | 可设置自定义html模板,设置请求路径

一个小小好玩的demo, 并可设置自定义html模板 以及设置请求路径 效果图: 自定义嵌入一个tomcat导入依赖jar包项目结构介绍annotation包PackageServletTomcatRequestMappingcomponents包DocServlet.htmlread包ReadPackageServletservlet包DocServletstatus包Reptile…

8月汽车销量出炉:问界破万,智己破千,理想腰斩!埃安近创新高

每月1号(或前一天)发布上月销量,已成为造车新势力、广汽埃安、赛力斯(原小康股份)、极氪、合创、东风风神、神龙汽车等车企的宣传窗口。9月第一天,北京现代也加入了这一大军,早上8点半多&#x…

Win10离线安装choco方案

Win10离线安装choco方案问题描述前置条件,下载必须的nupkg解决办法: 离线安装choco修改install.ps1脚本修改第46行:修改第277行:powersell开启信任脚本策略以管理员powershell执行安装脚本结果验证问题描述 安装choco的时候,总是超时失败. 前置条件,下载必须的nupk…

Android 动态更新Menu菜单

1. 需求描述 Android Menu菜单是比较常见的功能,在ActionBar or ToolBar上显示,点击更多(3个点),会有下拉列表菜单展示, 在工作项目中有个小需求改动: 在 ToolBar上添加一个图标,点击后会切换图标状态,界面也会显示对…

搭建简易Spring-ioc框架

SpringFrameWork系列1 文章目录SpringFrameWork系列1一、谈谈对Spring的认识二、控制反转(ioc)的作用2.1 ioc的优缺点三、搭建Spring-ioc框架一、谈谈对Spring的认识 Spring是一个开源框架,是为了解决企业应用开发的复杂性而产生的。 特征:轻量级别&…

第66章 基于.Net(Core)x框架的开源分页插件

1 Jquery DataTable 分页插件 Jquery DataTable分页插件是完全基于javaScript的,所以它是跨框架的,即不管你使用的是那种语言,那种平台开发网站程序,基本上都能通过使用Jquery DataTable分页插件实现分页操作。 在nopCommerce开发…

TASK04分组|joyfulpandas

目录一、分组模式及其对象1. 分组的一般模式2. 分组依据的本质【练一练】【END】3.Groupby对象【练一练】【END】 size4. 分组的三大操作二、聚合函数1. 内置聚合函数【练一练】【END】2. agg方法【练一练】【练一练】【END】三、变换和过滤1. 变换函数与transform方法【练一练…

02|一条MySQL更新语句是如何执行的

02|一条MySQL更新语句是如何执行的 update T set cc1 where ID2;其实一条更新语句的执行操作和查询语句的执行操作基本相同->一条SQL查询语句是如何查询的?,唯一不同的是一条更新语句在执行过程中需要涉及到两个日志操作(redo log、binlo…

四、集合

四、集合 集合和数组区别 (1)数组定长,集合不定长(2)数组可存基础数据类型和引用类型,集合只能存引用类型 位置:java.util.*; 这是一位仁兄的笔记,师出同门,点我跳转~ 1、…

高级js 面向对象 和面向过程 三种函数

判断数据类型 // 创建一个Cat对象,属性:颜色,品种,行为:吃,跑,捉老鼠var Cat new Object() //new一个对象Cat.catys red //属性Cat.catname cat //对象名// 行为Cat.catxw function () {console.log("喜欢跑&…

Python3,我用这种方式讲解python模块,80岁的奶奶都说能理解。建议收藏 ~ ~

Python模块讲解1、引言2、python模块详解2.1 含义2.2 代码示例2.3 进阶3、总结1、引言 小屌丝:鱼哥,你看天上的月亮越来越圆了。 小鱼:唉~ 又是一年团圆夜,又是一年中秋节。 小屌丝:嘿嘿,可不滴&#xff0…

二维凸包问题

什么是二维凸包 假设墙上顶一组钉子,这些钉子的集合为X,我们用橡皮筋围住这些钉子,橡皮筋的形状就是凸包(来源于网络)。 向量的叉乘 对于两个向量pq⃗\vec{pq}pq​和qr⃗\vec{qr}qr​ 如果pq⃗\vec{pq}pq​和qr⃗\vec{qr}qr​的叉积结果大于0…

分销商城小程序开发运营逻辑是什么?

商城分销现在用的人比较多,其中用的最多的差不多就是二级分销、三级分销,除了这两种分销方式,还有一种是一级分销,不过裂变效果可能不如二级分销、三级分销要好,所以用的人不是特别的多。 二级分销跟三级分销的逻辑都差…

C++PrimerPlus跟读记录【第五章】循环和关系表达式

1、for 循环 for(initialization; test-expression; updata-expression)test-expression 关系表达式,结果强制为bool类型,true or false。 表达式和语句 C表达式是 值 或 值与运算符的组合,每个表达式都有值。表达式只要加上分号&#xff0…

剑指offer32-42字符串数组的应用

剑指 Offer II 032. 有效的变位词 给定两个字符串 s 和 t ,编写一个函数来判断它们是不是一组变位词(字母异位词)。t 是 s的变位词等价于「两个字符串不相等且两个字符串排序后相等」 注意:若 s 和 t 中每个字符出现的次数都相同…

QT QTextEdit富文本插入字体-表格-编号-图片-查找-语法高亮功能

QT QTextEdit富文本插入字体-表格-编号-图片与查找功能,输入char 自动变成蓝色-语法高亮功能 QTQTextEdit富文本插入字体-表格-编号-图片-查找-语法高亮功能.rar-QT文档类资源-CSDN下载QTQTextEdit富文本插入字体-表格-编号-图片-查找-语法高亮功能.rarhttps:/更多…

Vue使用脚手架(ref、props、mixin、插件、scoped)(七)

系列文章目录 第一章:Vue基础知识笔记(模板语法、数据绑定、事件处理、计算属性)(一) 第二章:Vue基础知识(计算属性、监视属性、computed和watch之间的区别、绑定样式)(…

四、 java的对象和类

四、 java的对象和类 对象(Object):对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。类(c…

物理服务器安装CentOS 7操作系统

目录 1、下载系统镜像 2、制作安装盘 2.1 方法一:光盘制作 2.2 方法二:U盘制作 3、更改bios启动顺序 4、安装CentOS 7操作系统 4.1 安装命令选择,及常见错误解决 4.2 语言选择 4.3 时区选择 4.4 软件选择 4.5 安装位置选择 4.6 手…

猿创征文|【C++游戏引擎Easy2D】学C++还不会绘制一个简单的二维图形?一篇文章教会你

🧛‍♂️iecne个人主页::iecne的学习日志 💡每天关注iecne的作品,一起进步 💪学C必看iecne 本文专栏:【C游戏引擎】. 🐳希望大家多多支持🥰一起进步呀! ✨前…