SLAAC如何工作?
SLAAC如何工作?
IPv6无状态地址自动配置(SLAAC)-常见问题 - 苍然满关中 - 博客园
https://support.huawei.com/enterprise/zh/doc/EDOC1100323788?section=j00s
https://www.zhihu.com/question/6691553243/answer/57023796400
主机在启动或接口UP后,发送路由器祈求(Router Solicitation,RS),路由器收到此消息后,回复路由器宣告(Router Advertisement,RA)。此宣告可能是单播给主机的,也可能是多播的,取决于路由器当前的状态(见下文)。
路由器在RA中设置M位和O位,针对这两个标志位,解释如下:
M位:“Managed address configuration”标志。值为1时,表示地址可以通过DHCPv6方式获取。若M标识位置1,O标志位是冗余的,可以被忽略,因为DHCPv6可以提供所有的配置信息。
O位:“Other configuration”标志。值为1时,表示除地址外其它的配置信息可是通过DHCPv6方式获取。
若使用SLAAC,则RA中会设置M=0,O=1,指示主机通过SLAAC来配置地址,其它信息,如DNS服务器等,可以通过DHCPv6方式获取(也可以通过单个RA来一次性的获取前缀和DNS服务器信息,关于获取DNS的方式,请参考下文)。RA中同时会携带一个前缀信息选项(Prefix Information Option,PIO),指示主机应该使用的前缀。
主机收到RA后,解析消息,使用RA中指定的前缀(一般前缀长度为64位),与本地生成的64位接口ID组合,生成接口的128位IP地址。在经过重复地址检测(DAD)后,确认地址可用。至此,主机使用SLAAC来配置自身的过程已经完成,就可以使用IPv6地址进行通信了。
与IPv4类似,主机要想访问IPv6互联网,还需要知道默认路由器(网关)信息和DNS服务器信息。
获取默认路由器(网关)也是通过RA来完成的,详见下文。
IPv6 DNS服务器信息的重要性不高,没有此信息也不会影响主机使用IPv6访问互联网,原因是,主机一般是双栈的,可以使用IPv4来查询AAAA记录。
IPv6如何发现默认路由器(网关)?
主机收到有效的路由器宣告(RA)消息后,从消息中提取源地址并添加到自己的默认路由器列表中(参考RFC4861第6.3.4节)。
主机对路由器宣告(RA)消息进行如下有效性检查(参考RFC4861第6.1.2节):
- 源IP地址是链路本地地址。路由器必须使用其链路本地地址作为路由宣告和重定向消息的源地址,以便主机可以唯一识别路由器。
- IP头部的跳数限制字段值是255,报文不能是被其它路由器转发过的。
- ICMP头部的校验和有效。
- ICMP头部的代码(Code)字段值为0。
- ICMP报文的长度为16字节或更长。
- 携带的所有选项的长度字段值大于0。
路由器宣告(RA)消息中包含Router Lifetime字段,指示路由器的有效期,当收到此字段值为0的RA时,主机从默认路由器列表中删除该路由器。
主机会针对默认路由器的地址进行邻居发现来解析其MAC地址。
邻居发现的过程
邻居发现主要有3种用途:
- 地址解析;
- 可达性探测;
- 重复地址检测(DAD)
本节主要讲述第一种用途。
与IPv4类似,主机在与同网段其他主机或网关通信时,需要学习对端的MAC地址。在IPv4中,这是通过ARP来实现的,在IPv6中,这个过程叫邻居发现。
邻居发现包括2个报文,即邻居祈求(Neighbor Solicitation,RS)和邻居宣告(Neighbor Advertisement,NA)。类似IPv4中的ARP请求和应答。
主机首先发送NS,其中目的地址是“请求节点多播地址”,源地址是自身接口的地址。在Target Address字段中包含要解析的目标地址。必须携带源链路层地址(Source Link-layer Address)选项,包含自己的链路层地址。
思考:为什么NS的目的地址是“请求节点多播地址”,而不是直接使用目标地址?
“请求节点多播地址”的格式为“FF02:0:0:0:0:1:FFXX:XXXX”,其计算方式是取目标单播/任播地址的低24位,将其附加到前缀FF02:0:0:0:0:1:FF00::/104之后。
目标主机收到NS后,回复NA,携带目标链路层地址(Target link-layer address)选项,包含对应的链路层地址。
主机收到NA后,地址解析已完成。后续就可以向目标主机发送报文了。
什么是重复地址检测(DAD)?
主机在使用RA中宣告的前缀和自己生成的接口ID组合生成完整的IPv6地址之后,需要先对该地址进行重复地址检测,检测通过,确认无冲突后,才能使用该地址。在检测完成前,该地址被称为“临时地址”或“候选地址”(tentative address)。
使用邻居发现过程来进行重复地址检测。
主机发送NS,其中源地址为“未指定地址”(unspecified address),即全0的IPv6地址“::”。目的地址为使用临时地址生成的请求节点多播地址。Target Address中包含该临时地址。这种NS不携带源链路层地址选项(Source Link-layer Address)。
源地址使用“未指定地址”的原因是,此时接口还没有地址,在重复地址检查完成前,临时地址不会被分配给接口。
不携带源链路层地址选项的原因是,若存在冲突,其它节点在回复时,会将NA发往所有节点多播地址,不需要此信息。
主机预期此NS消息不会收到回复。若收到回复,则表面存在地址冲突。主机需要重新生成接口ID,进而生成新的IPv6地址,再次执行重复地址检测过程。
路由器使用单播还是多播发送RA?
路由器在收到RS后,会回复RA。路由器根据自身情况决定使用单播还是多播进行回复。
路由器本身会周期性的发送多播RA。邻居发现协议对RA做了限速。路由器在收到RS后,会计算一个时延。若下一个周期性RA的发送时间比当前时间加上时延更早,则按计划发送周期性的多播RA。否则,发送单播RA给主机。
主机获取DNS服务器信息的方法有哪些?
目前主机有3中方式获取DNS服务器信息:
- 使用DHCPv6从服务器获取;
- 从RA中获取,使用Recursive DNS Server选项;
- 使用知名任播地址,在系统内预设置;
这3种方式中,最常见的是第一种。
第二种方式出现的较晚,最开始在RFC5006中定义,后被RFC6106替代,最新的标准是RFC8106。这种方式使用的也不多。
第三种方式用到的最少。
如何撤销或修改前缀?
家庭宽带中,路由器或光猫在WAN侧到BRAS进行PPPOE拨号,通过IPCP获取IPv4地址,通过IPV6CP协商IPv6接口ID。后续通过RS/RA流程获取前缀信息,生成WAN口的全局IPv6地址。然后通过DHCPv6从BRAS获取IA_PD,即代理前缀。此代理前缀长度一般小于或等于64位。
路由器或光猫随后从代理前缀中划分出一个64位前缀,用于下挂终端的SLAAC配置。
在光猫WAN侧重播号导致获取的IA_PD前缀发生变化,或者WAN侧拨号失败等情况发生时,需要撤销之前宣告的前缀。
路由器发送RA消息,将前缀的Valid Lifetime设置为0。主机收到此类RA之后,会立即将前缀列表中对应的条目设置为超时(参考RFC4861第6.3.5节)。
在路由器断电重启的场景下,若重启前后从WAN侧获取的IA_PD不一致,路由器无法将重启前的前缀宣告为无效以撤销。这会造成终端上有多个IP地址。若终端在发起IPv6连接时选择了错误的地址,则可能造成通信失败。
这里的超时是将前缀列表中的条目设置为超时,而前缀列表的用途是进行同一链路(on-link)判定,即在发送报文时,根据目的IPv6地址和前缀列表中的信息来决定将报文直接发往目标主机还是网关。
在RFC4862(IPv6无状态地址自动配置)第5.5.3节(处理路由器宣告)第e)中,有如下规定:
针对地址的有效生命周期具体采取的行动取决于接收的宣告中的有效生命周期和之前自动配置的地址的有效生命周期的剩余时间。在下文的讨论中,我们将剩余的时间称为“RemainingLifetime”:
- 若接收的有效生命周期长于2小时或比RemainingLifetime长,则将地址的有效生命周期设置为被宣告的有效生命周期。
- 若RemainingLifetime小于或等于2小时,则忽略前缀信息选项中的有效生命周期,除非包含前缀信息选项的路由器宣告消息已被认证(例如,通过RFC3971中说明的安全的邻居发现)。若路由器宣告消息被认证通过,则地址的有效周期应该被设置为接收的前缀信息选项中携带的有效生命周期。
- 其它情况下,将地址的有效周期重置为2小时。
这些规则的初衷是为了避免拒绝服务攻击。根据这些规则,如果想撤销某个前缀,即使在RA报文中包含了有效生命周期为0的前缀信息选项,主机也会将地址保留至少2个小时。
为什么经常看到Windows电脑上有很多IPv6地址?
这主要有以下几个原因:
- Windows系统针对同一个前缀,至少生成2个地址,其中一个被称为“稳定地址”,用于从外部访问主机;一个被称为“临时地址”,用于本机发起到外部的连接。
- Windows默认启用了隐私扩展,生成的临时地址会有一个较短的生命周期。在临时地址的生命周期到期后,地址会变为废止状态,并生成新的临时地址。但此时若有应用程序仍在使用被废止的地址,则该地址不会被删除。
上述两个原因导致启用IPv6的Windows系统在运行一段时间后,会看到有很多IPv6地址。
Windows上禁用隐私扩展(即不自动生成临时地址)的方法:
使用管理员身份打开cmd命令行,执行下列命令
netsh interface ipv6 set privacy state=disabled
下图是禁用之前的效果,可以看到针对每个前缀,都至少有1个临时地址。

