DHCP协议说明书
dhcp协议说明书
1 dhcp协议介绍
动态主机配置协议(dynamic host configuration protocol)属于应用层,是基于bootp(bootstrap protocol)的,bootp和rarp类似,是用于相对静态的环境,其中每个主机都有一个永久的网络连接。管理人员创建一个bootp配置文件来定义每个主机的bootp参数。在计算机经常移动和实际计算机数目超过了可获得的ip主机地址时,这种只提供从主机标识到主机参数的静态映射就不适用了。为此制订了dhcp,它加入了自动分配可再利用的地址和附加的配置选项的能力。dhcp从两个方式上扩充了bootp,第一,dhcp可使计算机用一个消息获取它所需要的所有配置信息,即传送配置信息的协议;第二,dhcp允许计算机快速、动态的获取ip地址,即动态分配ip地址的机制。
dhcp建立在client-server模型上。其中指定的dhcp server分配网络地址并向动态配置的主机传送配置参数。只有当系统管理员明确的配置主机作为dhcp服务器时,主机才能作为服务器来工作。
dhcp支持三种类型的地址分配:自动分配方式中dhcp给主机指定一个永久的ip地址;动态分配方式中dhcp给主机指定一个有时间限制的ip地址,到时间或主机明确表示放弃这个地址时,这个地址可以被其他的主机使用;手工分配方式中主机的ip地址是由网络管理员指定的,dhcp只是把指定的ip地址告诉主机。在这三种方式中,只有动态分配的方式可以对已经分配给主机但现在此主机已经不用的ip地址重新加以利用。这样,在给一台临时连入网络的主机分配地址或者在一组不需要永久的ip地址的主机中共享一组有限的ip地址时,动态分配显得特别有用。当一台新主机要永久的接入一个网络时,而网络的ip地址非常有限,为了将来这台主机被淘汰时能回收ip地址,这种情况下动态分配也是一个很好的选择。
dhcp的消息格式是建立在bootp消息格式上的,这样可以利用bootp的中继代理功能来避免在每个物理网络都建立一个dhcp server,同时还允许现有的bootp client使用dhcp server。
2 dhcp的实现
2.1 客户机和服务器的报文交换
2.1.1 动态分配地址
动态地址分配是dhcp的最重要和新颖的功能。不像bootp所用的静态地址分配,动态地址分配不是一对一的映射,而且服务器不需要预先知道客户机的身份。特别的,可配置dhcp服务器使得任意一个机器都可获取ip地址并开始通信。因此,dhcp使得设计自动配置的系统成为可能。一台计算机上网后,它使用dhcp获取一个ip地址,然后配置其tcp/ip软件使用此地址。当然,自动配置受到管理员的限制——由管理员决定是否允许每个dhcp服务器自动配置。
为是自动配置成为可能,dhcp服务器一开始就拥有网络管理员交给它管理的一组ip地址。管理员定义服务器操作的规则。dhcp客户机通过与服务器交换信息协商地址的使用。在交换中,服务器为客户机提供地址,客户机确认它已接受此地址。一旦客户机接收了一个地址,它就开始使用此地址用于通信。
不像静态地址分配为每个特定主机分配一个永久地址,动态地址分配是临时的。dhcp服务器将一个地址在有限时期内租给一个客户机。服务器在地址分配时指定租用期。在租用期间,服务器不会将同一个地址租给其他客户机。但在租用期结束时,客户机必须更新租期或停止使用地址。
一个租用期的最优时间与特定网络和特定主机的需求有关。对于一个变动很快的网络,为了保证地址能尽快的被再利用,租用期必须短,相反,对一个相对固定的网络,租用期应该长些。为了适应各种可能的环境,dhcp不指定租用期的固定长度,而是由协议让客户机申请某一个租用期,并由服务器通知客户机它认可的租用期。因此,管理员可决定应该给一个客户机分配地址多长时间。特别的,dhcp服务器保留一个不定值,允许像bootp分配的永久地址一样任意延长租用期。
客户机为了分配地址和服务器进行报文交换的过程如下:
1、客户机在其子网内广播一个dhcpdiscover报文,此报文中包含关于网络地址和租用期选项的值,如果客户机和服务器不在一个子网内,则bootp中继代理会把这个报文传给服务器。
2、每个收到这个报文的服务器广播一个包含可提供的网络地址和其他配置信息的dhcpoffer报文。
3、客户机收到一个或多个服务器的dhcpoffer报文后,根据一定的条件从中选出一个,并向选定的服务器发送dhcprequest报文。在这个请求报文中必须包含一个服务器标识以指明被选中的服务器。如果客户机在定时器超时之前没有收到dhcpoffer报文,则重发dhcpdiscover报文。
4、服务器在收到dhcprequest报文后,如果可以满足请求报文中的请求则发回一个dhcpack报文作为响应,如果不能满足请求则发回dhcpnak报文作为响应。服务器在dhcpoffer中提供给客户机的地址不能提供给另外一个客户机,但如果服务器没有收到客户机的dhcprequest报文则可以把在dhcpoffer中提供给客户机的地址提供给另外的客户机。
5、客户机在收到包含配置参数的dhcpack报文后,对报文中提供的配置参数进行检查,同时进行配置,如果发现报文中有错误则客户机发送一个dhcpdecline报文并重新开始整个过程。如果客户机收到dhcpnak报文则重新开始整个过程。
6、客户机可以通过向服务器发送dhcprelease报文来释放地址。
2.1.2 地址获取状态
当客户机使用dhcp获取其ip地址时,它处于六个状态之一。如图所示:
当客户机第一次启动时,它进入initialize(初始化)状态。为了开始获取一个ip地址,客户机先与本地网络上所有dhcp服务器联系,为此,客户机广播一个dhcpdiscover报文,并转移到select(选择)状态。由于协议是对bootp的扩充,客户机在一个udp数据报中发送dhcpdiscover报文,udp数据报中目的端口设为bootp端口(即端口67)。本地网上所有dhcp服务器接收报文,那些被设计成能响应特定客户机的服务器发送一个dhcpoffer报文。因此,客户机可能收到零个或多个响应。
处于select状态时,客户机从dhcp服务器收集dhcpoffer响应。每个响应提供了用于客户机的配置信息,还有服务器可提供租用给客户机的一个ip地址。客户机必须选择其中一个响应(如第一个到达的响应),并与服务器协商租用。为此,客户机发送给服务器一个dhcprequest报文,并进入request状态。服务器为确认已接受请求并开始租用,服务器响应发出一个dhcpack报文。客户机收到确认后转移到bound(已绑定)状态,此时客户机可开始使用此地址。
(1)、早期租用终止
当客户机使用一个分配的地址时,它保持处于绑定状态。如果客户机有辅助存储器,客户机可以存储分配给它的ip地址,并在再次重启动时申请同一个地址。但在某些情况下,处于绑定状态的客户机可能发现它不再需要一个ip地址了,此时,dhcp允许客户机终止租用,不再等待租用期过期。这在服务器可以提供的ip地址比连到网络的计算机数少时显得特别重要。如果客户机不再需要ip地址时及时终止租用,服务器就可以将此地址分配给其他客户机。为了提早终止租用,客户机发送一个dhcprelease报文到服务器,释放地址是阻止客户机继续使用地址,所以,发送释放报文后,客户机必须不再使用此地址发送其他数据报。根据状态转移图所示的,发出dhcprelease报文的主机离开绑定状态,并且在使用ip地址前必须重新从初始化状态开始。
(2)、租用更新状态
当一个dhcp客户机获取地址时,它就转移到绑定状态。进入绑定状态以后,客户机设置三个定时器,控制租用更新、重新绑定和到期。一个dhcp服务器给客户机分配地址时,可为定时器指定确定的值;如果服务器未指定定时器值,客户机就使用默认值。第一个定时器的默认值通常是总租用期的一半。当第一个定时器到期,客户机必须尝试更新租用期。为请求更新,客户机发送一个dhcprequest报文到获得租用处的服务器,转移到更新状态等待响应。dhcprequest包含一个客户机正使用的ip地址,并请求服务机延长对此地址的租用。服务器可以用两种方式之一响应客户机的更新请求:指示客户机停止使用该地址或同意客户机继续使用此地址。如果服务器同意就发送dhcpack,在dhcpack中也可含有客户机定时器的新的数值。如果服务器不同意继续使用,它就发送一个dhcpnak,使客户机立即停止地址的使用。客户机收到dhcpack报文则返回到绑定状态继续使用地址,如果收到dhcpnak就立即停止使用地址并返回初始化状态。
第二个定时器在客户机进入绑定状态后开始设置,默认值为总租用期的87.5%,客户机发送请求报文后保持在更新状态等待服务器的响应,如果在第二个定时器到期之前还没有收到服务器的响应, 则第二个定时器到期时使客户机从更新状态转移到重新绑定状态,在转移时,客户机假定原来的服务器不可用,开始广播dhcprequest报文到本地网上的任意服务器。可为客户机提供服务的任意服务器可能响应肯定(即延长租用),或否定(即拒绝继续使用地址)。如果客户机收到一个肯定响应,它就返回到绑定状态并重置两个定时器。如果客户机收到否定响应,它就转移到初始化状态,并且停止使用ip地址,在继续使用ip地址前必须重新获取一个新地址。
如果客户机在重新绑定状态广播请求报文后在第三个定时器超时前还没有从任何
一个服务器收到响应,则客户机必须停止使用ip地址,返回到初始化状态,并开始申
请一个新地址。
2.1.3 获取多重地址
一个多地址的机器连接到多个网络,当这种机器启动时,它可能需要为它的每个接口获取配置信息。dhcp报文只提供一个接口的有关信息,因此有多个接口的计算机必须分开处理每个接口。在向服务器发送请求报文时,多地址客户机应该在报文中包含一个识别特定接口的值(如一个唯一的硬件地址)以便服务器能区分一个多地址主机发出的多个请求,这一点在通过中继代理请求配置信息时显得尤其重要。
2.2 客户机和服务器的动作
2.2.1 服务器的动作
dhcp服务器根据和客户机绑定的状态来处理收到的报文,服务器可以处理以下几种报文:dhcpdiscover、dhcprequest、dhcpdecline和dhcprelease。
当服务器收到一个dhcpdiscover报文,它要为请求的客户机分配一个网络地址。如果没有可以分配的第这则发回一个dhcpnak报文。如果有可以分配的地址,则这个地址可能是:客户机原来绑定的地址(这个地址必须在服务器可以分配的地址中);客户机申请的地址;服务器从可以分配的地址中选择的新地址。同时服务器还必须为客户机指定一个租用期,如果客户机在dhcpdiscover中没有指定租用期并且客户机已经分配了地址,服务器选择分配此地址时指定的租用期;如果客户机没有指定租用期并且客户机没有已经分配的地址,服务器选择一个缺省的租用期;如果客户机在dhcpdiscover中指定了租用期则服务器选择这个租用期或另外指定一个租用期。一旦地址和租用期确定了,服务器组建一个包含这些配置信息的dhcpoffer报文发回。
当服务器收到一个dhcprequest报文时,这个报文可能是客户机对dhcpoffer的响应,也可能是客户机在地址的租用期快满时发送的来请求延长租用期的。如果报文里包含一个“server identifier”选项则是客户机对dhcpoffer的响应,否则就是请求延长对已有地址的租用。
先考虑第一种情况,如果服务器是报文中“server identifier”选项指定的服务器,则服务器检查请求的参数是否能接受。如果请求可以接受则服务器纪录新的客户机绑定,并发送一个dhcpack报文给客户机。如果请求不能接收则发送一个dhcpnak报文。如果这个dhcprequest报文是发送给另外的服务器的,客户机选择了另外的服务器来获得配置信息,则此服务器丢弃保留的此客户机的配置信息,并释放分配给此客户机的地址。
对于第二种情况,如果请求的参数和分配此地址时协商的参数一致或者现在请求的参数可以接受,服务器发送一个dhcpack报文,否则发送一个dhcpnak报文。如果在“客户机ip地址”字段中的地址和服务器纪录中的ip地址不符,则服务器发送一个dhcpnak报文。
当服务器收到一个dhcpdecline报文时,说明客户机通过其他的方法发现服务器推荐的地址已经被使用了,此时服务器必须标记这个地址为已分配的,应该通知本地的系统管理员可能配置上有些错误。
当服务器收到一个dhcprelease报文时,服务器标志此地址为未分配,同时服务器应该保留此客户机的初始化参数以便以后用来响应此客户机的请求。
2.2.2 客户机的动作
客户机可以处理从服务器收到的以下几种报文:dhcpoffer、dhcpack和dhcpnak。
在初始化状态,客户机组建一个dhcpdiscover报文,把其中的客户机ip地址字段设为0x00000000。客户机还可以通过在此报文中加入参数请求选向来请求一些配置参数。在此报文中还包含客户机产生的一个随机数放到xid字段用来识别从服务器广播的响应。同时客户机纪录此时的本地时间以便以后计算租用期是否到期。如果客户机收到一个响应xid和发送的请求的xid不一致,客户机会不做任何处理丢弃这个报文。
客户机收集一段时间内的dhcpoffer报文,根据一定的依据从中选一个,提取服务器标识选项字段中的服务器的ip地址,然后检查其中提供的地址是否已经被使用,如果是则向服务器发送dhcpdecline报文。
在重绑定状态,客户机发送一个dhcprequest报文给服务器,其中客户机ip地址字段填上本机的地址。客户机可以通过在报文中加入请求参数标来请求其他具体的配置参数。客户机要产生一个随机数加入到xid字段以匹配请求和响应,同时要纪录此时本地的时间用来计算租用期是否到期。在报文中不能有server identifier选项,客户机以广播的方式发送这个报文。当客户机收到一个从服务器发回的匹配的dhcpack报文,客户机就配置好了并转移到绑定状态,客户机用发送请求时纪录的时间和响应中指定的租用期的长度的和的方式来表示租用期到期的时间。
如果客户机知道dhcp服务器的地址,则无论是在初始化状态还是在重绑定状态,客户机都用这个地址发送dhcpdiscover或dhcprequest报文而不用广播地址。如果没用收到响应,客户机就再利用广播地址发送请求。
3 dhcp的报文类型
dhcp使用bootp的报文格式,但修改了一些字段的内容和含义。dhcp报文格式如图所示:
0 8 16 24 31
op htype hlen 跳数(hops)
事务id
秒数 标志
客户机ip地址
你的ip地址
服务器ip地址
中继代理ip地址
客户机硬件地址(16个字节)...
服务器的主机名(64个字节)...
启动文件名(128个字节)...
选项(可变长)...
其中:自断op指明报文是请求(1)还是响应(2),字段htype和hlen指明网络硬件类型和硬件地址的长度(如10mb以太网类型为1,地址长度为6)。跳数(hops)项被客户机置为0,当通过中继代理启动时被中继代理使用。事务id(xid)是客户机选择的随机数,被客户机和服务器用来联系客户机和服务器之间的请求报文和响应报文。秒数字段报告客户机开始启动后消耗的时间秒数。客户机ip地址字段和其后的各字段包含了最重要的信息。未获得最大程度的灵活性,客户机尽量填写它所知道的信息并将剩余部分设为0。例如,客户机若知道它要获取信息的某个服务器的名字或地址,它可能填写服务器ip地址或服务器主机名字段。若这些字段非零,只有与名字或地址字段匹配的服务器才响应请求;若它们为零,接收请求并能够提供服务的的任意服务器都将响应。已经知道自己ip地址的客户机也可使用dhcp来获取启动文件信息,知道ip地址的客户机将地址置于客户机ip地址字段中,不知道的置0。如果客户机的ip地址为0,服务器在你的ip地址字段返回客户机的ip地址。服务器的ip地址字段时服务器在dhcpoffer、dhcpack和dhcpnak中返回的下一步将用到的dhcp服务器的地址。中继代理ip地址用在通过中继代理启动时指定中继代理的ip地址。启动文件名指定启动的文件,在dhcpdiscover报文中为null或generic,在dhcpoffer中为有效的、带有完整路径的文件名。
3.1 标志字段
报文中的标志字段的格式如下:
整个字段占16比特,其中,最左边比特被解释为广播请求,所有其它比特保留作将来用,必须被客户机设置为0,服务器和中继代理忽略这些比特。客户机在协议软件配置ip地址之前是不能收到单播的报文的,它通过在dhcpdiscover和dhcprequest报文里把标志字段里的广播请求位置位来向服务器或中继代理请求广播报文,服务器或中继代理收到这样的请求报文就会用广播的方式发回回应。当客户机的协议软件配置了ip地址之后,它就可以收到单播的报文了,此时它必须把广播请求位清零。
3.2 选项字段
报文中的选项字段是可变长的(除了选项0和选项255),最小长度是312个字节,这样,dhcp报文的最小长度是576个字节,主机准备接收的最小的ip数据报的长度。dhcp客户机可以通过“最大dhcp报文大小”来协商使用更大的dhcp报文。选项字段格式如下:
dhcp的选项字段和bootp的厂商特定区域字段的格式相同,并且dhcp理解所有为bootp定义的厂商特定信息。其中,代码字段唯一的标识一个选项,长度字段指定数据字段的长度,不包括代码字段和长度字段。
下图所示的是dhcp的报文类型选项:
其中,数据字段指定报文的类型,其含义如下:
类型字段 对应dhcp报文类型
1 dhcpdiscover
2 dhcpoffer
3 dhcprequest
4 dhcpdecline
5 dhcpack
6 dhcpnak
7 dhcprelease
3.3 选项过载
在dhcp报文头中,服务器主机名和启动文件名都占用较多的字节,如果一个报文中的这两个字段有一个或两个不含信息,空间就浪费了。为了使dhcp服务器将这两个字段用作其他选项,dhcp定义了一个选项过载(option overload)的选项,如果出现过载选项,该选项就告诉接收者忽略服务器主机名和启动文件字段的通常含义,转而察看字段中的选项。