动态主机配置协议

       动态主机配置协议(Dynamic Host Configuration Protocol, DHCP)是一种流行的客户机/服务器(C/S)协议。几乎所有常用的客户端操作系统和大量的嵌入式设备(例如网络打印机和VoIP电话)都支持DHCP。这些设备通常使用DHCP获得IP地址、子网掩码、路由器的IP地址、DNS服务器的IP地址。其他服务的相关信息(例如使用VoIP的SIP服务器)也可通过DHCP传输。实际上DHCP的更准确说法应该是DHCPv4,因为DHCP的最初设想是供IPv4使用,而IPv6使用的DHCP版本是DHCPv6。
       DHCP的设计基于一种早期协议——Internet引导程序协议(Bootstrap Protocol, BOOTP)。BOOTP为客户提供有限的配置信息,并且没有提供一种机制来支持改变已提供的信息。DHCP使用租用的概念来扩展BOOTP模型,并且可提供主机操作所需的所有信息。租用允许客户机使用一个商定的时间来配置信息。客户机可向DHCP服务器请求续订租约,并继续操作。在这个意义上,BOOTP和DHCP是向后兼容的,纯BOOTP客户端可使用DHCP服务器,DHCP客户端也可使用纯BOOTP服务器。因此两者都使用UDP/IP,客户机使用端口68,服务器使用端口67。

 

  • 功能概述


       DHCP主要由两个主要部分组成:地址管理和配置数据交付。地址管理用于IP地址的动态分配,并为客户机提供地址租用。配置数据交付包括DHCP协议的消息格式和状态机。
       DHCP服务器可配置为提供三种地址分配:自动分配、动态分配和手动分配。三者之间的差异是地址分配是否基于客户机身份,以及该地址是否可撤销或变更。在动态分配中,客户机从服务器配置的地址池(通常为一个预定义的范围)中获得一个可撤销的IP地址,这也是最常用的地址分配方式。自动分配使用的是与动态分配相同的方法,但地址不可撤销。在手动分配中,DHCP用于传输地址,但地址对于请求的客户机是不变的(即它不是由服务器维护的可分配地址池的一部分)。手动分配的作用如同BOOTP。

 

  • 地址池和租用


       在动态分配中,DHCP客户机请求分配一个地址,服务器从可用的地址池中选择一个地址作为响应。在通常情况下,地址池是专门为DHCP用途而分配的一个连续的IP地址范围。分配给客户机的地址只在一段时间内有效,这段时间称为租用期。客户机可使用分配到的地址一直到租用期到期,但客户机可提出延长租期的请求,以续订租约。
       租用期是DHCP服务器的一个重要配置参数,确定租用期的最佳数值需要对预期客户数、地址池大小和地址稳定性等因素加以权衡。较长的租用期通常会较快耗尽可用的地址池,但能提供更稳定的地址和减小网络开销(因为续租请求较少)。较短的租用期为其他客户提供可用性更高的地址池,但随之而来的是稳定性减小和网络流量负荷增大。客户机在租用期过半时开始尝试续订租约。
       当发送DHCP请求时,客户机需要向服务器提供信息。这些信息可包括客户机名称、请求的租用期等参数。DHCP服务器接收到客户机的请求时,可利用客户机提供的信息并结合其他从外部获得的信息,决定在相应中提供的地址和配置信息。租用请求成功后,服务器将租用信息保存在持久性存储器中。

  • DHCP消息格式


       DHCP扩展了BOOTP,因此DHCP消息格式的定义采用扩展BOOTP的方式,以保持两种协议之间的兼容性,这样即使在没有安装DHCP服务器的网络中,BOOTP客户机仍可使用DHCP服务器和BOOTP中继代理支持DHCP服务。消息格式包括一个固定长度的初始部分和一个可变长度的尾部。如图所示


       OP字段是请求(client发送给server,1)或应答(server发送给client,2)。HW类型字段(htype)的值基于ARP使用的值,若是以太网则为1。HW长度字段(hlen)用于存放硬件(MAC)地址,对于类似以太网的网络,该值通常为6。跳步字段用于保存信息传输过程中的中继次数,消息发送方将该值设置为0,并在每次中继时递增。事务ID是由客户机选择(随机)的一个数,服务器需要将它复制到响应消息中,它用于将应答与请求匹配。秒数字段由客户机设置,它是申请地址经过的秒数。标志字段当前只包含一个经过定义的位,称为广播标志,客户机可能在请求中设置该位,表示他们不处理单播IP数据报(设置为1),但可处理广播数据报(例如客户机没有IP地址)。通过设置该位通知服务器和中继代理,广播地址可用于响应消息中。
       接下来四个字段是不同的IP地址。ciaddr包括请求者的IP地址(如果已知,否则为0)。yiaddr由服务器填写,以便向请求者提供服务器地址。siaddr给出下一个服务器的地址,它用于客户机的引导过程(例如,如果客户机需要下载一个可能需要由DHCP服务器之外的另一台服务器完成的操作系统镜像,即客户机需要透过网络开机则需要在消息中填入开机程序代码所在的服务器的地址)。giaddr由DHCP或中继代理填写,它们在转发消息时返回自己的地址。chaddr保存客户机的唯一标识符,并可由服务器以不同方式来使用(例如当某个客户机每次发送地址请求时为其分配相同的IP地址),这个字段通常保存客户机的MAC地址,它被用作一个标识符。
       其余字段,服务器名和引导文件名字段虽然是消息格式中的固定长度部分,但这些字段并不是每次都需要填写,它们分别包含64字节或128字节(没错,是字节)的ASCII字符,表示服务名或启动文件路径。如果空间紧张,它们可用于保存DHCP选项。最后一个选项字段在DHCP中长度是可变的,但在BOOTP中是长度固定的。

 

  • DHCP选项


       DHCP是对BOOTP的扩展,DHCP需要的有些字段在BOOTP设计之初是不存在的,这些字段可通过选项来携带。其中DHCP消息类型选项(53)是1字节长的选项,DHCP消息一定会使用它。它有以下可能值:DHCPDISCOVER (1)、DHCPOFFER(2)、DHCPREQUEST(3)、DHCPDECLINE(4)、DHCPACK(5)、DHCPNAK(6)、DHCPRELEASE(7)、DHCPINFORM(8)、DHCPFORCE-RENEW(9)、DHCPLEASEQUERY(10)、DHCPLEASEUNASSIGNED(11)、DHCPLEASEUNKNOWN(12)和DHCPLEASEACTIVE(13)。
    选项可由DHCP消息中的选项字段携带,也可以由前面提到的服务器名和引导文件名字段携带。当选项携带在后两者中时,称为选项超载,将包含一个特殊的超载选项(52)来表明哪些字段适合携带选项。另外对于长度超过255字节的选项还定义了一种特殊的长选项机制。实际上,如果同一选项在同一消息中重复出现多次,它们的内容按出现在消息中的顺序组合,并将结果作为一个选项来处理。如果一个长选项用于表示选项超载,这时的处理顺序是从后向前:选项字段、引导文件名字段和服务器名字段。

  • DHCP工作过程


       当一台新的客户机连接到网络时,它首先发现可用的DHCP服务器,并发送广播请求地址分配。然后,它从接收到的应答中决定使用哪台服务器和哪个地址,并向该地址的服务器发送请求(同时将其选择通知所有服务器)。除非服务器在此期间已将该地址分配出去,否则它通过确认将地址分配给请求的客户机。过程如下图:


       客户机向服务器发送消息,使用UDP/IP数据报,由于客户机一开始没有IP地址,因此这种消息从地址0.0.0.0(端口68)发送到受限广播地址255.255.255.255(端口67)。从服务器到客户机的消息从服务器IP地址(端口67)发送到本地IP广播地址(端口68)。
       在一次典型的DHCP交换中,客户机首先广播一个DHCPDISCOVER消息。对于接收到请求的每台服务器,无论是直接接收还是通过中继代理,它们都会响应一个DHCPOFFER消息,并在响应消息中的yiaddr字段中填写提供的IP地址。其他配置选项(地理DNS服务器的IP地址、子网掩码)也经常包含在内。DHCPOFFER消息中包含租用时间(T),它提供了在不更新租约的情况下地址可被租用的时间上限。这个消息还包含更新时间(T1),它是客户机从获得租约到尝试要求服务器更新租约的时间,以及重新绑定时间(T2),它是客户机尝试要求DHCP服务器更新其地址的时间。在默认情况下,T1 = (T/2),T2 = (7T/8)。其中一种实现是,DHCPDISCOVER的等待时间预设为1秒,也就是当客户机将第一个DHCPDISCOVER封包送出去之后,在1秒之内没有得到回应的话,就会进行第二次DHCPDISCOVER广播。若一直没有得到回应,客户机会将这一广播包重新发送四次(以2,4,8,16秒为间隔,加上1-1000毫秒之间随机长度的时间)。如果都没有得到DHCP服务器的回应,客户机会从169.254.0.0/16这个自动保留的私有IP地址中选用一个IP地址。并且每隔5分钟重新广播一次,如果收到某个服务器的响应,则继续IP租用过程
       当接收到来自一台或多台服务器的DHCPOFFER消息后,客户机确定自己想接受哪个DHCPOFFER(策略有多种,最简单的是处理接受最先达到的DHCPOFFER),并广播一个包括服务器标识符选项的DHCPREQUEST消息,yiaddr字段设置为由选中的DHCPOFFER消息提供的地址。多台DHCP服务器可能接收到广播的DHCPREQUEST消息,但只有DHCPREQUEST消息中标识的服务器同意将该地址进行绑定;其他服务器清除与该请求相关的状态。在完成绑定后,选中的服务器响应一个DHCPACK消息,通知客户机可以使用该地址。如果服务器无法分配包含在DHCPREQUEST消息中的地址,该服务器将会响应一个DHCPNAK消息。
       当客户机接收DHCPACK消息和其他相关配置信息时,它可探测网络以确保获得的地址未被使用(例如向该地址发送一个ARP请求以执行ACD,相关内容请点击:传送门)。如果客户机确定该地址已被使用,则客户机就不适用该地址,并向服务器发送一个DHCPDECLINE消息,通知该地址不能使用。在经过默认的10秒延时后,客户机可重试。如果一台客户机在租约到期前放弃该地址,它将发送一个DHCPPRELEASE消息。
       在一个客户机已有一个IP地址并希望仅更新其租约的情况下,它可跳过最初的DHCPDISCOVER/DHCPOFFER消息。
       事实上,并不是所有DHCP客户机都会无条件接受DHCP服务器的OFFER,特别是如果这些主机上安装有其它TCP/IP相关的客户机软件。客户机也可以用DHCP REQUEST向服务器提出DHCP选择,这些选择会以不同的号码填写在DHCP Option Field里面。客户机可以保留自己的一些TCP/IP设定。

 

  • DHCP状态机


       DHCP在客户机和服务器中运行一个状态机。状态用于指出协议下一个处理的消息类型。客户机的状态机如图所示(相关状态转换及动作在图中都有注释):

 

  • DHCP中继


       在最简单的网络中,一个DHCP服务器可供同一局域网中的客户机使用。但是,在更复杂的网络中,可通过一个或更多DHCP中继代理来中继DHCP流量。DHCP中继如图所示:
       中继代理用于将DHCP操作扩展到跨越多个网段。在一般情况下,中继不会参与客户机与服务器之间的所有DHCP流量交换,中继代理仅转发消息,而且是那些广播消息(或IPv6的组播)。这种消息通常在客户机首次获得自己的地址时交换。当一台客户机获得一个IP地址,并且服务器的IP地址使用服务器标识选项时,它可与服务器进行单播通信而不经过中继。中继代理在传统上是第3层(网络层)设备,并且通常结合了路由功能。