禁用过程(执行此命令后可能需要禁用再启用网卡):

下图是禁用之后的效果,可以看到,系统没有再生成IPv6临时地址:

为什么windows电脑上IPv6地址的后64位接口ID和MAC没有关系?
在使用SLAAC时,IPv6地址的后64位被称为接口标识符,也被简称为IID(Interface Identifier),由主机自己生成。
标准文档中介绍的生成接口ID的算法一般是根据48位的MAC地址来生成IEEE EUI-64标识。Windows系统出于安全考虑等因素,使用了随机的接口ID。这同时也是后续标准文档中推荐的做法。
生成接口标识符的方式有很多,包括但不限于以下的方式:
- 基于IEEE标识符的IID,这是在RFC4291中定义的;
- 静态/手工配置IID,即由用户自己指定;
- 固定的,语义不透明的IID,这是Windows系统使用的方式,最新标准是RFC8981;
- 加密生成的IID,也被称为CGA;
- 稳定的,语义不透明的IID,这种方法由RFC7217指定;
...
在Windows下可以使用下列命令来关闭随机生成接口ID:
Netsh interface ipv6 set global randomizeidentifiers=disabled
关闭之后的效果如下:
可以看到,IPv6地址中的IID部分是由48位MAC地址生成的。

相关文章:
SLAAC如何工作?
SLAAC如何工作? IPv6无状态地址自动配置(SLAAC)-常见问题 - 苍然满关中 - 博客园 https://support.huawei.com/enterprise/zh/doc/EDOC1100323788?sectionj00shttps://www.zhihu.com/question/6691553243/answer/57023796400 主机在启动或接口UP后,发…...
电脑丢失dll文件一键修复的多种方法分析,电脑故障修复攻略
电脑在使用过程中,有时会遇到DLL文件丢失的情况,这可能导致软件无法正常运行或系统出现故障。当面对这种状况时,不必过于慌张,因为有多种有效的修复方法可供选择。下面我们一起来看看电脑丢失dll文件的多种解决方法。 一.了解什么…...
Docker容器命令
docker 命令说明docker pull拉取镜像docker push推送镜像到DockerRegistrydocker images查看本地镜像docker rmi删除本地镜像docker run创建并运行容器(不能重复创建)docker stop停止指定容器docker start启动指定容器docker restart重新启动容器docker…...
【Leetcode 每日一题】3291. 形成目标字符串需要的最少字符串数 I
问题背景 给你一个字符串数组 w o r d s words words 和一个字符串 t a r g e t target target。 如果字符串 x x x 是 w o r d s words words 中 任意 字符串的 前缀(字符串的前缀是从字符串的开头开始并延伸到其中任意点的子串),则认为…...
Windows聚焦壁纸代理不更新——解除UWP应用回环限制
开代理后经常出现Microsoft store打不开,聚焦壁纸不更新的情况,因为UWP应用默认禁止回环地址,导致开了代理以后不仅用不了代理上网,还把自己的本来的通信堵死了 打开CMD输入 FOR /F "tokens11 delims\" %p IN (REG QUER…...
电脑开机提示error loading operating system怎么修复?
前一天电脑还能正常运行,但今天启动时却显示“Error loading operating system”(加载操作系统错误)。我已经仔细检查了硬盘、接线、内存、CPU和电源,确认这些硬件都没有问题。硬盘在其他电脑上可以正常使用,说明不是硬…...
javaFX.(蜜雪冰城点餐小程序)MySQL数据库
学习Java只有3个月,不喜勿喷 该小程序是用的MySQL数据库,编辑软件用的equals,为什么不用idea有提示因为主打一个纯手打 要源码私信 目录 javafx.小程序(蜜雪冰城点餐系统)简介 主体思路 思路讲解 用户登录 用户注册 忘记…...
Unity Apple Vision Pro 开发教程:物体识别跟踪
Spatial XR 开发者社区官网:SpatialXR 社区 开发流程与原理:Apple Vision Pro 物体识别跟踪原理与开发流程【Unity Apple Vision Pro 开发系列教程】 PolySpatial 物体跟踪官方样例讲解:Unity Apple Vision Pro 开发教程:物体识别…...
nano编辑器的使用
nano 是一个非常简单易用的命令行文本编辑器,它常用于在 Linux 或类 Unix 系统中快速编辑文件,特别适用于需要修改配置文件或快速编辑文本的场景。以下是一些常见的 nano 使用技巧和基本操作。 1. 打开文件 要使用 nano 编辑文件,打开终端并…...
框架问题学习
1、gin 1.1、gin框架路由是怎么处理的 在 Gin 中,路由是通过 gin.Default() 或 gin.New() 创建的 *gin.Engine 对象来管理的。gin.Default() 是 gin.New() 的一个封装,它在创建路由对象时会自动添加一个默认的中间件(如日志记录、恢复中间件…...
前端:纯前端快速实现html导出word和pdf
实现html导出word,需要使用两个库。 html-docx-js和file-saver 导出word的js方法 > npm install html-docx-js >npm install file-saver js引入 import FileSaver from “file-saver”; import htmlDocx from “html-docx-js/dist/html-docx”; /**导出…...
三相异步电动机如何调试?
在现代工业中,三相异步电动机因其结构简单、运行可靠和适应性强而被广泛应用。然而,正确的调试过程是确保电动机高效运行和延长其使用寿命的关键。 一、调试前的准备工作 在开始调试之前,必须进行充分的准备工作,以确保调试顺利…...
四川托普信息技术职业学院教案1
四川托普信息技术职业学院教案 【计科系】 周次 第 1周,第1次课 备 注 章节名称 第1章 XML语言简介 引言 1.1 HTML与标记语言 1.2 XML的来源 1.3 XML的制定目标 1.4 XML概述 1.5 有了HTML了,为什么还要发展XML 1.5.1 HTML的缺点 1.5.2 XML的特点 1.6 X…...
JS数组方法汇总
Array.from //将可迭代对象或字符串转换为数组 console.log(Array.from(1234)); //[ 1, 2, 3, 4 ]Array.isArray //判断是否是数组 Array.isArray([1])//trueArray.concat //用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组 let arr [1,2,3]…...
安装milvus以及向量库增删改操作
首先电脑已经安装了docker windows电脑可下载yml文件 https://github.com/milvus-io/milvus/releases/download/v2.4.6/milvus-standalone-docker-compose.yml 创建milvus文件夹,并在这个目录下创建五个文件夹:conf、db、logs、pic、volumes、wal 然后…...
基于Spring Boot的找律师系统
一、系统背景与意义 在现代社会,法律服务的需求日益增长,但传统寻找律师的方式往往存在信息不透明、选择困难等问题。基于Spring Boot的找律师系统旨在解决这些问题,通过线上平台,用户可以轻松搜索、比较和选择合适的律师&#x…...
Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集NI-FGSM介绍背景算法原理 NI-FGSM代码实现NI-FGSM算法实现攻击效果 代码汇总nifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexNet对CIFAR10进行…...
深度学习实战车辆目标跟踪【bytetrack/deepsort】
本文采用YOLOv8作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv8以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化,该数据集包含丰富的车辆目标图像样本…...
【C复习】模拟题题库*3总结
1.c语言中要求对变量作强制定义的主要理由是便于确定类型和分配空间 2.结构化程序由三中基本结构组成,三中基本结构组成的算法可以完成任何复杂的任务 3.数组名是一个不可变的常量 4.下列选项中,合法的C语言关键字是()。 …...
【数据分析】层次贝叶斯
文章目录 一、 贝叶斯推理二、 层次贝叶斯模型三、 层次贝叶斯的特点四、 数学表述五、推断方法六、应用领域 层次贝叶斯(Hierarchical Bayesian)方法是一种基于贝叶斯推理的统计模型,用于处理具有多个层次结构的数据模型。 它允许我们在同一…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
