奔涌的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:00 769

评论

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

时空碰撞优化系列·二

誓约·追光者

hive Sparksql 计算效率 优化

第7周作业

Vincent

极客时间 极客大学

解Bug之路-记一次对端机器宕机后的tcp行为

无毁的湖光

Linux TCP socket MQ Java 分布式

是的,我去封闭开发了

lockdown56

生活,随想 工作哲学 摄影 摄影征文

Android Native crash处理案例分享

阿里云金融线TAM SRE专家服务团队

android

架构师训练营 1 期第 2 周:框架设计 - 作业

piercebn

架构师训练营第 1 期

LeetCode题解:145. 二叉树的后序遍历,递归,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

oeasy 教您玩转 linux 010400 总结 summary

o

高并发下为什么更喜欢进程内缓存

架构师修行之路

缓存 架构设计

第7周的总结

Vincent

极客时间 极客大学

Redis 发布订阅,小功能大用处,真没那么废材!

楼下小黑哥

Java redis spring

微前端qiankun从搭建到部署的实践

fengxianqi

前端框架 微前端 微应用

超越色彩的魅力:读《黑白适界》

北风

艺术 摄影 黑白 摄影征文 画册

anyRTC无人机图传方案

anyRTC开发者

WebRTC 语音 直播 RTC 安卓

我把某大厂P8大牛手写的 Linux+网络编程 手册搞到手了

互联网架构师小马

Java Linux 程序员 网络编程 操作系统

分布式高并发下Actor模型如此优秀

架构师修行之路

系统设计 reactor 高并发

Spring系列之新注解配置+Spring集成junit+注解注入

云流

Java spring 架构师 微服务框架

架构师训练营 - 第 2 周课后作业(1 期)

阿甘

译文|简明指南:Apache Pulsar 的分层存储

Apache Pulsar

开源 云原生 存储分离 Apache Pulsar 消息中间件

架构师训练营第 1 期 -week2

习习

判断一个请求是否是Ajax异步请求

麦叔

ajax

甲方日常 20

大橘子

工作 随笔杂谈 日常 Java 25 周年

一夜爆火,只因阿里内部作为参考的SpringBoot巅峰之作git开源

小Q

Java 架构 面试 微服务 springboot

golang set数据结构

猴子胖胖

golang 数据结构

第6周作业

方堃

架构师训练营 - 第 2 周学习总结(1 期)

阿甘

响应式编程到底是什么?

博文视点Broadview

Java 响应式 响应式编程 reactor 并发

在网站上如何识别AG黑网站和在线靠谱的平台?

InfoQ_6b6a6317a692

网站日志分析最完整实践

MySQL从删库到跑路

看动画学算法之:排序-count排序

程序那些事

动画 看动画学算法 看动画学数据结构 count排序

第2周

Geek_fabd84

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