随着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种常用类型报文的作用,希望小伙伴们多多尝试,加深理解。