本文大部分参考了:
《趣谈网络协议》
动态主机配置协议(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客户端就能够和服务端进行交互,去获得自己想要的文件等信息,完成初始化操作系统的作用。这里就不详细说了,下面是大致的流程图:
下面开始正式介绍DHCP分配IP的大致流程!!!
在DHCP协议中,DHCP Server就类似于网络管理员。它只需要配置一段共享的IP地址。之后每一台新接入的机器都通过DHCP协议,来到这个共享的IP地址里进行申请,等待成功申请到IP后就可以正常工作了。等待加入的主机使用完毕(相当于过期等情况)就可以还给DHCP Server供其它机器使用。
在介绍工作流程之前,先介绍一下IP地址分配方式和租约表。
地址分配方式有如下三种:
租约表:
DHCP工作流程大致分为以下四步:
当一台主机新加入一个网络时,只知道自己的MAC地址。它需要告诉网络中的其它主机自己的到来,并去申请对应的IP等信息,这个步骤常称为DHCP Discover。
新主机会使用IP地址0.0.0.0发送一个广播包,提供自己的MAC地址,并告诉所有主机自己是新来的,现在需要IP地址,请求DHCP Server分配IP!
这个广播包封装了UDP,UDP封装了BOOTP。其实DHCP是BOOTP的增强版,但是如果你去抓包的话,很可能看到的名称还是BOOTP协议。格式如下:
DHCP Server相当于IP的管理员,在新主机发送请求后,能够立刻接受到并分配一个IP(会从那些还没有租出去的地址中,选择最前面的空置IP)给它,这个过程称为DHCP Offer。同时,DHCP Server为此客户保留为它提供的IP地址,从而不会为其他DHCP客户分配此IP地址。
DHCP Server如何确定新主机?
DHCP Server就是通过MAC地址的唯一性去确定这个发送请求的主机是一个新主机。
DHCP Offer的格式就像这样,里面有给新人分配的地址。
上图可以发现,DHCP Server也是发送的广播包。这是因为虽然新主机的MAC确认,但是无法确认对应的IP地址,所以只能通过广播包让新主机接受。
DHCP Server除了分配IP,还会分配子网掩码、网关和IPD地址租用期等信息。
由于,第一个步骤是广播数据包,当这个网络中有多个DHCP Server的时候,它就可能申请到很多的IP地址。这时,就必须按照一定的规则进行选择,并通知其他DHCP Server。
新主机一般会选择第一个DHCP Offer,即最先到达的。然后会向网络发送一个DHCP Request广播数据包,其中包含==客户端的MAC地址、接受的租约中的IP地址、提供此租约的DHCP服务器地址==等,并告诉所有DHCP Server它将接受哪一台服务器提供的IP地址,这时候其他的DHCP Server会撤销它们提供的IP地址,以便提供给下一个IP租用请求者。
此时,由于还没有得到DHCP Server的最后确认,客户端仍然使用0.0.0.0为源IP地址、255.255.255.255为目标地址进行广播。在BOOTP里面,接受某个DHCP Server的分配的IP。
当DHCP Server接收到客户机的DHCP request之后,会广播返回给客户机一个DHCP ACK消息包,表明已经接受客户机的选择,并将这一IP地址的合法租用信息和其他的配置信息都放入该广播包,发给客户机。
并且这时候,网络中的其他主机也能够通过这个数据包知道新主机的相关信息。
重新登陆后,新加入的主机就不用再重头执行,而是使用之前申请到的IP直接发送DHCP Request。DHCP Server接受到后,就会进行判断当前这个IP是否还可用(没有分配给其他主机),如果可用,就会返回ACK报文。如果不可用,那么回返回DHCP NAK报文段,告知新加入的主机需要重新执行DHCP Discover以及后面的流程。
其实上面的四个步骤,都对应的四种报文类型。
也可以发现,上面其实都是正常工作下的流程,所以肯定还存在不正常的流程。例如,分配的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地址的回收:DHCP申请的地址一般都是有期限的,即分配的IP地址到达期限后就会回收。
IP地址的续租:在DHCP协议中,客户机在租期到达50%时,会直接向为其提供IP地址的DHCP Server发送DHCP request消息包。客户机收到服务器回应的DHCP ACK消息包后,会根据包中所提供的新的租期以及其他已经更新的TCP/IP参数,更新自己的配置。这样,IP租用更新就完成了。
如果在租期过去50%的时候没有更新,则客户端将在租期过去87.5%的时候再次向为其提供IP地址的DHCP联系。如果还不成功,到租约的100%时候,客户端必须放弃这个IP地址,重新申请。如果此时无DHCP可用,客户端会根据之前获取的子网信息随机获取相关的一个地址,并且每隔5分钟再进行尝试。