1、DHCP 协议讲解目 录第 1 章 DHCP 协议基础知识 1-11.1 DHCP 协议概述 1-11.1.1 IP 网络主机配置方法概述 1-11.1.2 DHCP 协议主机配置的优缺点 1-2第 2 章 协议的报文格式 2-12.1 DHCP 协议的封装 2-12.2 DHCP 协议的报文格式 2-22.3 DHCP 协议报文的种类 2-5第 3 章 DHCP 协议的实现过程 3-13.1 DHCP CLIENT 的行为 3-13.2 DHCP SERVER 的行为 3-23.3 DHCP RELAY 的行为 3-33.4 DHCP 交互过程 3-4第 4 章 DHCP 在具体组网中的应用
2、实例 4-14.1 DHCP 在 MA5200 中的应用 4-14.1.1 组网说明及数据规划 4-14.1.2 结合抓报所得数据分析 DHCP 协议实现原理 4-24.2 宽带产品相关的数据配置 4-94.2.1 ESR8850 中与 DHCP RELAY 相关的数据配置 4-94.2.2 S3526 中与 DHCP RELAY 相关的数据配置 4-10第 5 章 DHCP 协议的发展方向 5-1 第 1 章 第 1 章 DHCP 协议基础知识1.1 1.1 DHCP 协议概述1.1.1 1.1.1 IP 网络主机配置方法概述IP 网络是目前乃至将来可能最有前途的网络。正如同传统的电话网中要
3、为每个电话分配一个电话号码以唯一标识这个电话一样,在 IP 网络中,每一台终端要想与其他的终端进行通信,也需要为每一个接入终端分配一个唯一标识号,这就是 IP 网络上的地址 IP 地址。IP 地址是 IP 网络上唯一标识一个接入终端最原始和最有效的标识符。 给终端分配 IP 地址的方法有多种方式,如 PPP 协议的自协商方式,用户自己静态配置,管理员统一分配、配置等方式,但这些配置 IP 地址的方式都有着一些这样或那样的缺点。PPP 自协商方式虽然不用用户自己动手操作,但是需要安装专门的客户端软件,而且需要服务器处事先配置好用户的帐号和密码,否则用户无法上网,当然其优点是安全性高。 用户自己静
4、态配置方式对于熟悉 IP 网络的人来说是一件很简单的事情,但对于普通用户来说,可真是难以理解,而且还须提防 IP 地址冲突的情况。管理员统一分配、配置的方式,需要有专人维护,规划整个网络,不仅成本高,而且管理员工作量太大。更重要的是许多终端启动时不仅需要 IP 地址,而且还需要动态的获取更多的启动配置信息,如无盘工作站,CABLE MODEM 就需要获得启动配置文件名和 TFTP SERVER 的 IP 地址等信息,其他一些特殊终端还需要获取其他一些特殊的信息,如 EPHONE 需要 CALL SERVER 的 IP 地址,IDT 需要控制服务器的 IP 地址等。这些动态信息是前面几种主机配置
5、方式所无法完成的。正是基于这些要求,新的主机配置方式应运而生,最早的主机配置方式就是BOOTP 协议(即引导程序协议) ,它是一种较老的系统引导协议,主要用于无盘工作站启动时从服务器上获取 IP 地址和启动文件名,多与 TFTP 协议配合使用,后来为了功能的扩展,又发展了 DHCP 协议,但 DHCP 协议兼容BOOTP 协议。BOOTP 和 RARP 类似,是用于相对静态的环境,其中每个主机都有一个永久的网络连接。管理人员创建一个 BOOTP 配置文件来定义每个主机的 BOOTP 参数。在计算机经常移动和实际计算机数目超过了可获得的 IP 主机地址时,这种只提供从主机标识到主机参数的静态映射
6、就不适用了。DHCP 从两个方式上扩充了 BOOTP: DHCP 可使计算机用一个消息获取它所需要的所有配置信息,即传送配置信息的协议; DHCP 允许计算机快速、动态的获取 IP 地址,即动态分配 IP 地址的机制。DHCP 支持三种类型的地址分配: 自动分配方式中 DHCP 给主机指定一个永久的 IP 地址; 动态分配方式中 DHCP 给主机指定一个有时间限制的 IP 地址,到时间或主机明确表示放弃这个地址时,这个地址可以被其他的主机使用; 手工分配方式中主机的 IP 地址是由网络管理员指定的,DHCP 只是把指定的 IP 地址告诉主机。在这三种方式中,只有动态分配的方式可以对已经分配给主
7、机但现在此主机已经不用的 IP 地址重新加以利用。这样,在给一台临时连入网络的主机分配地址或者在一组不需要永久的 IP 地址的主机中共享一组有限的 IP 地址时,动态分配显得特别有用。当一台新主机要永久的接入一个网络时,而网络的IP 地址非常有限,为了将来这台主机被淘汰时能回收 IP 地址,这种情况下动态分配也是一个很好的选择。1.1.2 1.1.2 DHCP 协议主机配置的优缺点1、DHCP 协议主机配置方式最重要的特征就是整个配置过程自动实现,而且所有配置信息在一个地方集中控制,这就是 DHCP SERVER 的作用。2、很明显,DHCP 协议采用 CLIENT-SERVER 方式实现,而
8、且 DHCP 协议是基于 UDP 层之上的应用,DHCP CLIENT 将采用知名端口号 68,DHCP SERVER 采用知名端口号 67 进行交互。3、最初的 BOOTP/DHCP 协议是在同一个物理子网中使用广播方式实现的,无法穿越路由器扩展到不同的物理子网中,也就是要使用 DHCP 协议的每一个网络中必须配置一台 DHCP 服务器,为了克服这一缺陷,采用了 DHCP RELAY 的方式使得 BOOTP/DHCP 协议能够穿越路由器实现。4、BOOTP 协议主要用于一些较简单的终端设备,如无盘工作站等,通过BOOTP 获取的信息也就相对较少,但它的 CLIENT-SERVER 间的交互过
9、程比较简单。DHCP 协议功能较全面,可以获取的信息也较多,但 CLIENT-SERVER 间的交互过程比较复杂。下面将会详细讲解。5、DHCP 协议一般采用终端的硬件地址(如果是以太网,就是我们常说的MAC 地址)来唯一标识一个终端设备。6、DHCP 协议通过设置 IP 地址使用租期,可以达到 IP 地址的分时复用效果,解决 IP 地址资源短缺的问题。7、DHCP 协议基本上是一个单向驱动协议, SERVER 完全是被动的,其动作、行为基本完全由 CLIENT 的请求行为而激发,即 SERVER 端无法主动控制 CLIENT 端。因此其交互性和安全性就没有 PPP 协议那么完善,这是DHCP
10、 协议的致命缺点。第 2 章 第 2 章 协议的报文格式2.1 2.1 DHCP 协议的封装DHCP 协议是基于 UDP 层之上的应用, DHCP CLIENT 将采用知名端口号68,DHCP SERVER 采用知名端口号 67。其报文内容的封装如图 1 所示: 链路层头 IP 头 UDP 头 DHCP 报文图 1 DHCP 报文封装格式其中:链路层头:承载报文的链路层信息头,常见的有 Ethernet_II 格式、802.1Q 格式、 IEEE802.3 格式、令牌环链路层头格式等。IP 头:标准的 IP 协议头,IPV4 中长度为 20bytes,包括了 SrcIp,DstIp 等信息。U
11、DP 头: 8bytes,包括了 SrcPort,DstPort,报文长度及 UDP 校验和等信息。DHCP 报文:具体的 DHCP 报文内容。由于 DHCP 协议是初始化协议,更简单的说,就是让终端获取 IP 地址的协议,既然终端连 IP 地址都没有,何以能够发出 IP 报文呢?SERVER 给CLIENT 回送的报文该怎么封装呢?正是为了说明这个问题,上面才会介绍DHCP 报文的封装格式。为了解决这个问题,DHCP 报文的封装采取了如下措施:1、首先链路层的封装必须是广播形式,即让在同一物理子网中的所有主机都能够收到这个报文。在 Ethernet_II 格式的网络中,就是 DstMac 为
12、全 1。2、由于终端没有 IP 地址,IP 头中的 SrcIp 规定填为全 0。3、当终端发出 DHCP 请求报文,它并不知道 DHCP SERVER 的 IP 地址,因此 IP 头中的 DstIp 填为有限的子网广播 IP全 1,以保证 DHCP SERVER的 IP 协议栈不丢弃这个报文。4、上面的措施保证了 DHCP SERVER 能够收到终端的请求报文,但仅凭链路层和 IP 层信息,DHCP SERVER 无法区分出 DHCP 报文,因此终端发出的 DHCP 请求报文的 UDP 层中的 SrcPort 为 68,DstPort 为 67。即 DHCP SERVER 通过知名端口号 67
13、 来判断一个报文是否是 DHCP 报文5、DHCP SERVER 给终端的响应报文将会根据 DHCP 报文中的内容决定是广播还是单播,一般都是广播形式。广播封装时,链路层的封装必须是广播形式,在 Ethernet_II 格式的网络中,就是 DstMac 为全 1,IP 头中的 DstIp 填为有限的子网广播 IP全 1。单播封装时,链路层的封装是单播形式,在 Ethernet_II 格式的网络中,就是 DstMac 为终端的网卡 MAC 地址(此MAC 地址存在于 DHCP 报文中) 。 IP 头中的 DstIp 填为有限的子网广播 IP全 1 或者是即将分配给用户的 IP 地址(当终端能够接
14、收这样的 IP 报文时) 。两种封装方式中的 UDP 层都是相同的,SrcPort 为 67,DstPort 为 68。终端通过知名端口号 68 来判断一个报文是否是 DHCP SERVER 的响应报文。2.2 2.2 DHCP 协议的报文格式DHCP 使用 BOOTP 的报文格式,但修改了一些字段的内容和含义。DHCP报文格式如图 2 所示 图2 DHCP协议的报文格式下面详细介绍 DHCP 报文内容:“op”字段:表示当前报文是 client 的请求还是 server 的应答,为 1 时表示是client 的请求,为 2 时表示是 server 的应答。“htype”, “hlen”字段:
15、分别表示 client 的网络硬件地址类型、长度,如“htype”为 1,表示 client 的网络硬件是 10MB 的以太网类型, “hlen”为 6,表示 client 的网络硬件地址长度是 6bytes(即以太网类型的 6bytes 的 MAC 地址)“跳数”字段:表示当前的 DHCP 报文经过的 DHCP RELAY 的数目,类似于IP 头中的跳数字段,但含义完全不同,client 或 server 发出 DHCP 报文时,此字都初始化为 0,每经过一个 DHCP RELAY,此字段就会加 1,此字段的作用是限制 DHCP 报文不要经过太多的 DHCP RELAY,协议规定,当“hop
16、s”大于 4(现在也有规定为 16)时,这个 DHCP 报文就不能再进行处理,而是丢弃。“事务 ID“字段:client 每次发送 DHCP 请求报文时选择的随机数,用来匹配server 的响应报文是对哪个请求报文的响应。client 会丢弃 “xid”不匹配的响应报文。“秒数”字段:用来表示 client 开始 DHCP 请求后的时间流逝秒数,此字段一般没有多大意义,最初设计此字段是为了让 DHCP SERVER 在繁忙时,优先处理此字段大的 DHCP 请求(因为此字段越大说明这个 client 等的时间就越长)“标志”字段:在 BOOTP 中此字段是保留不用的,在 DHCP 协议中也只使用
17、了其左边的最高位,其格式如图 3 所示:0 15B 0图 3 DHCP 报文中“flags” 字段格式整个字段占 16 比特,其中,最左边比特被解释为广播响应标识位,所有其它比特保留备用,必须被 client 设置为 0,server 和 DHCP RELAY 忽略这些比特。当 client 不能接收单播的 DHCP 响应报文时,必须把广播响应标识位置 1,否则置 0。而 DHCP SERVER 在回响应报文时是广播还是单播,就将根据此广播响应标识位是否置位来判断,目前的 client 如 WINDOWS 98 一般都能接收单播 DHCP 响应报文。“客户机 IP 地址” 字段:表示 clie
18、nt 自己的 IP 地址。可以是 server 分配给client 的 IP 地址,也可以是 client 已有的 IP 地址。此字段不为 0 的原则就是client 能够使用此 IP 地址接收 IP 报文。DHCP SERVER 发现此字段不为 0时,可以直接将响应报文单播给 client。“你的 IP 地址”字段:表示 server 分配给 client 的 IP 地址。当 DHCP SERVER响应 client 的 DHCP 请求时,将把分配给 client 的 IP 地址填入此字段。“服务器 IP 地址” 字段:表示 client 获取启动配置信息的服务器 IP 地址,一般是 TFT
19、P SERVER 的 IP 地址。“中继代理 IP 地址” 字段:记录第一个 DHCP RELAY agent 的 IP 地址。当client 发出 DHCP 请求报文后,如果网络中存在 DHCP RELAY,则第一个DHCP RELAY 转发这个 DHCP 请求报文时,就会把自己的 IP 地址填入此字段(随后的 DHCP RELAY 将不再改写此字段,只是把“hops”加 1) 。DHCP 将会根据此字段为用户分配 IP 地址,并把响应报文转发给此 DHCP RELAY agent,由 DHCP RELAY agent 再转发给 client。“客户机硬件地址” 字段:记录 client 的
20、实际硬件地址内容。当 client 发出DHCP 请求报文时,将把自己的网卡硬件地址填入此字段,DHCP SERVER一般都会使用此字段来唯一标识一个 client。而且此字段与前面的“htype”“hlen”字段必须一致。如当“htype”“hlen”分别为 1 和 6 时,此字段必须填入6bytes 的以太网 MAC 地址。“服务器的主机名” 字段:记录 client 获取启动配置信息的服务器名字。此字段由 DHCP SERVER 填写,而且是可选的,如果填写,必须是一个以 0 结尾的字符串。“启动文件名”字段:记录 client 的启动配置文件名。 此字段由 DHCP SERVER 填写
21、,而且是可选的,如果填写,必须是一个以 0 结尾的字符串。“选项”字段:对于 BOOTP,又称之为“vendor”字段。 此字段中包含了大量可选的终端初始配置信息和网络配置信息,如决定终端的 IP 特性配置信息,域名信息,标识终端的特殊信息,终端的默认网关 IP 地址,DNS 服务器的IP 地址,WINS 服务器的 IP 地址,用户使用 IP 地址的有效租期等等信息。正是因为有了此字段,DHCP 协议才能够给 client 提供大量的配置信息,此字段采用“CLV”方式构成,即 Code:标识号,唯一标识后面的信息内容,占1bytes;length :长度,表示后面信息内容的长度,占 1byte
22、s; value:信息内容,其长度为 length 所指定,以 bytes 为单位。选项字段是可选字段,它是变长的,其中对于我们最重要的一个选项是“server identifier“,它标识了 server 的 IP 地址,并把它带给 client。如图 4 所示:图 4 DHCP 报文的“option”字段编码方式当需要新的信息时,可以按照这种编码方式申请新的选项即可,目前 DHCP协议已经支持即成为标准的 option 已有近 80 项,具体内容可以参考RFC1541。由于选项不断扩展,可以从最新的 RFC 中得到最新的选项集合。其中最常用的选项包括 Dhcp message type,
23、 router Ip,DNS Ip, Wins Ip,client id, server id 等选项。 Dhcp message type:code = 53, length = 1, value= 1-8,此字段表示DHCP 报文类型;router Ip:code = 3, length = IP 地址长度, value=client 的默认网关的 IP 地址;DNS Ip :code = 6, length = IP 地址长度的倍数, value= client 的 DNS 服务器的 IP 地址序列; Wins Ip :code = 44, length = IP 地址长度的倍数, va
24、lue= client 的 WINS服务器的 IP 地址序列; client id : code = 61, length = client 的网络硬件地址的长度 2, value=“htype”+“hlen”+ client 的网络硬件地址;server id :code = 54, length = IP 地址长度, value= DHCP SERVER 的 IP地址; 对于 BOOTP 协议,此字段为 64bytes,对于 DHCP 协议,此字段为 64-312 bytes,当 client 想要更长时,可以与 DHCP SERVER 协商。2.3 2.3 DHCP 协议报文的种类DHC
25、P 协议采用 CLIENT-SERVER 方式进行交互,其报文格式共有 8 种,由“选项”字段中的“Dhcp message type ”选项的 value 值来确定,后面括号中的值即为相应类型的值,具体含义如下:1:DHCPDISCOVER(0x01) ,此为 client 开始 DHCP 过程的第一个报文2:DHCPOFFER(0x02) ,此为 server 对 DHCPDISCOVER 报文的响应3:DHCPREQUEST(0x03) ,此报文是 client 开始 DHCP 过程中对 server 的DHCPOFFER 报文的回应,或者是 client 续延 IP 地址租期时发出的报
26、文4:DHCPDECLINE(0x04) ,当 client 发现 server 分配给它的 IP 地址无法使用,如 IP 地址冲突时,将发出此报文,通知 server 禁止使用 IP 地址5:DHCPACK(0x05) ,server 对 client 的 DHCPREQUEST 报文的确认响应报文,Client 收到此报文后,才真正获得了 IP 地址和相关的配置信息。6:DHCPNAK(0x06) ,server 对 client 的 DHCPREQUEST 报文的拒绝响应报文,Client 收到此报文后,一般会重新开始新的 DHCP 过程。7:DHCPRELEASE(0x07) ,cli
27、ent 主动释放 server 分配给它的 IP 地址的报文,当 Server 收到此报文后,就可以回收这个 IP 地址,能够分配给其他的client。8:DHCPINFORM(0x08) ,client 已经获得了 IP 地址,发送此报文,只是为了从 DHCP SERVER 处获取其他的一些网络配置信息,如 route ip,DNS Ip等,这种报文的应用非常少见。既然 DHCP 兼容 BOOTP,那么如何从报文中区分是 DHCP 还是 BOOTP 呢?前面说过,BOOTP 协议比 DHCP 简单,而且 client,server 间的交互过程也简单:一个来回,两个报文就完成了,而且也没有 IP 地址续延的问题(因此采用 BOOTP 协议进行配置时,就必须一个终端一个 IP 地址的事先配置好,就没有 DHCP 协议那么灵活了) 。BOOTP 没有 DHCP 那么多的报文类型,因此当发现在一个 DHCP 报文的 “选项”字段中没有“Dhcp message type ”选项时,那么这个报文就是 BOOTP 报文。所以可见,DHCP 报文“选项”字段中的“Dhcp message type ”选项是个非常重要的参数。