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节):

  1. 源IP地址是链路本地地址。路由器必须使用其链路本地地址作为路由宣告和重定向消息的源地址,以便主机可以唯一识别路由器。
  2. IP头部的跳数限制字段值是255,报文不能是被其它路由器转发过的。
  3. ICMP头部的校验和有效。
  4. ICMP头部的代码(Code)字段值为0。
  5. ICMP报文的长度为16字节或更长。
  6. 携带的所有选项的长度字段值大于0。

路由器宣告(RA)消息中包含Router Lifetime字段,指示路由器的有效期,当收到此字段值为0的RA时,主机从默认路由器列表中删除该路由器。

主机会针对默认路由器的地址进行邻居发现来解析其MAC地址。

邻居发现的过程

邻居发现主要有3种用途:

  1. 地址解析;
  2. 可达性探测;
  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服务器信息:

  1. 使用DHCPv6从服务器获取;
  2. 从RA中获取,使用Recursive DNS Server选项;
  3. 使用知名任播地址,在系统内预设置;

这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”:

  1. 若接收的有效生命周期长于2小时或比RemainingLifetime长,则将地址的有效生命周期设置为被宣告的有效生命周期。
  2. 若RemainingLifetime小于或等于2小时,则忽略前缀信息选项中的有效生命周期,除非包含前缀信息选项的路由器宣告消息已被认证(例如,通过RFC3971中说明的安全的邻居发现)。若路由器宣告消息被认证通过,则地址的有效周期应该被设置为接收的前缀信息选项中携带的有效生命周期。
  3. 其它情况下,将地址的有效周期重置为2小时。

这些规则的初衷是为了避免拒绝服务攻击。根据这些规则,如果想撤销某个前缀,即使在RA报文中包含了有效生命周期为0的前缀信息选项,主机也会将地址保留至少2个小时。

为什么经常看到Windows电脑上有很多IPv6地址?

这主要有以下几个原因:

  1. Windows系统针对同一个前缀,至少生成2个地址,其中一个被称为“稳定地址”,用于从外部访问主机;一个被称为“临时地址”,用于本机发起到外部的连接。
  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地址生成的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/939657.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】【集成学习——决策树、随机森林】从零起步:掌握决策树、随机森林与GBDT的机器学习之旅

