
三、DHCP原理
1、DHCP服务器给首次接入网络的客户端分配网络参数的工作原理
下面分别从无中继和有中继两个场景介绍DHCP客户端首次接入网络的工作原理:
1、无中继场景时DHCP客户端首次接入网络的工作原理
DHCP客户端首次接入网络时,通过下图1所示的四个阶段与DHCP服务器交互DHCP报文,从而获取到IP地址等网络参数。
DHCP报文是基于UDP协议传输的。DHCP客户端向DHCP服务器发送报文时采用67端口号,DHCP服务器向DHCP客户端发送报文时采用68端口号。
图1 无中继场景时DHCP客户端首次接入网络的报文交互示意图
1、发现阶段,即DHCP客户端发现DHCP服务器的阶段。
DHCP客户端发送DHCP DISCOVER(发现)报文来发现DHCP服务器。由于DHCP客户端不知道DHCP服务器的IP地址,所以DHCP客户端以广播方式发送DHCP DISCOVER报文(目的IP地址为255.255.255.255),同一网段内所有DHCP服务器或中继都能收到此报文。
DHCP DISCOVER报文中携带了客户端的MAC地址(DHCP DISCOVER报文中的chaddr字段)、需要请求的参数列表选项(Option55中填充的内容,标识了客户端需要从服务器获取的网络配置参数)、广播标志位(DHCP DISCOVER报文中的flags字段,表示客户端请求服务器以单播或广播形式发送响应报文)等信息。
DHCP DISCOVER报文中的Option字段定义了网络参数信息,不同Option值代表了不同的参数。
例如,Option3表示客户端的网关地址选项(当客户端发送的DHCP DISCOVER报文的Option55中填充了选项值3,就表示客户端希望从服务器获取网关地址);Option53表示DHCP报文类型(例如,DHCP DISCOVER报文)。
Option选项分为知名选项和自定义选项,关于知名选项的含义请参见RFC2132。除了RFC2132里面定义的知名选项,不同厂商可以根据需求自己定义自定义选项,例如,Option43为厂商特定信息选项。Option选项的详细介绍请参见后面DHCP Options字段选项。
RFC2131中定义了DHCP报文的广播标志字段(flags),当标志字段的最高位为0时,表示客户端希望服务器以单播方式发送DHCP OFFER/DHCP ACK报文;当标志字段的最高位为1时,表示客户端希望服务器以广播方式发送DHCP OFFER/DHCP ACK报文。
2、提供阶段,即DHCP服务器提供网络配置信息的阶段。
位于同一网段的DHCP服务器都会接收到DHCP DISCOVER报文,每个DHCP服务器上可能会部署多个地址池,服务器通过地址池来管理可供分配的IP地址等网络参数。
服务器接收到DHCP DISCOVER报文后,选择跟接收DHCP DISCOVER报文接口的IP地址处于同一网段的地址池,并且从中选择一个可用的IP地址,然后通过DHCP OFFER(提供)报文发送给DHCP客户端。
DHCP OFFER报文里面携带了希望分配给指定MAC地址客户端的IP地址(DHCP报文中的yiaddr字段)及其租期等配置参数。
通常,DHCP服务器的地址池中会指定IP地址的租期,如果DHCP客户端发送的DHCP DISCOVER报文中携带了期望租期,服务器会将客户端请求的期望租期与其指定的租期进行比较,选择其中时间较短的租期分配给客户端。
DHCP服务器会把地址池中IP地址根据不同状态分成不同的IP地址列表:把未分配出去的IP地址放在可分配的IP地址列表中;把已经分配出去的IP地址放在正在使用IP地址列表中;把处于冲突状态的IP地址放在冲突IP地址列表中;把不能分配的IP地址放在不能分配IP地址列表中。
DHCP服务器在地址池中为客户端选择IP地址的优先顺序如下:
1、DHCP服务器上已配置的与客户端MAC地址静态绑定的IP地址。
2、DHCP服务器上记录的曾经分配给客户端的IP地址。
3、客户端发送的DHCP DISCOVER报文中Option50字段(请求IP地址选项)指定的地址。
4、按照IP地址从大到小的顺序查询,选择最先找到的可供分配的IP地址。
5、如果未找到可供分配的IP地址,则依次查询超过租期、处于冲突状态的IP地址,如果找到可用的IP地址,则进行分配;否则,发送DHCP NAK(否定应答)报文作为应答,通知DHCP客户端无法分配IP地址。DHCP客户端需要重新发送DHCP DISCOVER报文来申请IP地址。
设备支持在地址池中排除某些不能通过DHCP机制进行分配的IP地址。
例如,客户端所在网段已经手工配置了地址为192.168.1.100/24的DNS服务器,DHCP服务器上配置的网段为192.168.1.0/24的地址池中需要将192.168.1.100的IP地址排除,不能通过DHCP分配此地址,否则,会造成地址冲突。
为了防止分配出去的IP地址跟网络中其他客户端的IP地址冲突,DHCP服务器在发送DHCP OFFER报文前可以通过发送源地址和目的地址都为预分配出去IP地址的ICMP ECHO REQUEST报文对分配的IP地址进行地址冲突探测。
如果在指定的时间内没有收到应答报文,表示网络中没有客户端使用这个IP地址,可以分配给客户端;如果指定时间内收到应答报文,表示网络中已经存在使用此IP地址的客户端,则把此地址列为冲突地址,然后等待重新接收到DHCP DISCOVER报文后按照前面介绍的选择IP地址的优先顺序重新选择可用的IP地址。
注意,此阶段DHCP服务器分配给客户端的IP地址不一定是最终确定使用的IP地址,因为DHCP OFFER报文发送给客户端等待16秒后如果没有收到客户端的响应,此地址就可以继续分配给其他客户端。通过下面的选择阶段和确认阶段后才能最终确定客户端可以使用的IP地址。
3、选择阶段,即DHCP客户端选择IP地址的阶段。
因为DHCP DISCOVER报文是广播发送的,所以如果同一网段内存在多个DHCP服务器,接收到DHCP DISCOVER报文的服务器都会回应DHCP OFFER报文。如果有多个DHCP服务器向DHCP客户端回应DHCP OFFER报文,则DHCP客户端一般只接收第一个收到的DHCP OFFER报文,然后以广播方式发送DHCP REQUEST(请求)报文,该报文中包含客户端想选择的DHCP服务器标识符(即Option54)和客户端IP地址(即Option50,填充了接收的DHCP OFFER报文中yiaddr字段的IP地址)。
以广播方式发送DHCP REQUEST报文,是为了通知所有的DHCP服务器,它将选择某个DHCP服务器提供的IP地址,其他DHCP服务器可以重新将曾经分配给客户端的IP地址分配给其他客户端。
4、确认阶段,即DHCP服务器确认所分配IP地址的阶段。
当DHCP服务器收到DHCP客户端发送的DHCP REQUEST报文后,DHCP服务器回应DHCP ACK(确认)报文,表示DHCP REQUEST报文中请求的IP地址(Opton50填充的)分配给客户端使用。
DHCP客户端收到DHCP ACK报文,会广播发送免费ARP报文,探测本网段是否有其他终端使用服务器分配的IP地址,如果在指定时间内没有收到回应,表示客户端可以使用此地址。如果收到了回应,说明有其他终端使用了此地址,客户端会向服务器发送DECLINE报文,并重新向服务器请求IP地址,同时,服务器会将此地址列为冲突地址。当服务器没有空闲地址可分配时,再选择冲突地址进行分配,尽量减少分配出去的地址冲突。
当DHCP服务器收到DHCP客户端发送的DHCP REQUEST报文后,如果DHCP服务器由于某些原因(例如协商出错或者由于发送REQUEST过慢导致服务器已经把此地址分配给其他客户端)无法分配DHCP REQUEST报文中Opton50填充的IP地址,则发送DHCP NAK报文作为应答,通知DHCP客户端无法分配此IP地址。DHCP客户端需要重新发送DHCP DISCOVER报文来申请新的IP地址。
2、有中继场景时DHCP客户端首次接入网络的工作原理
DHCP客户端首次接入网络时,通过下图2所示的四个阶段与DHCP中继、DHCP服务器交互DHCP报文,从而获取到IP地址等网络参数。DHCP客户端和DHCP服务器工作原理跟无中继场景相同,此处不详细介绍,具体请参考无中继场景时DHCP客户端首次接入网络的工作原理。
下面仅针对DHCP中继的工作原理进行介绍。
图2 有中继场景时DHCP客户端首次接入网络的报文交互示意图
1、发现阶段
DHCP中继接收到DHCP客户端广播发送的DHCP DISCOVER报文后,进行如下处理:
检查DHCP报文中的hops字段,如果大于16,则丢弃DHCP报文;否则,将hops字段加1(表明经过一次DHCP中继),并继续下面的操作。
DHCP报文中的hops字段表示DHCP报文经过的DHCP中继的数目,该字段由客户端或服务器设置为0,每经过一个DHCP中继时,该字段加1。hops字段的作用是限制DHCP报文所经过的DHCP中继的数目。目前,设备最多支持DHCP客户端与服务器之间有存在16个中继。
检查DHCP报文中的giaddr(网关IP地址)字段。如果是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报文的处理流程同前面所述。
2、提供阶段
DHCP服务器接收到DHCP DISCOVER报文后,选择与报文中giaddr字段为同一网段的地址池,并为客户端分配IP地址等参数(选择原则同无中继场景时DHCP客户端首次接入网络的工作原理),然后向giaddr字段标识的DHCP中继单播发送DHCP OFFER报文。
DHCP中继收到DHCP OFFER报文后,会进行如下处理:
检查报文中的giaddr字段,如果不是接口的地址,则丢弃该报文;否则,继续下面的操作。
DHCP中继检查报文的广播标志位。如果广播标志位为1,则将DHCP OFFER报文广播发送给DHCP客户端;否则将DHCP OFFER报文单播发送给DHCP客户端。
3、选择阶段
中继接收到来自客户端的DHCP REQUEST报文的处理过程同“发现阶段”。
4、确认阶段
中继接收到来自服务器的DHCP ACK报文的处理过程同“提供阶段”。
2、DHCP客户端重用曾经使用过的地址的工作原理
DHCP客户端非首次接入网络时,可以重用曾经使用过的地址。下面以无中继场景为例介绍DHCP客户端重用曾经使用过地址的工作原理。有中继场景的区别在于DHCP中继的报文处理,其处理过程参见DHCP服务器给首次接入网络的客户端分配网络参数的工作原理。
是否支持重用曾经使用过的IP地址,因不同客户端而异。下面的DHCP客户端以PC为例。
通过下图1所示的两个阶段与DHCP服务器交互DHCP报文,从而可以重新获取之前使用的IP地址等网络参数。
图1 DHCP客户端重用曾经使用过的IP地址的报文交互过程
客户端广播发送包含前一次分配的IP地址的DHCP REQUEST报文,报文中的Option50(请求的IP地址选项)字段填入曾经使用过的IP地址。
DHCP服务器收到DHCP REQUEST报文后,根据DHCP REQUEST报文中携带的MAC地址来查找有没有相应的租约记录,如果有则返回DHCP ACK报文,通知DHCP客户端可以继续使用这个IP地址。否则,保持沉默,等待客户端重新发送DHCP DISCOVER报文请求新的IP地址。
3、DHCP客户端更新租期的工作原理
DHCP服务器采用动态分配机制给客户端分配IP地址时,分配出去的IP地址有租期限制。DHCP客户端向服务器申请地址时可以携带期望租期,服务器在分配租期时把客户端期望租期和地址池中租期配置比较,分配其中一个较短的租期给客户端。
租期时间到后服务器会收回该IP地址,收回的IP地址可以继续分配给其他客户端使用。这种机制可以提高IP地址的利用率,避免客户端下线后IP地址继续被占用。如果DHCP客户端希望继续使用该地址,需要更新IP地址的租期(如延长IP地址租期)。
下面分别从无中继和有中继介绍DHCP客户端更新租期的工作原理:
1、无中继时DHCP客户端更新租期的工作原理
DHCP客户端更新租期的过程如下图1所示。
图1 DHCP客户端更新租期示意图
当租期达到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报文向服务器请求更新配置信息。
2、有中继时DHCP客户端更新租期的工作原理
DHCP客户端通过中继更新租期的过程如下图2所示。
当租期达到50%(T1)时,DHCP客户端会自动以单播的方式向DHCP服务器发送DHCP REQUEST报文,请求更新IP地址租期。如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功(即租期从0开始计算);如果收到DHCP NAK报文,则重新发送DHCP DISCOVER报文请求新的IP地址。
当租期达到87.5%(T2)时,如果仍未收到DHCP服务器的应答,DHCP客户端会自动以广播的方式向DHCP中继发送DHCP REQUEST报文,DHCP中继再以单播方式向DHCP服务器发送DHCP REQUEST报文(中继收到报文的处理过程请参见DHCP服务器给首次接入网络的客户端分配网络参数的工作原理),请求更新IP地址租期。如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功(即租期从0开始计算);如果收到DHCP NAK报文,则重新发送DHCP DISCOVER报文请求新的IP地址。
如果租期时间到时都没有收到服务器的回应,客户端停止使用此IP地址,重新发送DHCP DISCOVER报文请求新的IP地址。



本文地址:http://www.023wg.com/207.html
版权声明:若无注明,本文皆为“Swiers思唯网络博客”原创,转载请保留文章出处。

