概述:
动态主机配置协议DHCPv4(Dynamic Host Configuration Protocol version 4)是一种用于集中对用户IP地址进行动态管理和配置的技术,运用于IPv4的环境下。
DHCP采用客户端/服务器通信模式,由客户端(DHCP Client)向服务器(DHCP Server)提出配置申请,服务器返回为客户端分配的配置信息(包括IP地址、缺省网关、DNS Server、WINS Server等参数),可以实现IP地址动态分配,以及其他网络参数的集中配置管理。
角色:
DHCP客户端:通过DHCP协议请求获取IP地址等网络参数的设备。例如,IP电话、PC、手机、无盘工作站等。
DHCP服务器:负责为DHCP客户端分配网络参数的设备。
DHCP中继(可选):负责转发DHCP服务器和DHCP客户端之间的DHCP报文,协助DHCP服务器向DHCP客户端动态分配网络参数的设备。
DHCP报文类型和格式:
报文类型:
- DHCP Discover:由客户端来查找可用的服务器。
- DHCP offer:服务器用来响应客户端的DHCP Discover报文,并指定相应的配置参数。
- DHCP Resquet:由客户端发送给服务器来请求配置参数或者请求配置确认或者续借租期。
- DHCP ACK:由服务器到客户端,含有配置参数包括IP地址。
- DHCP Decline:当客户端发现地址已经被使用时,用来通知服务器。
- DHCP Inform:客户端已经有IP地址时用它来向服务器请求其他的配置参数。
- DHCP NAK:由服务器发送给客户端来报名客户端的地址请求不正确或者租期已过期。
- DHCP Release:客户端要释放地址时用来通知服务器。
报文格式:
字段解析:
从零获取地址四个阶段:
主要有4个阶段:发现阶段,提供阶段,请求阶段,确认阶段。
发现阶段: discover报文
- 当客服端运行了以后,会发送一个广播帧,这个广播帧的源MAC地址为PC1的MAC地址,类型字段为0x0800,载荷数据为一个广播IP报文,目的IP地址为255.255.255.255的有限广播地址,源IP地址为0.0.0.0,协议字段为0x11,载荷数据为一个UDP报文。该UDP报文的目的端口号为67,源端口号为68,载荷数据为一个DHCP发现消息。
- DHCP DISCOVER报文中携带了客户端的MAC地址( DHCP DISCOVER报文中的chaddr字段)、需要请求的参数列表选项( Option55中填充的内容:标识了客户端需要从服务器获取的网络配置参数)、广播标志位( DHCP DISCOVER报文中的flags字段,表示客户端请求服务器以单播或广播形式发送响应报文)等信息。
- 与PC1处于同一个二层网络中的所以设备都会受到整个广播帧(除了交换机),当上传到了传输层以后,只有运行了server的设备才回识别出目的端口号67,并将消息送往DHCP应用层处理,如果没有运行的话就会直接丢弃。
- 所以运行了DHCP server的设备都会进行回复。
- 如果客户端没有收到响应,有一些列的重传机制。
提供阶段: offer报文
- 这是服务器向客户端提供IP地址的阶段,每个收到了请求消息的服务器都会从自己的地址池里选出一个合适的IP地址,并通过DHCP offer报文将这个IP地址发送给DHCP 客服端。DHCP offer报文里面携带了希望分配给指定MAC地址客户端(chaddr字段)的IP地址(DHCP报文中的yiaddr字段)及其租期等配置参数。
- DHCP消息封装在目的端口号为68,源端口号为67的UDP报文中。目的IP地址为255.255.255.255,源IP地址为自己的地址,该IP报文也是封装在一个广播帧或者单播帧里的。
- 采用广播方式的情况下,同一网段的所有终端都会接收到offer消息,但是因为在这个消息中有一个chaddr字段,该字段表示发起discover请求客户端的MAC地址没,终端设备可以以此判断与自身MAC地址是否相同,分辨释放是给自己的offer报文。
DHCP offer报文到底是单播还是广播,请参考此解释:
https://blog.csdn.net/tushanpeipei/article/details/112517101
请求阶段: request报文
- 在提供阶段中,客服端可能收到多个回复消息,但是只会选择第一个接收到的消息做回复表示需要此服务器提供的IP地址。
- 于是客户端会发出一个广播帧,格式与第一个发现阶段出发的一样,UDP的载荷数据为DHCP回复消息(里面带有一个服务器的标识(option54),表示只接受选的服务器提供的IP地址),表示愿意接收此IP地址,所以二层网络的服务器都收到了,在收到分析了消息后,只会有真正提供的设备知道了自己的被使用,其他的也知道了自己提供的被拒绝了,于是这些服务器就会收回当初给予客户端的offer,将IP地址重新加入地址池中。
- 使用广播帧而不是单播的原因是,告知其他DHCP服务器可以收回offer报文中的地址。
确认阶段: Ack或者Nak报文
- 服务器会向客户端发送一个DHCP ACK报文,可以为广播或者单播报文,具体选择方式和offer报文一样。当客服端收到此消息后,就会获得此IP地址。
- DHCP客户端收到DHCP ACK报文,会广播发送免费ARP报文,探测本网段是否有其他终端使用服务器分配的IP地址,如果在指定时间内没有收到回应,表示客户端可以使用此地址。如果收到了回应,说明有其他终端使用了此地址,客户端会向服务器发送DECLINE报文,并重新向服务器请求IP地址,同时,服务器会将此地址列为冲突地址。当服务器没有空闲地址可分配时,再选择冲突地址进行分配,尽量减少分配出去的地址冲突。
- 但是如果因为一些情况,失败了(例如协商出错或者由于发送REQUEST过慢导致服务器已经把此地址分配给其他客户端),服务器就会发送一个DHCP Nak消息,客户端收到消息后,就需要重新从第一阶段重新申请了。
IP地址续约和释放过程:
IP地址续约过程:
DHCP服务器采用动态分配机制给客户端分配IP地址时,分配出去的IP地址有租期限制。DHCP客户端向服务器申请地址时可以携带期望租期,服务器在分配租期时把客户端期望租期和地址池中租期配置比较,分配其中一个较短的租期给客户端。租期时间到后服务器会收回该IP地址,收回的IP地址可以继续分配给其他客户端使用。这种机制可以提高IP地址的利用率,避免客户端下线后IP地址继续被占用。如果DHCP客户端希望继续使用该地址,需要更新IP地址的租期(如延长IP地址租期)。
当租期达到50%(T1)时,DHCP客户端会自动以单播的方式向DHCP服务器发送DHCP REQUEST报文,请求更新IP地址租期。如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功(即租期从0开始计算);如果收到DHCP NAK报文,则重新发送DHCP DISCOVER报文请求新的IP地址。
当租期达到87.5%(T2)时,如果仍未收到DHCP服务器的应答,DHCP客户端会自动以广播的方式向DHCP服务器发送DHCP REQUEST报文,请求更新IP地址租期。如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功(即租期从0开始计算);如果收到DHCP NAK报文,则重新发送DHCP DISCOVER报文请求新的IP地址。
如果租期时间到时都没有收到服务器的回应,客户端停止使用此IP地址,重新发送DHCP DISCOVER报文请求新的IP地址。
客户端在租期时间到之前,如果用户不想使用分配的IP地址(例如客户端网络位置需要变更),会触发DHCP客户端向DHCP服务器发送DHCP RELEASE报文,通知DHCP服务器释放IP地址的租期。DHCP服务器会保留这个DHCP客户端的配置信息,将IP地址列为曾经分配过的IP地址中,以便后续重新分配给该客户端或其他客户端。
客户端可以通过发送DHCP INFORM报文向服务器请求更新配置信息。
IP地址释放过程:
DHCP客户端不再使用分配的IP地址时,会主动向DHCP服务器发送DHCP RELEASE报文,通知DHCP服务器释放IP地址的租约。DHCP服务器会保留这个DHCP客户端的配置信息,以便该客户端重新申请地址时,重用这些参数。
DHCP客户端重用曾经分配的IP地址:
如上图所示,DHCP客户端重新登录网络时,主要通过以下几个步骤与DHCP服务器建立联系:
- 重新登录网络是指客户端曾经分配到可用的IP地址,再次登录网络时IP地址还在相应的租期之内。客户端不需要再发送DHCP DISCOVER报文,而是直接发送包含前一次分配的IP地址的DHCP REQUEST请求报文,即报文中的Option50(请求的IP地址选项)字段填入曾经使用过的IP地址。
- DHCP服务器收到DHCP REQUEST报文后,如果客户端申请的地址没有被分配,则返回DHCP ACK确认报文,通知该DHCP客户端继续使用原来的IP地址。
- 如果此IP地址无法再分配给该DHCP客户端使用(例如已分配给其它客户端),DHCP服务器将返回DHCP NAK报文。客户端收到后,重新发送DHCP DISCOVER报文请求新的IP地址。
DHCP中继:
目的:
DHCP Relay是DHCP中继,它是为解决服务器和客户端不在同一个网段而提出的,提供了对DHCP广播报文的透明传输功能,能够把DHCP客户端的广播报文透明地传送到其它网段的DHCP服务器上,同样也能够把DHCP服务器端的应答报文透明地传送到其它网段的DHCP客户端。
在实际网络环境中,DHCP中继功能一般是在路由器设备某个具体的接口上实现的。需要为该接口配置IP中继地址,用来指定DHCP服务器。IP中继地址是指在作为DHCP中继的设备上指定的DHCP服务器的IP地址。当配置DHCP中继功能时,从该接口上收到的DHCP广播报文被送到指定服务器。
地址申请过程:
一、发现阶段:
DHCP中继检查DHCP报文中的hops字段,如果大于16,则丢弃DHCP报文;否则,将hops字段加1(表明经过一次DHCP中继),并继续下面的操作。DHCP报文中的hops字段表示DHCP报文经过的DHCP中继的数目,该字段由客户端或服务器设置为0,每经过一个DHCP中继时,该字段加1。hops字段的作用是限制DHCP报文所经过的DHCP中继的数目。目前,华为设备最多支持DHCP客户端与服务器之间有存在16个中继。
检查DHCP报文中的giaddr字段。如果是0,将giaddr字段设置为接收DHCP DISCOVER报文的接口IP地址。如果不是0,说明之间不是第一个中继设备,则不修改该字段,继续下面的操作。
DHCP报文中的giaddr字段标识客户端网关的IP地址。如果服务器和客户端不在同一个网段且中间存在多个DHCP中继,当客户端发出DHCP请求时,第一个DHCP中继会把自己的IP地址填入此字段,后面的DHCP中继不修改此字段内容,DHCP服务器会根据此字段来判断出客户端所在的网段地址,从而为客户端分配该网段的IP地址。
将DHCP报文的目的IP地址改为DHCP服务器或下一跳中继的IP地址,源地址改为中继连接客户端的接口地址,通过路由转发将DHCP报文单播发送到DHCP服务器或下一跳中继。
如果DHCP客户端与DHCP服务器之间存在多个DHCP中继,后面的中继接收到DHCP DISCOVER报文的处理流程同前面所述。
二、提供阶段
DHCP服务器接收到DHCP DISCOVER报文后,选择与报文中giaddr字段为同一网段的地址池,并为客户端分配IP地址等参数然后向giaddr字段标识的DHCP中继单播发送DHCP OFFER报文。
检查报文中的giaddr字段,如果不是接口的地址,则丢弃该报文;否则,DHCP中继检查报文的广播标志位。如果广播标志位为1,则将DHCP OFFER报文广播发送给DHCP客户端;否则将DHCP OFFER报文单播发送给DHCP客户端。
选择阶段
三、选择阶段和确认阶段的过程同无中继场景。
参考资料:华为hedex文档、华为交换机学习指南