这里写目录标题 一、引言机器学习中集成学习的重要性 二、决策树 (Decision Tree)2.1 基本概念2.2 组成元素2.3 工作原理分裂准则 2.4 决策树的构建过程2.5 决策树的优缺点(1)决策树的优点(2)决策树的缺点(3&#xff0…

ubuntu+ros新手笔记(五):初探anaconda+cuda+pytorch

深度学习三件套:初探anacondacudapytorch 系统ubuntu22.04 ros2 humble 1.初探anaconda 1.1 安装 安装过程参照【详细】Ubuntu 下安装 Anaconda 1.2 创建和删除环境 创建新环境 conda create -n your_env_name pythonx.x比如我创建了一个名为“py312“的环境…

Diffusino Policy学习note

Diffusion Policy—基于扩散模型的机器人动作生成策略 - 知乎 建议看看,感觉普通实验室复现不了这种工作。复现了也没有太大扩展的意义。 Diffusion Policy 是监督学习吗 Diffusion Policy 通常被视为一种基于监督学习的方法,但它的实际训练过程可能结…

【Unity功能集】TextureShop纹理工坊(三)图层(下)

项目源码:在终章发布 索引 图层渲染绘画区域图层Shader 编辑器编辑模式新建图层设置当前图层上、下移动图层删除图层图层快照 图层 在PS中,图层的概念贯穿始终(了解PS图层),他可以称作PS最基础也是最强大的特性之一。…

1、数据库概念和mysql表的管理

数据库概念 datebase:用来组织,存储,管理数据的仓库。 数据库的管理系统:DBMS(用来实现对数据的有效组织、关系和存取的系统软件) 关系型和非关系型数据库 关系型数据库:mysql、oracle 非关…

70 mysql 中事务的隔离级别

前言 mysql 隔离级别有四种 未提交读, 已提交读, 可重复度, 序列化执行 然后不同的隔离级别存在不同的问题 未提交读存在 脏读, 不可重复度, 幻觉读 等问题 已提交读存在 不可重复度, 幻觉读 等问题 可重复读存在 幻觉读 等问题 序列化执行 没有以上问题 然后 我们这里…

【FFmpeg】解封装 ① ( 封装与解封装流程 | 解封装函数简介 | 查找码流标号和码流参数信息 | 使用 MediaInfo 分析视频文件 )

文章目录 一、解封装1、封装与解封装流程2、解封装 常用函数 二、解封装函数简介1、avformat_alloc_context 函数2、avformat_free_context 函数3、avformat_open_input 函数4、avformat_close_input 函数5、avformat_find_stream_info 函数6、av_read_frame 函数7、avformat_s…

Nginx(Linux之Ubuntu)

1.1.什么是Nginx Nginx(发音为"engine x")是由俄罗斯开发者Igor Sysoev创建的一款轻量级、高性能的Web服务器。它首次发布于2004年,如今已成为全球最受欢迎的Web服务器之一。Nginx以其卓越的性能和灵活性而闻名,适用于…

使用Docker启用MySQL8.0.11

目录 一、Docker减小镜像大小的方式 1、基础镜像选择 2、减少镜像层数 3、清理无用文件和缓存 4、优化文件复制(COPY和ADD指令) 二、Docker镜像多阶段构建 1、什么是dockers镜像多阶段构建 1.1 概念介绍 1.2 构建过程和优势 2、怎样在Dockerfil…

【微信小程序开发 - 3】:项目组成介绍

文章目录 项目组成介绍项目的基本组成结构小程序页面的组成部分JSON配置文件的作用app.json文件project.config.json文件sitemap.json文件页面的 .json 配置文件新建小程序页面修改项目首页 XWML模板XWML 和 HTML 的区别 WXSS样式WXSS 和 CSS 的区别 .js文件 项目组成介绍 项目…

springboot的项目创建和常用注解

创建springboot项目&#xff1a; 首先更改一下url&#xff0c;点击小齿轮改成https://start.aliyun.com/ 首先在选模块的时候选上SpringWeb&#xff0c;然后jdk1.8对应的springboot版本是2.6.13或者2.7.6 pom.xml: 用1.8的jdk&#xff0c;mybatis的包版本不能太高 <!-- …

flask_socketio 以继承 Namespace方式实现一个网页聊天应用

点击进入上一篇&#xff0c;可作为参考 实验环境 python 用的是3.11.11 其他环境可以通过这种方式一键安装&#xff1a; pip install flask3.1.0 Flask-SocketIO5.4.1 gevent-websocket0.10.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple pip list 详情如下&am…

笔记本重装系统教程【详细教程】

一、装机前说明 各位有装机需求的伙伴&#xff0c;请根据自己的电脑配置选择合适操作系统&#xff0c;可以实现自己装机的伙伴&#xff0c;相信大家这点可以确认好。 ———————————————————————— 我的配置&#xff1a; 我的电脑是联想拯救者lenovoY7000…

uniapp入门 01创建项目模版

0安装 hbuilder x 标准版 1.创建模版工程 2.创建官方 案例工程 index.uvuewen 文件解析 <!-- 模版 标签 --> <template><view></view></template><!-- 脚本 --> <script>export default {data() {return {}},onLoad() {},methods:…

ARCGIS国土超级工具集1.2更新说明

ARCGIS国土超级工具集V1.2版本&#xff0c;功能已增加至47 个。在V1.1的基础上修复了若干使用时发现的BUG&#xff0c;新增了"矢量分割工具"菜单&#xff0c;同时增加及更新了了若干功能&#xff0c;新工具使用说明如下&#xff1a; 一、勘测定界工具栏更新界址点成果…

Vue3源码笔记阅读1——Ref响应式原理

本专栏主要用于记录自己的阅读源码的过程,希望能够加深自己学习印象,也欢迎读者可以帮忙完善。接下来每一篇都会从定义、运用两个层面来进行解析 定义 运用 例子:模板中访问ref(1) <template><div>{{str}}</div> </template> <script> impo…

[react] 优雅解决typescript动态获取redux仓库的类型问题

store.getState()是可以获取总仓库的 先拿到函数的类型 再用ReturnType<T> 它是 TypeScript 中的一个内置条件类型&#xff0c;用于获取某个函数类型 T 的返回值类型 代码 // 先拿总仓库的函数类型type StatefuncType typeof store.getState;//再拿函数类型T的返回值类…

【Qt】QWidget中的常见属性及其功能(一)

目录 一、 enabled 例子&#xff1a; 二、geometry 例子&#xff1a; window fram 例子 &#xff1a; 四、windowTiltle 五、windowIcon 例子&#xff1a; qrc机制 创建qrc文件 例子&#xff1a; qt中的很多内置类都是继承自QWidget的&#xff0c;因此熟悉QWidget的…

R语言的字符串操作

【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言医学数据分析实践-R语言的数据结构-CSDN博客 在R语言中&#xff0c;字符串是一种表示文本数据的数…

webGL硬核知识:图形渲染管渲染流程,各个阶段对应的API调用方式

一、图形渲染管线基础流程概述 WebGL 的图形渲染管线大致可分为以下几个主要阶段&#xff0c;每个阶段都有其特定的任务&#xff0c;协同工作将 3D 场景中的物体最终转换为屏幕上呈现的 2D 图像&#xff1a; 顶点处理&#xff08;Vertex Processing&#xff09;阶段&#xff1…