动态主机配置协议分析报告.docx
《动态主机配置协议分析报告.docx》由会员分享,可在线阅读,更多相关《动态主机配置协议分析报告.docx(29页珍藏版)》请在冰豆网上搜索。
动态主机配置协议分析报告
动态主机配置协议(DHCP)
分析报告
版本号
生成日期
作者
部门
1.0
2002.7.5
杨恬
交换机中心
1.
前言
1.1目的
本文档主要分析了动态主机配置协议的原理,为开发DHCP服务器及中继代理提供理论依据。
1.2版本描述
版本号
描述
1.0
1.3词典
DHCP:
动态主机配置协议。
DHCP服务器:
为客户机动态分配IP地址及提供IP地址租用期和其他网络配置参数的网络设备。
DHCP中继代理:
这种网络设备的主要功能是接收客户机的DHCP请求报文,并向服务器转发请求报文;同时,接收服务器的响应报文,并向客户机转发报文。
1.4引用的标准、规范及其它文档
RFC2131DynamicHostConfigurationProtocol.
RFC0951BootstrapProtocol.
2.
DHCP概述
动态主机配置协议(DynamicHostConfigurationProtocol,DHCP)在TCP/IP网络上使客户机获得配置信息的协议,它是基于BOOTP协议,并在BOOTP协议的基础上添加了自动分配可用网络地址等功能。
这两个协议可以通过一些机制互操作。
DHCP向网络主机提供配置参数,它由两个基本部分组成:
一部分是向网络主机传送专用的配置信息,另一部分是给主机分配网络地址。
DHCP是基于客户/服务器模式的,这种模式下,专门指定的主机分配网络地址,传送网络配置参数给需要的网络主机,被指定的主机称为服务器。
我们以后将提供DHCP服务的主机称为服务器,把接收信息的主机称为客户。
不能随便谁都可以成为DHCP服务器,这需要管理员进行人为指定。
由于网络中硬件和软件的多样性,使得任何一台主机随便响应DHCP请求的问题得到了解决,如果有一台机器可以随便响应的话,它也无法给用户提供正确的配置参数,而配置TCP/IP协议的参数又那么多,因此使得这种任意的响应成了不可能的事情。
而分布式地分配网络地址要使用一些机制来防止地址重用,但是由于是分布式分配,有时真是防不胜防,无法从根本上杜绝网络地址冲突的问题。
DHCP支持三种IP地址分配方法。
第一种是自动分配,DHCP给用户分配一个永久的IP地址。
第二种是动态分配,在这种情况下,用户可以取得一个IP地址,但是是有时间限制的。
第三种是手工分配,在这种方法下,用户的IP地址是由管理员手工指定的,这种情况下,DHCP服务器只需要将这个指定的IP地址传送给用户即可。
至于用什么样的分配方法,不同的网络各不相同。
动态分配是唯一一种允许自动重用地址的机制。
因此,这种方法对于有临时上网用户,而且网络的IP地址资源又不是多得没法用的时候特别有用。
而手工指定对于管理不希望使用动态IP地址的用户十分方便,不会因为手工指定而和DHCP冲突或和别的已经分配的地址冲突。
DHCP是一种相对集中式的管理方式。
DHCP信息包的格式是基于BOOTP包格式的,这使得BOOTP客户可以访问DHCP服务器。
DHCP中使用了BOOTP的中继代理,这样就避免了在每个物理网段都设一个DHCP服务器的情况。
有许多协议与DHCP的功能相似,也同时为DHCP提供服务。
反向地址解析协议(ReverseAddressResolutionProtocol,RARP)用于发现网络地址和自动IP地址分配。
小文件传输协议(TrivialFileTransferProtocol,TFTP)用于从启动服务器传送启动镜象。
Internet控制信息协议(InternetControlMessageProtocol,ICMP)用于向主机发送有关附加路由器信息。
ICMP还被用于传送子网掩码信息和其它信息。
主机也可能通过ICMP的路由寻找功能定位路由器。
BOOTP是用于传送配置信息的方法,它是可扩展的,正式的扩展在一些配置参数中定义。
麻省理工学院的Athena工程中使用的网络信息协议(NetworkInformationProtocol,NIP)采用分布式动态IP地址分配。
资源定位协议(ResourceLocationProtocol,RLP)提供了高层服务定位。
由于Sun公司不喜欢工作站在启动时的漫长过程,所以使用了RARP,TFTP和远程过程调用(RPC)机制,并称之为"bootparams",这种机制是用来为无硬盘主机传送配置信息和操作系统代码。
一些Sun网络也在使用动态RARP(DRARP)和自动安装机制使新加入的主机自动配置。
在其它一些相关的工作中,路径最小传输单元(MTU)寻找算法使得寻找MTU的大小成为了可能。
地址解析协议(AddressResolutionProtocol,ARP)也被用于一种传输协议进行资源的定位和选择。
DHCP是用于向客户传送配置信息的,客户从DHCP服务器那里获得配置信息后应该可以和Internet上任何一台主机通信。
TCP/IP协议栈参数请在本文后面寻找。
在初始化一台主机时并不需要配置所有这些参数,客户和服务器可以通过一种商讨机制决定传送哪些参数。
DHCP允许(不要求)客户参数配置不直接与IP协议相关,而且它也不将最近加入的主机加入域名系统(DNS)中。
有一些名词需要解释一下,DHCP客户和DHCP服务器已经在前面说过了,这里就不再说明了。
BOOTP中继代理或中继代理是一台Internet主机或路由器,它用于在DHCP客户和DHCP服务器间传送配置信息。
绑定是一些配置参数,它至少应该包括IP地址,绑定由DHCP服务器管理。
3.DHCP的设计目标
1.DHCP应该是一种机制而不是策略,它必须允许本地系统管理员控制配置参数,本地系统管理员应该能够对所希望管理的资源进行有效地管理。
2.客户不需要进行手工配置,客户应该在不参与的情况下发现合适于本地机的配置参数,并利用这些参数加以配置。
3.不需要对单个客户配置网络。
在通常情况下,网络管理员没有必须输入任何预先设计好的用户配置参数。
4.DHCP不需要在每个子网上都要一个服务器,为了经济的原因,它DHCP服务器必须可以和路由器和BOOTP中继代理一起工作。
5.DHCP客户必须可能对多个DHCP服务器提供的服务作出响应。
出于网络稳定与安全的考虑,有时需要为网络加入多个DHCP服务器。
6.DHCP必须静态配置,而且必须以现存的网络协议实现。
7.DHCP必须能够和BOOTP中继代理互操作。
8.DHCP必须能够为现有的BOOTP客户提供服务。
下面几个设计目标是对于网络层参数的设计而言的,在网络层参数上,DHCP必须可以做到以下几点:
9.不允许有几个客户同时使用一个网络地址。
10.在DHCP客户重新启动后仍然能够保留它原先的配置参数,如果可能,客户应该被指定为相同的配置参数。
11.在DHCP服务器重新启动后仍然能够保留客户的配置参数,如果可能,即使DHCP机制重新启动,也应该能够为客户分配原有的配置参数。
12.能够为新加入的客户自动提供配置参数。
13.支持对特定客户永久固定分配网络地址。
4.协议内容
在下面我们看一下DHCP的具体问题。
从客户的观点来看,DHCP不过是BOOTP的扩展。
这样就可以使现有的BOOTP用户在不进行任何改动的情况下使用DHCP。
图一和表一描述了DHCP信息包的格式和信息包内每个字段的意义。
请注意括号内的数字,它表示此字段的大小。
BOOTP和DHCP的主要区别有两点,一点是DHCP对客户分配网络地址时不是无限期的,允许将网络地址重新分配给不同的客户机;第二点是DHCP在提供网络地址时还提供了其它配置参数。
下图定义了DHCP消息格式:
图1、DHCP报文格式
在DHCP中,将BOOTP的vendorextensions字段重新命名为option(选项)字段,而原来在BOOTP中的vendorextensions字段现在在DHCP中仅仅是一个选项。
DHCP定义了一个新的“客户标识”选项(clientidentifier),它是用来显式地将客户标识传送给DHCP服务器的。
这个改变是针对BOOTP信息包中'chaddr'域即作为BOOTP转发信息的硬件地址又作为用户信息的情况而进行的,消除chaddr的重载。
这个标记对于DHCP服务器来说没有什么意义,它可以是硬件地址,也可以是什么别的东西,反正只要是对于这个DHCP服务器管理的每个子网段内的客户是唯一的就可以了。
客户一旦在一个信息包中使用了这个选项,以后的信息包内的这个选项必须和第一次使用时一致,这样DHCP服务器才可以正确地辨识客户。
域
字节
描述
Op
1
消息op代码/消息类型1=BOOTREQUEST,2=BOOTREPLY
htype
1
硬件地址类型
hlen
1
硬件地址长度
hops
1
客户需要将这一项设置为零,当通过中继代理启动时可以供中继代理使用。
xid
4
操作ID,这是一个随机数,用于客户和服务器之间同步消息和消息的响应。
secs
2
由客户指定的时间,指的是开始地址获取和更新进行后的时间。
flags
2
请参阅图2。
ciaddr
4
用户IP地址,此字段仅当用户处于BOUND,RENEW或REBINDING状态和能够响应ARP请求时使用。
yiaddr
4
客户IP地址,由服务器为客户指定的IP地址。
siaddr
4
用于bootstrap过程中使用的下一个服务器的IP地址,由服务器在DHCPOFFER和DHCPACK中返回,在通常情况下,填入本地服务器的IP地址。
giaddr
4
中继代理IP地址,由中继代理在转发DHCP消息时填入接收消息的网络接口的IP地址,如果在此字段不为0,则保持不变。
chaddr
16
客户硬件地址
sname
64
可选的服务器主机名
file
128
启动文件名
options
不定
可选的参数字段
表1DHCP报文格式字段描述
在DHCP中siaddr字段用来说明客户机作下一步处理使用的网络地址,如果服务器准备提供下一步启动服务,在此字段中由服务器返回它自己的地址(比如,传送一个操作系统可执行文件)。
DHCP服务器总是在serveridentifier选项中返回它自己的地址。
options字段的长度不定,DHCP客户必须准备接收312字节的带有选项字段的DHCP消息,这就意味着客户机准备从服务器那里接收到长度大于576字节的包。
DHCP客户也可以使用最大DHCP包长度选项(maximumDHCPmessagesize)要求服务器传送的包长度在一定限度之内,这个选项可能扩展到file和sname字段。
在客户使用DHCP进行配置的时候,DHCP需要使用TCP/IP软件,在配置好IP地址之前,TCP/IP软件应该能够接收并转发发送到客户硬件地址上的IP包;DHCP服务器和BOOTP中继代理在TCP/IP软件未配置好之前不能向不能接收硬件单播报文的客户传送DHCP消息。
如果客户在TCP/IP软件未能配置好之前实在不能接收IP单播报文,DHCP可以使用“标记”域进行工作。
请注意下图中的那个B,它代表广播标记。
至于这个标记的具体内容,我们在文章的后面几节内讨论。
至于其它各位,它们是保留的,它们的值只能由客户设置为0。
服务器和中继代理不会理会这一字段的内容。
0123456789012345
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|B| 全为0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
B:
广播标记位
图2、flag字段格式
5.主要功能
5.1配置参数
前面已经提到过了,DHCP的一个重要功能就是能够向客户提供网络配置参数,这种存储模型实际上就是DHCP服务为每个客户保存了一个关键字,这个关键字中保存了用户特有的标记和客户的配置参数。
关键字可能是一个二元组(IP子网号,硬件地址),这种设计考虑到不同子网内的硬件地址可能是一样的,所以要加入一个子网号加以区别。
当然关键字也可以是(IP子网号,主机名),这是为了照顾客户机会经常在不同子网间转换,或者经常改变物理地址的情况。
在协议规定是,关键字需要是(IP子网号,物理地址),当然了,如果客户在信息包中显式地应用了“客户标记”选项的话就不这样使用了。
客户可以通过查询DHCP服务器取得配置信息。
5.2动态分配网络地址
DHCP的另外一个重要特点就是能够动态地分配网络地址,这种动态分配的机制是很简单的:
客户会要求使用某一网络地址一段时间,服务器在这一段时间内不会把这个地址分配给别的客户机。
当客户使用完这一地址后再次申请时,服务器总是优先将它使用过的地址再次分配给它。
我们把这种分配称为一种“租用”。
说到租用,当然了,客户也可以要求增加租用期,当客户不再使用这一地址时,就把它还给服务器。
客户也可以要求永久租用,这个永久可不是永远,当服务器觉得客户机可能已经不存在时,它可以再次把这一地址分配给别的机器使用。
当网络内地址不够用的时候,永久的分配就不可能了,当地址不够用的时候,由客户归还的地址还要被继续使用,这几乎是人人都可以想得到的,服务器可以使用配置信息库内的信息帮助它决定分配哪一个地址,比如说它可以选择最近最少使用的地址进行分配。
为了安全起见,服务器应该在分配前使用ICMP协议进行探测,保证这个地址没有机器使用,客户也应该能够使用一些协议(如ARP)探测新接收的地址是不是被人使用。
6.服务器客户协议
下面我们来说一下服务器客户协议的内容。
DHCP使用BOOTP消息格式,这种格式请见表1和图1。
在每个由客户发送到服务器消息的'op'字段中包括了一个BOOTREQUEST,而在服务器发送到客户消息内的'op'字段则包括了一个BOOTREPLY。
DHCP信息包内'options'字段包含了十进制数99,130,83和99,这几个值。
其余的地方是称为“选项”的标记参数。
应该注意其中的一个重要的选项“DHCP消息类型”选项,这一项必须在每个DHCP信息包中存在,其它的选项有的是必须的,有的不是必须的,有的根本就是可有可无。
在下文中,消息格式就以这一选项的内容决定。
6.1服务器客户之间的交互
在下面的表2和图3中描述了DHCP协议包中信息的意义以及DHCP客户与服务器交换信息的流程图。
下面我们就过程简述如下:
1.客户会首先进行广播,它在本子网段内广播一个DHCPDISCOVER消息,这个消息内可能包括了它希望租用的网络地方和租用时间。
BOOTP中继代理可以将这个消息传送到不在这个网段内的DHCP服务器上。
2.每个有空闲地址的DHCP服务器都响应这个消息,在响应消息中包括了可用的地址,这个地址在消息的'yiaddr'字段中,其它的配置参数在DHCP选项中。
服务器无需要保留已经分配的地址,虽然这样可能想起来更有效率。
在分配时,因为未保留已经分配的地址,服务器必须想办法知道这个地址未被别的客户使用,服务器可以使用ICMP协议的回应请求进行。
在分配地址时,服务器有时候可能需要使用BOOTP中继代理,这一点要在实现上给予支持。
下表是各种消息及其应用:
消息 功能
------- ---
DHCPDISCOVER-客户进行广播以确定本地可用的服务器。
DHCPOFFER -服务器给客户的应答,在其中包括了配置参数。
DHCPREQUEST -此消息是客户发送给服务器的,作用有三个:
客户从一台服务器上请求配置信息(在这个时候客户也就拒绝了其它服务器发来的地址,客户就用这个地址了);在系统重新启动后,客户利用这个消息确认原来分配的网络地址仍然有效,客户还可以复用这个地址;对特定的网络地址租用时间要求延期。
DHCPACK -服务器发向用户的消息,包括了配置参数和网络地址。
DHCPNAK -服务器发向用户的消息,告知客户当前使用的网络地址无效或租期已满。
DHCPDECLINE -客户发向服务器的消息,告知服务器此地址已被使用。
DHCPRELEASE -客户发向服务器的消息,告知服务器此地址不再使用。
DHCPINFORM -客户发向服务器的消息,要求服务器发送本地配置信息,客户已经配置好了网络地址,不需要再发送网络地址了。
表2、DHCP消息
图3、在分配新的网络地址时DHCP客户机与服务器之间消息交换的时间图
3.客户将会接收到一个或多个服务器发来的地址和配置参数。
客户可以不用那么急于回应哪一个地址,它也可以挑的。
当选择好了以后,客户广播DHCPREQUEST消息,在这个消息中的“服务器标记”选项字段中必须包括选定的服务器的标记,此消息中也可以包括希望获得的网络配置参数,而“请求IP地址”选项则要填写服务器发来信息包中'yiaddr'的内容,也就是服务器给客户提供的IP地址。
DHCPREQUEST消息在本网段广播,并通过DHCP/BOOTP中继代理向不同网段转发,为了保证中继代理将DHCPREQUEST消息转发到接收DHCPDICOVER消息的服务器,必须在DHCPREQUET消息中使用与DHCP消息头的secs字段相同的值,并用与原来DHCPDISCOVER消息相同的广播地址发送。
如果客户在规定时间内没有收到任何服务器的回应,它会再次发送DHCPDISCOVER。
4.许多服务器会接收到DHCPREQUEST广播,那些没有被选择的服务器将DHCPREQUEST视为拒绝包。
那个被选择的服务器会记录这个地址已经有人用了,并以包含配置参数的DHCPACK包返回给客户。
“客户标记”(clientidentifier)选项和指定的网络地址用以唯一确定一个客户。
服务器发送的DHCPACK包内的参数不应该和原来发送的DHCPOFFER包内的内容有冲突,服务器也不在这时再次检测提供的网络地址,在DHCPACK包内的'yiaddr'字段包括了选择的网络地址。
如果被选的主机不能满足DHCPREQUEST包内的要求,它应该以DHCPNAK包回复。
服务器可以将DHCPOFFER包内包括的地址设置为不可用,也可以不设置,但是如果服务器没有从客户那儿接收到DHCPREQUEST包,此地址一定要保证是可用的。
5.客户接收到包括配置参数的DHCPACK包,它应该对此参数进行最后一次检查,当没有发现冲突时客户才算真正配置好了。
如果客户发现有人已经使用了这个地址,它需要向服务器发送DHCPDECLINE包,并重新开始配置过程,客户机必须等待一段时间后才能进行重要的配置过程,如果紧接着就进行会对网络造成巨大的压力。
不但在地址冲突的时候要重新开始配置过程,在接收到DHCPNAK包时也要进行重要配置过程。
如果超时而未接收到DHCPACK或DHCPNAK包,客户需要再次发送DHCPREQUEST。
当然这个发送的过程要有一定的时间,不要服务器还没接收到呢,这边就放弃了。
如果重新发送后还是没有收到DHCPACK或DHCPNAK包,客户要返回初始(INIT)状态,并通知用户,初始化过程失败,正在重新开始。
6.客户可以通过发送DHCPRELEASE包取消租用。
客户在消息中放置“客户标记”(clientidentifier)或”chaddr”和网络地址。
如果客户在租用的时候使用了“客户标记”,在取消租用的时候必须还使用这一标记项。
6.2服务器客户机交互——重新使用原先分配的网络地址
如果客户希望再次使用过去使用过的网络地址,客户就不需要进行上面说的一些步骤,对老客户的服务要方便一些。
下面的时间图就能够帮助您理解这一过程。
图4重新使用原先分配的网络地址
1.客户在自己的子网里广播一个DHCPREQUEST消息,在此消息的“请求IP地址”(requestIPaddress)选项中包括了客户现在的网络地址。
(这里要注意一点,如果客户目前没有网络地址,'ciaddr'域绝对不能填写)。
BOOTP中继代理把这个消息发送到不在同一子网内的DHCP主机上。
如果客户当初申请租用地址的时候使用了“客户标记”选项,这个新发的包内也必须使用相同的“客户标记”选项。
2.这个时候服务器已经知道客户是个老客户,也知道了它的配置参数,就返回一个DHCPACK消息。
此时服务器不负责检查网络地址是否已经被使用,这个工作要客户自己完成。
如果客户的请求无效(可以客户已经移到另外一个子网内了),服务器应该以DHCPNAK返回,如果服务器不能确认发送到的消息是否准确,它干脆什么都不返回,如果一个服务器接收到一个应该属于别的服务器管理的网络地址,它就不要返回DHCPNAK包了。
如果包内的'giaddr'域为0说明客户和服务器处于同一子网内,它会发向0xffffffff发送广播,它担心这个客户已经离开这个子网,或者它的子网掩码不正确,即使客户接收到了这个消息,也不需要发送ARP。
如果服务器知道客户不在这个子网内,它只需要按照'giaddr'内记录的地址发送一个消息给BOOTP中继代理就是了,中继代理会将服务器发送的包发到客户手中,即使客户此时已经处于新的子网中了。
3.客户接收了带配置参数的DHCPACK信息,客户最后对参数进行检查,标记租用时间。
指定的租用时间由消息包内的“客户标记”(clientidentifier)或'chaddr'字段确定,这时客户也就配置好了。
如果客户检测到地址冲突,客户必须以DHCPDECLINE包通知服务器并重新开始请求网络地址。
如果客户接收到DHCPNAK包,它不能再使用当前地址了,它必须重新开始配置过程以获得新的网络地址。
如果客户既没有收到DHCPACK也没有收到DHCPNAK,它必须重新发送DHCPREQUEST包以进行配置。
客户应该在一定时间再次发送DHCPREQUEST请求(时间由后面描述的重传算法决定)。
在使用重传算法后,如果客户既没有收到DHCPACK也没有收到DHCPNAK,而先前分配的地址没有过期,客户可以继续使用这个地址及相应的参数。
4.客户可能通过DHCPRELEASE包取消租用。
在这个取消的包中包括了“客户标记”或'chaddr'和网络地址。
客户租用某一地址是有时间限制的,当然也可以是无期限限制的。
在整个DHCP中,时间的单位是秒,而0xffffffff表示无限。
在分布式系统中有一个重要的问题就是时间的同步,服务器和客户的时间可能是不同步的,为了实现时间的同步,要靠在一定时间内发送DHCP包以客户本地时间来表示。
这个时间是由一个无符号的32位数表示,它可以表示0到100年,这对于现行的系统来说够用了。
在上面的图中,我们假定客户机和服务器的时间是相对稳定的,如果两者时间上有一点差别,服务器可以给客户发一个把租期稍微延长一点,这样就可以了。
6.3已经配置了网络地址的客户机获取参数
如果客户通过别的手段获得了网络地址,它可以使用DHCPINFORM请求获得其它配置参数,服务器接收到DHCPINFORM包,并建立一个DHCPACK消息,在其中包括一些合适客户的配置参数,只是不包括分配网络地址、检查现有的绑定,在信息中不填充'yiaddr'字段或租用时间参数。
服务器应该检查DHCPINFORM中网络地址的一致性,但不能检查其租用期。
服务器取得DHCPINFORM包内的'ciaddr'地址,而返回DHCPACK包。
6.4DHCP客户机参数
并不是所有客户需要初始化所有在附表内的参数。
有两种方法可以减少服务器到客户发送参数的数目。
客户可以使用默认参数,如果服务器不发送任何参数,客户就使用默认参数。
第二种方