DHCP和DNS交互
       当一台DHCP客户机获得一个IP地址时,它接收的配置信息的重要部分是一台DNS服务器的IP地址。它允许客户机系统将DNS名称转换为IPv4和/或IPv6地址,该地址是进行传输层连接时协议实现所需要的。如果没有DNS服务器或其他方式将域名映射为IP地址,用户会难以访问互联网。如果本地DNS工作正常,它将Internet作为一个整体来提供地址映射,但如果配置正确,也可针对本地的专用网络(如.home)。
       由于本地专用网络的DNS映射通常采用烦琐的手工管理,因此,将指定的DHCP地址与相应地址的DNS映射更新方法结合起来会方便许多。这可通过组合DHCP/DNS服务器或动态DNS来实现。
       组合DHCP/DNS服务器是一个服务器程序,它可配置为提供IP地址租约以及其他信息,也可读取一个DHCPREQUEST消息中的客户机标识符或域名,并在使用DHCPACK消息进行响应之前,通过“名称到地址”的绑定来更新内部DNS数据库。这样,由DHCP客户机或与相同DNS服务器交互的其他系统发起任何后续DNS请求,能够在客户机名称和新分配的IP地址之间转换。
                                                                                    本文内容摘自《TCP/IP详解 卷1:协议(中文版)第2版》,有改动
 

猜你喜欢

转载自blog.csdn.net/qq_37653144/article/details/81488334
今日推荐