• DHCP执行流程详解


    本文大部分参考了:

    《趣谈网络协议

    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分钟再进行尝试。

  • 相关阅读:
    算法 预测赢家(动态规划)
    vue 语法--表单取值,组件通信
    一封来自江苏省电力设计院的表扬信
    STM32(八)------- PWM输出
    数据结构与算法2-链表
    jQuery 第三章(语法+选择器+事件)
    Java8-JVM内存区域划分白话解读
    ESDB论文重点整理
    133道Java面试题及答案(面试必看)
    数据结构之堆
  • 原文地址:https://blog.csdn.net/qq_53578500/article/details/126666506