8.3、网络层—DHCP协议
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议。DHCP通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、子网掩码、默认网关地址、DNS服务器的名称与IP地址等信息。默认情况下,DHCP作为Windows Server的一个服务组件不会被系统自动安装,还需要管理员手动安装并进行必要的配置。
一、通过DHCP协议动态获取IP地址(包括子网掩码、默认网关、DNS服务器的名称和IP地址)的工作流程
DHCP协议采用UDP作为传输协议,DHCP服务器接收消息的端口号是67,客户端一般发送DHCP协议的端口号是68。通过DHCP协议动态获取IP地址(包括子网掩码、默认网关、DNS服务器的名称和IP地址)的工作流程,如下图所示:


上图中的工作流程,总结如下:
①、DHCP客户端在请求IP地址时并不知道DHCP服务器的位置,因此DHCP客户端会在本地网络内以广播方式发送Discover请求报文,以发现网络中的所有DHCP服务器。所有收到Discover报文的DHCP服务器都会发送应答报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置。
②、所有的DHCP服务器收到Discover报文后,都会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如网关、DNS服务器、子网掩码等),构造一个Offer报文,发送给DHCP客户端。每个DHCP服务器所构造的offer报文中都有一个options字段是用来保存当前DHCP服务器的IP地址,这样,客户端就可以通过不同的options字段来区分DHCP服务器。
③、 DHCP客户端可能会收到很多Offer应答报文,所以必须在这些应答报文中选择一个。通常是选择第一个Offer应答报文,并在本地网络内以广播的形式发送Request请求报文,通告所有DHCP服务器,表示自己要使用第一个Offer应答报文中的IP地址,并使用该报文的options字段的DHCP服务器作为自己的目标服务器。另一种情况是,DHCP客户端在成功获取IP地址后,当地址使用租期达到50%时,DHCP客户端会向DHCP服务器发送单播Request请求报文请求续延租约,如果没有收到ACK报文,在租期达到87.5%时,会在本地网络内以广播的形式发送Request请求报文,通告所有DHCP服务器请求续延租约。
④、DHCP服务器收到Request请求报文后,根据Request报文中携带的用户MAC来查找有没有相应的租约记录,如果有则发送ACK应答报文,通知用户可以使用分配的IP地址。
二、DHCP协议的报文内容
DHCP一共有8中报文,各种类型报文的基本功能如下:
| 报文类型 | 说明 |
|---|---|
| Discover(0x01) | DHCP客户端在请求IP地址时并不知道DHCP服务器的位置,因此DHCP客户端会在本地网络内以广播方式发送Discover请求报文,以发现网络中的所有DHCP服务器。所有收到Discover报文的DHCP服务器都会发送应答报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置。 |
| Offer(0x02) | 所有的DHCP服务器收到Discover报文后,都会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如网关、DNS服务器、子网掩码等),构造一个Offer报文,发送给DHCP客户端。每个DHCP服务器所构造的offer报文中都有一个options字段是用来保存DHCP服务器自己的IP地址,这样,客户端就可以通过不同的options字段来区分DHCP服务器。 |
| Request(0x03) | DHCP客户端可能会收到很多Offer应答报文,所以必须在这些应答报文中选择一个。通常是选择第一个Offer应答报文,并在本地网络内以广播的形式发送Request请求报文,通告所有DHCP服务器,表示自己要使用第一个Offer应答报文中的IP地址,并使用该报文的options字段的DHCP服务器作为自己的目标服务器。另一种情况是,DHCP客户端在成功获取IP地址后,当地址使用租期达到50%时,DHCP客户端会向DHCP服务器发送单播Request请求报文请求续延租约,如果没有收到ACK报文,在租期达到87.5%时,会在本地网络内以广播的形式发送Request请求报文,通告所有DHCP服务器请求续延租约。 |
| 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地址。 |
| Inform(0x08) | DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息,则向DHCP服务器发送Inform请求报文;DHCP服务器在收到该报文后,将根据租约进行查找到相应的配置信息后,向DHCP客户端发送ACK应答报文。目前基本上不用了。 |
DHCP协议的报文格式,如下图所示:

