在网络时代早期,当一台设备想要在网络上通信时,它需要被手动分配一个地址。随着网络的发展,这样的手动过程很快变得繁琐起来。为了解决这个问题,BOOTP协议(Bootstrap Protocol)问世,它主要作用是给连接到网络的设备自动分配地址。BOOTP后来被更加复杂的协议DHCP(Dynamic Host Configuration Protocol)所取代
DHCP是一个应用层协议,负责让设备能够自动获取IP地址(以及其他重要的网络资源,比如DNS服务器和路由网关的地址)。今天大多数的DHCP服务器都向客户端提供其他的一些参数,比如网络上的默认网关和DNS服务器的地址
操作码(OpCode):指出这个数据包是DHCP请求还是DHCP回复
硬件类型(Hardware Type):硬件的地址类型(10MB以太网、IEEE802、ATM以及其他)
硬件地址长度(Hardware Length):硬件地址的长度
跳数(Hops):中继代理用以帮助寻找DHCP服务器
事务 ID(Transaction ID):用来匹配请求和响应的一个随机数
消耗时间(Seconds Elapsed):从客户端第一次向DHCP服务器发出地址请求到获得响应所需要的时间
标志(Flags):DHCP客户端能够接受的流量类型(单播、广播以及其他)
客户端IP地址(Client IP Address):客户端的IP地址(由“你的”IP地址域派生)
“你的”IP地址:(Yours IP Address):DHCP服务提供的IP地址
服务器IP地址(Server IP Address):DHCP服务器的IP地址
网关IP地址(Gateway IP Address):网络默认的网关地址
客户端硬件地址(Client Hardware Address):客户端的MAC地址
服务器主机名(Server Host Name):服务器的主机名(可选)
启动文件(Boot File):DHCP所使用的启动文件(可选)
选项(Options):用来对DHCP数据包进行扩展,以提供更多的功能
DHCP的主要任务就是在续租过程中向客户端分配IP地址。其过程通常被称为DORA过程,因为它使用了4种确认类型的DHCP数据包:发现(Discover)、提供(Offer)、请求(Request)、确认(Acknowledgement)
1 发现数据包
第一个数据包从 0.0.0.0 的 68 端口发往目的地 255.255.255.255 的 67 端口。客户端使用 0.0.0.0 是因为它目前还没有IP地址。数据包被发送至 255.255.255.255 ,是因为这是一个独立于网络的广播地址,从而确保这个数据包回被发往网络上的每台设备。因为这台设备并不知道DHCP服务器的地址,所以第一个数据包是为了寻找正在监听的DHCP服务器
从上图可以看出DHCP是基于UDP作为传输层协议的,这是一个请求数据包,在消息类型域中标识为1。该数据包中大多数字段为空,这个数据包的主要内容为以下四个字段
1 DHCP消息类型:这里为53(t=53),长度为1,值为1,是一个DHCP发现数据包
2 客户端标识符:这里提供了客户端请求IP地址的额外信息
3 所请求IP地址:这里提供了客户端希望得到的IP地址(通常是之前用过的IP地址)
4 请求参数列表:这里列出了客户端希望从DHCP服务器接收到的不同配置项(其他重要网络设备的IP地址)
2 提供数据包
这个数据包显示从 192.168.1.5 发往 192.168.1.10 。因为客户端实际上还没有192.168.1.10这个地址,所以服务器会首先尝试使用由ARP提供的客户端硬件与之通信。如果通信失败,那么将会直接提供(Offer)广播出去,进行通信
这个数据包的DHCP部分,称为提供数据包,表名这是一个响应的消息类型。这个数据包包含了和前一个数据包相同的事务ID,意味着这个响应与原先的请求相对应
该数据包由DHCP服务器发出,用以向客户端提供服务。它提供了关于其自身的信息,以及它想要给客户端提供的IP地址(3),Next Server IP address 域中的值表示DHCP服务器与默认网关共享一个IP地址
3 请求数据包
在客户端接收到DHCP服务器服务器提供的数据包之后,它将以一个DHCP请求数据包作为接受确认、
该文件的第三个数据仍然从IP地址 0.0.0.0 发出,因为没有完成获取IP地址的过程,但数据包知道了它所有通信的DHCP服务器
消息类型字段显示这是一个请求数据包,这个包与发现数据包相似,其所有的IP地址信息都是空的
在最后地选项域,这个所要请求的IP地址不再是空,且DHCP服务器标识域也有IP地址
4 确认数据包
这个过程的最后一步就是DHCP在确认数据包中给客户端发送其所请求的IP地址,并在数据库中记录相关信息
这时客户端就有了一个IP地址,可以在网络上通信
当DHCP给一台设备分配了一个IP地址,它同时也给客户端定下了一个租约。客户端在有限时间之内只用这个地址,否则就必须续租。上面的例子是客户端第一次获取IP地址或者其租约已经过期的情况下
当一个拥有IP地址的客户端在租约内重新启动时,它必须进行一次精简版的DORA过程,来重新认领它的IP地址,称为租约内续租
在租约内续租时,发现和提供数据包就没必要了(前两步),只需要完成请求和确认两个步骤
DHCP依赖于可选项来提供真正的灵活性。数据包的DHCP选项在大小和内容上都可以变化。数据包的整体大小则取决于其所使用的选项
所有DHP数据包都需要的唯一选项就是消息类型选项(53),这个选项标识着DHCP客户端或者服务器将如何处理数据包中的信息
消息类型:
类型号 1 :客户端用来定位可用的DHCP服务器
类型号 2:服务器用来给客户端发送发现数据包的响应
如果按照之前的DHCP数据包结构的定义,该结构中没有为IPv6地址提供足够的空间。为了解决这个问题,同时不对DHCP协议进行改动,在RFC3315中提出了DHCPv6协议。由于DHCPv6不是基于BOOTP协议(DHCP的前身)设计的,因为DHCPv6的数据包结构要比DHCP协议精简很多
如上图所示,DHCPv6数据包结构仅包含2个两个字段,其作用与DHCP中的类似字段相同。数据包的其他部分取决于位于第一个字节的消息类型。在选项部分,每个选项由一个2字节的选项码和一个长度为2字节的选项值字段组成
DHCPv6实现了和DHCP相同的功能,但要理解DHCPv6的通信,不许把DORA替换为SARR(Solicit——Advertise——Request——Reply)
SARR过程包括以下4个步骤:
1 发起(Solicit):客户端向一个特定地组播地址(ff02::1:2)发送一个初始化数据包,尝试在网络发现可用的DHCPv6服务器
2 公告(Advertise):一个可用的DHCPv6服务器直接回复客户端,表名此服务器能够提供地址分配和设置服务
3 请求(Request):客户端通过组播的方式向服务器发起地址配置信息请求
4 回复(Reply):服务器向客户端直接发送其请求的所有配置信息,SARR过程完成
上图描述了一台新入网的主机fe80::20c:29ff:fe5e:7744按照SARR过程,从DHCPv6服务器 fe80::20c:29ff:fe1f:a755获取配置信息
总的来说,DHCPv6和DHCP的数据包结构有很大的区别,但是在功能实现思路上是一致的。这个过程仍然包括DHCP服务器发现步骤和正式的配置信息获取步骤。这些事件通过客户端和服务器之间交互数据包中的事务ID进行关联。传统的DHCP机制不支持IPv6地址分配,因此,如果你的设备能够从网络中某个服务器自动获取IPv6地址,表明在你的网络中已经在运行DHCPv6服务