写点什么

奔涌的 IPv6 背后,DHCPv6 协议你了解多少?

2020 年 5 月 13 日

奔涌的IPv6背后,DHCPv6协议你了解多少?

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


本文转载自公众号云加社区(ID:QcloudCommunity)。


原文链接


https://mp.weixin.qq.com/s/Z2b09O-ys_GRTytk6D_ajg


2020 年 5 月 13 日 10:00903

评论

发布
暂无评论
发现更多内容

架构师训练营第二周总结

陌生人

架构师训练营 Week 02 总结

Wancho

面向对象设计

编程的发展和设计的美

林昱榕

极客大学架构师训练营 编程的本质 面向对象的本质

week02 学习总结

Just顾

架构师训练营第二周-作业 Cache优化

无心水

极客大学架构师训练营 ISP

week2.学习总结

个人练习生niki

面向对象编程记录

asd945

架构师训练营学习总结(第二周)

战峰

week02-作业

seki

架构师课程学习第二周心得

秤须苑

极客大学架构师训练营

第二周--设计模式

Just顾

架构师训练营第二周心得

努力努力再努力m

极客大学架构师训练营

面向对象编程原则

asd945

架构师训练营第二章作业

JUN

第二周作业

架构师训练营-作业2

进击的炮灰

week2.课后作业

个人练习生niki

依赖倒置原则

架构师训练营第二次总结

+╮(╯▽╰)╭/>……

架构师训练营第二周作业

努力努力再努力m

极客大学架构师训练营

架构师训练营 - 第二周 - 作业

亮灯

【架构师训练营 - week2 -2】总结

早睡早起

「编程模型」C++代码组织

顿晓

c++ 命名空间 namespace 代码组织 编程模型

第二周学习总结

iHai

极客大学架构师训练营

架构师训练营第二课作业

曾祥斌

OOD

Kiroro

架构学习(二)作业

漫步跑小鸡

万物互联=区块链+物联网

CECBC区块链专委会

AI 物联网 区块链技术 智能高效

架构训练营第二周作业

Gavin

架构训练营第二周总结

Gavin

架构师训练营第二周总结

毛叫

极客大学架构师训练营

依赖倒置原则

Acker飏

极客大学架构师训练营

NLP领域的2020年大事记及2021展望

NLP领域的2020年大事记及2021展望

奔涌的IPv6背后,DHCPv6协议你了解多少?-InfoQ