随着IPv6技术的普及,DHCPv6 作为基础技术是每一位IT人或多或少都需要了解的。本文将依托腾讯云CVM来详细剖析 DHCPv6 的工作原理,希望可以让更多小伙伴掌握 DHCPv6 协议。什么是 DHCPv6 协议?客户端如何首次自动获取一个 IPV6 地址?CVM重启又如何自动获取到上次使用的 IPv6 地址?本文作者:腾讯云售后架构师 李彬文。
一、DHCPv6简介
DHCPv6 (Dynamic Host Configuration Protocol for IPv6)是一个用来分配 IPv6 地址、前缀以及DNS等配置的网络协议。
DHCPv6 是一种运行在客户端和服务端之间的协议,与 IPv4 中的 DHCP 一样,所有的协议报文都是基于 UDP 的(客户端使用UDP 端口号546,服务端使用端口号547)。但是由于在 IPv6中 没有广播报文,因此 DHCPv6 使用组播(默认所有DHCPv6服务器都会加入并侦听该组播组:FF02::1:2)报文,客户端也无需配置服务端的IPv6地址。
1. DHCPv6协议的优势
相对其他分配IPV6地址的方式而言,DHCPv6具备以下优势:
- 更好控制 IPv6 地址的分配,DHCPv6 方式不仅可以记录为 IPv6 主机分配的地址,还可以为特定的 IPv6 主机分配特定的地址,以便于网络管理。
- DHCPv6 支持为网络设备分配 IPv6 前缀,便于全网络的自动配置和网络层次性管理。
- 除了为 IPv6 主机分配 IPv6 地址和前缀外,还可以分配DNS服务器 IPv6 地址等网络配置参数。
2. DHCPv6报文格式
DHCPv6 属于 OSI 七层协议栈的应用层,所以需要先封装网络层 IPv6 头部以及传输层UDP头部。
3. DHCPv6字段注释
- msg-type:长度8比特,表示报文的类型,总共定义了13种消息类型。
- transaction-id:长度24比特,表示 DHCPv6 客户端随机生成的交互ID(服务端发起的报文交互ID为0),用来标识一次来回交互的 DHCPv6 报文。例如Solicit/Advertise报文为一次交互,Request/Reply报文为另外一次交互,两者有不同的交互ID。
- options:根据消息类型不一样长度可变,表示 DHCPv6 的可选字段。此字段包含了 DHCPv6 服务器分配给 IPv6 主机的配置信息,如客户端标识、服务器标识或有效生命周期等信息。
4. DHCPv6定义的几种常见消息类型
(1)Solicit,DHCPv6 客户端使用Solicit报文来发现 DHCPv6 服务器的位置。
(2)Advertise,DHCPv6 服务器发送Advertise报文来对Solicit报文进行回应,通告客户端能够提供哪些 DHCPv6 服务。
(3)Request,DHCPv6 客户端发送Request报文来向DHCPv6服务器请求IPv6地址和其它配置信息。
(4)Confirm,DHCPv6 客户端向任意可达的 DHCPv6 服务器发送Confirm报文检查自己目前获得的 IPv6 地址是否适用与它所连接的链路。
(5)Reply,DHCPv6服务器在以下场合发送Reply报文:
- DHCPv6 服务器发送携带了地址和配置信息的Reply消息来回应从 DHCPv6 客户端收到的Solicit、Request、Renew、Rebind报文。
- DHCPv6 服务器发送携带配置信息的Reply消息来回应收到的Information-Request报文。
- 用来回应 DHCPv6 客户端发来的Confirm、Release、Decline报文。
(6)Decline,DHCPv6 客户端向 DHCPv6 服务器发送 Decline 报文,声明 DHCPv6 服务器分配的一个或多个地址在 DHCPv6 客户端所在链路上已经被其他客户端使用。
二、首次获取IPV6地址解析
CVM首次接入腾讯云 IPv6 网络,通过 DHCPv6 自动获取 IPv6 地址的交互报文如下所示:
1. 发现阶段
客户端CVM(云服务器)发送Solicit报文来发现 DHCPv6 服务器,并请求DHCPv6 服务器(腾讯云虚拟组件)为其分配 IPv6 地址和网络配置参数。
由于CVM不知道 DHCPv6 服务器的 IPv6 地址,所以CVM用组播地址:FF02::1:2向同一链路范围内的所有DHCPv6服务器发送Solicit报文。
Solicit报文中携带了客户端的DUID、需要请求的非临时地址、以及其他网络配置参数等信息。
2. 提供阶段
DHCPv6 服务器接收到Solicit报文后,选择按照 IPv6 地址从小到大的顺序采用循环查找方式,选择最新找到的可供分配的 IPv6 地址,然后通过Advertise报文以单播方式回应给CVM。
Advertise报文里面携带了服务器的DUID、客户端的DUID、分配给客户端的IPv6地址及租期等信息。
3. 选择阶段
因为Solicit报文是组播发送的,所以如果同一链路范围内存在多个 DHCPv6 服务器,则接收到Solicit报文的服务器都会回应Advertise报文。
如果有多个 DHCPv6 服务器向DHCPv6客户端回应Advertise报文,则 DHCPv6 客户端选择服务器优先级最高的Advertise报文(DHCPv6 服务器可以在Advertise消息中包含Preference选项,以便控制客户端对服务器的选择),然后客户端以组播方式向同一链路范围内的所有 DHCPv6 服务器发送Request报文,该报文中包含客户端选择的 DHCPv6 服务器(高优先级)的DUID、客户端的DUID、客户端IPv6地址。
4. 确认阶段
当 DHCPv6 服务器收到Request报文后,对报文中携带的服务端DUID信息进行判断:
- 若报文中携带的服务端DUID不是本服务端的DUID,则对该Request报文不回应,同时将Request报文中请求的IPv6地址进行回收。
- 若报文中携带的服务端DUID是本服务端的DUID,则以单播方式回应Reply报文,确认Request报文中请求的IPv6地址分配给客户端使用。
5. 客户端CVM处理阶段
客户端CVM收到Reply报文后会发送地址冲突探测报文(Neighbor Solicitation),检查本链路范围内是否有其他客户端使用相同的IPv6地址,如果在指定时间内没有收到回应,表示客户端可以使用此地址。
注意事项:如果发的地址冲突探测报文(Neighbor Solicitation)收到了回应,说明有其他客户端使用了此地址,CVM会以单播方式向服务端发送Decline(声明地址冲突)报文,并重新发送Solicit报文请求新的可用IPv6地址。服务端收到Decline报文后,会将报文中携带的IPv6地址列为冲突地址。
三、重启后获取IPV6地址解析
CVM非首次接入腾讯云IPv6网络,通过 DHCPv6 自动获取 IPv6 地址的交互报文如下所示:
第一步,当客户端CVM(云服务器)非首次接入 IPv6 网络时(比如重启、网卡禁用后再启用等),CVM会通过组播地址:FF02::1:2,发送Confirm报文确认该CVM之前的IPv6地址是否仍然可用。
第二步,DHCPv6 服务器(腾讯云虚拟组件)收到Confirm报文后,确认Confirm报文中所有的地址是否适用于该CVM。
若Confirm报文中所有的IPv6地址都通过了确认,服务器回应确认成功的Reply报文(如果客户端收到确认失败的Reply报文,则发送Solicit报文,重新请求IPv6地址;)。
第三步,客户端CVM收到确认成功的Reply报文后会发送地址冲突探测报文(Neighbor Solicitation),检查本链路范围内是否有其他客户端使用相同的IPv6地址,如果在指定时间内没有收到回应,表示该CVM可以使用此地址。
至此,客户端通过DHCPv6协议首次和非首次自动获取IPv6地址的原理就解释清楚了,通过该文章也阐述了DHCPv6的6种常用类型报文的作用,希望小伙伴们多多尝试,加深理解。