1. DHCPv6 vs DHCPv4
与DHCPv4协议一样,DHCPv6协议也是用来给设备分配地址的,只不过通过DHCPv6分配的是IPv6地址,而不是IPv4地址。
(1)DHCPv6报文的地址和端口
跟DHCPv4协议一样,DHCPv6也是位于UDP协议上的应用层协议。不过它采用的端口是,客户端为547,服务器是546。
在DHCPv4协议中客户端因在DHCP交换过程中没有IP地址,故以0.0.0.0作为初始地址;在DHCPv6中则是用本地链路地址。
在DHCPv4协议中为了让数据包被整个VLAN内设备收到,采用255.255.255.255作目的地址;在DHCPv6中用的是组播地址。
(2)DHCPv6的报文类型
在DHCPv4协议中,客户端初次获取IP地址的报文交换是通过DORA报文交互来完成的,而在DHCPv6中则是如下图四个报文。

DHCPv4采用gratuitous ARP来做地址冲突检测,因为在IPv6中已经废弃了ARP协议,所以DHCPv6则是用ICMPv6来完成地址冲突检测的,如下图所示。
=========DHCPv6 ==================
DHCPv4客户端采用Release报文来释放获取的地址,同样地DHCPv6也采用Release报文释放地址,如下图所示。

可以发现DHCPv6 Release报文的源地址还是【link-local】地址,需要释放的地址【2001:100:101:0:a525:5c69:6a26:1d9】,目的地址是组播地址【ff02::1:2】 。
收到Release报文的DHCPv6网关(不是DHCPv6服务器)回复Reply报文,源和目的地址是各自的【link-local】地址。收到Release报文的DHCPv6服务器,把需要释放的地址从自己的数据库中删除,但是没有回复任何消息。
(3)DHCPv6的报文头部结构
其实DHCPv6相对于DHCPv4地址和端口、报文类型,改动思路差不多,但是报文头部结构的改动还是最大的,个人觉得主要是思路比以前更好。
采用了DHCPv4的option思想,除了Message Type和Transaction ID以外,95%的字段都是以option存在于DHCPv6报头中。只是有些option是必须携带,有些是根据需要才附带。
这就让DHCPv6的报文头部很简单明了,一看就懂。如下图所示。

2. DHCPv6 Option
从上图可知,DHCPv6的核心还是在于option,这些option完成了DHCPv6协议的绝大部分功能。因此我们花一个章节专门来讲DHCPv6 Option。
与DHCPv4 Option一样,DHCPv6 Option也分为三大类,standard-class由RFC定义,vendor-class由设备厂商定义,user-class由用户自己定义。
DHCPv6 Option的数据格式也有很多种,我们一一讲解。
2.1 特殊的option
(1)option 1, 2, 3, 6
| option code | 举例(wireshark解析后数据) | Option Value |
| 1: Client Identifier | ![]() | 前面2个字节为DUID类型,例如3:表示链路层地址; 紧跟着的2个字节为硬件类型,例如1:表示以太网; 最后的字节为具体的硬件地址,如果为以太网,则硬件地址长度为6个字节。 |
| 2: Server Identifier | ![]() | 前面的2个字节为DUID类型,例如1:表示链路层地址加时间戳; 紧跟着的2个字节为硬件类型,例如0:表示NET/ROM pseudo; 接着的2个字节为时间戳; 最后的字节为具体的链路层地址,如果为以太网,则长度为6个字节 |
| 3: IA for NA | ![]() | 前面4个字节为IAID的值; 紧跟着的4个字节为T1的值; 接着的4个字节为T2的值; 接着的2个字节为IA地址的类型; 接着的2个字节为IA地址的长度; 接着的16个字节为IA地址的具体值; 接着的4个字节为Preferred Lifetime; 最后的4个字节为Valid Lifetime。 |
| 6: Option Request | ![]() | 占据n个双字节,每个双字节代表一个请求的option type |
| 6: Option Request | ![]() | 占据n个双字节,每个双字节代表一个请求的option type |
| 6: Option Request | ![]() | 占据n个双字节,每个双字节代表一个请求的option type |
(2)option 56: NTP Server
该option表示NTP服务器,可以是IPv6地址格式,也可以是FQDN形式。Value值是3种类型Suboption之一,Suboption本身也是TLV格式,三种Suboption如下表
| Option | 举例(wireshark解析后数据) | Option Value:(Suboption * n个) |
| 56: NTP Server | ![]() | Suboption 1: NTP Server Address |
| 56: NTP Server | Suboption 2: NTP Multicast Address | |
| 56: NTP Server | Suboption 3: NTP Server FQDN |
(3)option 16 & option 17
这两个option是用来处理vendor-class类型的option,当客户端请求报文里的option16已经在服务器端创建时,服务器通过option17把指定厂商的Suboption给到客户端。
| Option | 举例(wireshark解析后数据) | Option Value |
| 16: Vendor Class | ![]() | 前面4个字节为厂商ID编号,格式为整数,例如思科为为:9,微软为:311; 后面m个字节为厂商设备型号,格式为字符串,例如左图中Cisco IP Phone |
| Option | 举例(wireshark解析后数据) | Option Value | |
| Enterprise ID | Suboption * n个 | ||
| 17: Vendor-specific Information | ![]() | 厂商的ID编号,占4个字节,例如思科的ID为9 | 厂商的子选项,格式由厂商定义。例如如左图所示,思科的Suboption格式为TLV格式。 |
(4) option 15 & XX
这两个option是用来处理user-class类型的option,当客户端请求报文里的option15已经在服务器端创建时,服务器通过optionXX把指定用户的Suboption给到客户端。
========option 15 & XX====================
2.2 常规的option
(1)Option type + Length + Interger
| option type举例 | 举例(wireshark解析后数据) | Option Value |
| 8: Elapsed time | ![]() | 固定4个字节,格式为长整数,代表时间 |
(2)Option type + Length + IPv6_address * n (n=1,2,3,...)
| option type举例 | 举例(wireshark解析后数据) | Option Value |
| 23: DNS Servers | ![]() | 多个IPv6地址,占据n个16字节 |
| 52: CAPWAP AC Addresses | ![]() | 多个IPv6地址,占据n个16字节 |
(3)Option type + Length + FQDN * n (n=1,2,3,...)
| option type举例 | 举例(wireshark解析后数据) | Option Value |
| 24: domain list | ![]() | 多个域名 |