DHCP协议的报文中,各部分的含义如下:
①、op:报文的操作类型。分为请求报文和响应报文。1:请求报文,2:应答报文。即client送给server的封包,设为1,反之为2。
- 请求报文:DHCP Discover、DHCP Request、DHCP Release、DHCP Inform和DHCP Decline。
- 应答报文:DHCP Offer、DHCP ACK和DHCP NAK。
②、Htype:DHCP客户端的MAC地址类型。MAC地址类型其实是指明网络类型。htype值为1时表示为最常见的以太网MAC地址类型。
③、Hlen:DHCP客户端的MAC地址长度。以太网MAC地址长度为6个字节,即以太网时hlen值为6。
④、Hops:DHCP报文经过的DHCP中继的数目,默认为0。DHCP请求报文每经过一个DHCP中继,该字段就会增加1。没有经过DHCP中继时值为0。(若数据包需经过router传送,每站加1,若在同一网内则为0)。
⑤、Xid:客户端通过DHCP Discover报文发起一次IP地址请求时选择的随机数,相当于请求标识。用来标识一次IP地址请求过程。在一次IP地址的请求过程中,所有报文的Xid都是一样的。
⑥、Secs:DHCP客户端从获取到IP地址或者续约过程开始到现在所消耗的时间,以秒为单位。在没有获得IP地址前该字段始终为0。(DHCP客户端开始DHCP请求后所经过的时间,目前尚未使用,固定为0)
⑦、Flags:标志位,只使用第0比特位,是广播应答标识位,用来标识DHCP服务器应答报文是采用单播还是广播发送,0表示采用单播发送方式,1表示采用广播发送方式。其余位尚未使用(即从0-15bits,最左1bit为1时表示server将以广播方式传送封包给client)。注意:在客户端正式分配了IP地址之前的第一次IP地址请求过程中,所有DHCP报文都是以广播方式发送的,包括客户端发送的DHCP Discover和DHCP Request报文,以及DHCP服务器发送的DHCP Offer、DHCP ACK和DHCP NAK报文。当然,如果是由DHCP中继器转的报文,则都是以单播方式发送的。另外,IP地址续约、IP地址释放的相关报文都是采用单播方式进行发送的。
⑧、Ciaddr:DHCP客户端的IP地址。仅在DHCP服务器发送的ACK报文中显示,因为在得到DHCP服务器确认前,DHCP客户端是还没有分配到IP地址的。
⑨、Yiaddr:DHCP服务器分配给客户端的IP地址。仅在DHCP服务器发送的Offer和ACK报文中显示,其他报文中显示为0。
⑩、Siaddr:下一个为DHCP客户端分配IP地址等信息的DHCP服务器IP地址(分布式的DHCP服务器集群才会使用),仅在DHCP Offer、DHCP ACK报文中显示,其他报文中显示为0(用于bootstrap过程中的IP地址)。
⑪、Giaddr:DHCP客户端发出请求报文后经过的第一个DHCP中继的IP地址。如果没有经过DHCP中继,则显示为0。(转发代理(网关)IP地址)
⑫、Chaddr:DHCP客户端的MAC地址。在每个报文中都会显示对应DHCP客户端的MAC地址。
⑬、Sname:为DHCP客户端分配IP地址的DHCP服务器名称(DNS域名格式),在Offer和ACK报文中显示发送报文的DHCP服务器名称,其他报文显示为0。
⑭、File:DHCP服务器为DHCP客户端指定的启动配置文件名称及路径信息。仅在DHCP Offer报文中显示,其他报文中显示为空。
⑮、Options:可选项字段,长度可变,格式为"代码+长度+数据",规则如下:a、 如果Option没有值,则只有标志位之类的内容,则以一个字节表示;b、如果Opiton有值,即Opiton是以下name-value对,则Opiton需要多个字节表示,其中第一个字节表示 option的名字,第二字节表示value的长度,第三个字节开始表示value。DHCP协议从Bootp协议拓展而来,DHCP报文也是有Bootp报文发展而来。但是DHCP协议在Bootp协议之上添加了许多功能,其报文也需要有一定的拓展。如果Bootp报文不能满足的内容,就以Options的形式存在于DHCP报文中。

本文章引用的文献和相关资料如下:
https://blog.csdn.net/zzd_zzd/article/details/88372014

浙公网安备 33010602011771号