深入研究自动分配IPv6地址的Stateless(无状态)与Stateful(有状态)方式

小慢哥的原创文章,欢迎转载


目录

▪ 一. Link-Local Address的生成方式

▪ 二. Global Address的生成方式

▪ 三. RA报文中3个关键的Flag

▪ 四. 流程示意图

▪ 五. 测试获得IP效果

▪ 六. 应用场景(选择无状态还是有状态)

▪ 七. 后续内容

▪ 附. 参考文档


一. Link-Local Address的生成方式

生成“链路本地地址”,有2种方式

▷ 手动配置

▷ 自动配置

其中“自动配置”根据算法,又分为

▷ eui64:根据mac地址换算而来

▷ stable_secret:跟随网络环境的变化而变化,处于固定网络环境时其值将固定

▷ random:随机生成


二. Global Address的生成方式

生成“全球单播地址”(或者“唯一本地地址”),有2种方式

▷ 手动配置

▷ 自动配置

其中“自动配置”根据获取方式,又分为

▷ 无状态(Stateless):根据路由通告报文RA(Router Advertisement)包含的prefix前缀信息自动配置IPv6地址,组成方式是Prefix + (EUI64 or 随机)。Stateless也可以称为SLAAC(Stateless address autoconfiguration)

▷ 有状态(Stateful):通过DHCPv6方式获得IPv6地址

其中“有状态”又分为2种

▷ 有状态DHCPv6(Stateful DHCPv6):IPv6地址、其他参数(如DNS)均通过DHCPv6获取

▷ 无状态DHCPv6(Stateless DHCPv6):IPv6地址依然通过路由通告RA方式生成,其他参数(如DNS)通过DHCPv6获取

为了避免混淆,在此解释下有状态、无状态到底是什么意思:首先,请明确一点,有状态、无状态仅针对于IPv6地址分配方式,并不包含其他参数

▷ 有状态:可控、可管理。在网络中存在一个IP地址管理者,它能够识别客户端,根据不同的客户端,分配对应的IPv6地址,客户端与服务端之间需要维护IP地址的租期及续约。目前实现这种效果的,就是DHCPv6协议,IP地址管理者就是DHCPv6 Server

▷ 无状态:不可控、难管理。在网络中只有网关,没有IP地址管理者。因此无人去识别客户端,每个客户端根据网关发送的相同的RA报文内容,自行配置IPv6地址


三. RA报文中3个关键的Flag

RA报文中存在3个关键的flag bit:

Autonomous flag(简称A flag):表示是否配置无状态IP。在一个RA报文中,可存在多个prefix,比如2401::/64、2402::/64、2403::/64,每个prefix都可以独立配置A flag

▪ 为on时(对应bit位为1):表示客户端应当在该prefix范围内自动生成IPv6地址(客户端通过DAD自行保证地址可用),并配置子网路由条目、网关

▪ 为off时(对应bit位为0):表示客户端不应当在该prefix范围内自动生成IPv6地址,但是可以配置子网路由条目、网关

Managed flag(简称M flag):表示是否配置有状态IP。M flag是RA报文的全局参数,一个RA报文只有一个M flag

▪ 为on时(对应bit位为1):表示在stateless流程结束后开始stateful流程,也就是告诉客户端可以通过DHCPv6来获得IPv6地址和其他参数(如DNS列表)

▪ 为off时(对应bit位为0):表示不通过DHCPv6来获得IPv6地址。

Other flag(简称O flag):表示是否通过DHCPv6获得除IP以外的其他参数(如DNS列表)。O flag也是RA报文中的全局参数,一个RA报文只有一个O flag。注意:仅当M flag为off时,该参数才会被读取。

▪ 为on时(对应bit位为1):当M flag为on,或者M flag为off且至少有一个A flag为on时,将通过DHCPv6获得其他参数

▪ 为off时(对应bit位为0):当M flag为on时,依然将通过DHCPv6获得其他参数;当M flag也为off时,将不通过DHCPv6获得其他参数


四. 流程示意图

无状态和有状态并不是相互对立的,他们可以同时存在,也就是一张网卡上可以同时出现通过RA生成的IP以及通过DHCPv6获得的IP。通过下面这张笔者绘制的流程图可知晓其中奥秘。

从图中可以看到,顺序为:

1️⃣ Stateless自动配置“链路本地地址”

2️⃣ Stateless自动配置“全球地址”(或“唯一本地地址”)

3️⃣ Stateful自动配置“全球地址”(或“唯一本地地址”)和其他参数,其中Stateful阶段中存在Stateful DHCPv6或Stateless DHCPv6

注意:部分客户端操作系统或网络管理器当Stateless阶段没有收到RA报文后,就到此结束,不会走Stateful阶段,比如CentOS 7、Ubuntu 17的默认逻辑都是这样,而windows server 2012就会继续走Stateful阶段。


五. 测试获得IP效果

测试环境:客户端基于CentOS 7+NetworkManager(即系统默认的网络管理方式)进行测试

▪ 网关会发送RA报文,包含一个prefix

▪ DHCPv6 Server会分配IP、DNS

测试内容:测试M、O、A flag在所有排列组合的情况下

▪ 客户端是否会通过RA报文配置无状态IP

▪ 客户端是否会通过RA报文配置prefix子网路由

▪ 客户端是否会通过RA报文配置gateway

▪ 客户端是否会通过DHCPv6获得有状态IP

▪ 客户端是否会通过DHCPv6获得DNS

测试结果


六. 应用场景(选择无状态还是有状态)

何时采用无状态、何时采用有状态,关键看应用场景。核心在于是否需要控制IP地址,比如保持IP不变,如果需要控制,就采用有状态;如果无需控制,就采用无状态。

▷ 服务端领域:如对外提供服务,通常需要采用有状态IP。因为业务IP的突然变化容易导致业务中断(除非做好服务发现)

▷ 客户端领域:如移动设备、办公室内PC机,只需要上IPv6互联网,并不需要对外提供服务,可以采用无状态IP


七. 后续内容

由于篇幅有限,本文尚未贴出实验的详细配置。将会在《IPv6系列》后续文章里,贴出实验的完整信息,包括RA、DHCPv6的配置,以及客户端的配置,敬请关注。


附. 参考文档

http://www.6deploy.eu/tutorials/080-6deploy_ipv6_autoconfiguration_mechs_v0_4.pdf
https://cshihong.github.io/2018/02/01/DHCPv6基础/

IPv6系列-彻底弄明白有状态与无状态配置IPv6地址的更多相关文章

  1. http协议和web应用有状态和无状态浅析

    http协议和web应用有状态和无状态浅析 (2013-10-14 10:38:06) 转载▼ 标签: it   我们通常说的web应用程序的无状态性的含义是什么呢? 直观的说,“每次的请求都是独立的 ...

  2. 有状态 Vs 无状态

    NET Core 分布式框架 公司物联网项目集成Orleans以支持高并发的分布式业务,对于Orleans也是第一次接触,本文就分享下个人对Orleans的理解. 这里先抛出自己的观点:Orleans ...

  3. REST有状态与无状态的理解

    1. 什么是REST? REST(REpresentation State Transfer)表述性状态传递,是一种软件架构风格,是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可 ...

  4. SSH深度历险(三) EJB Session Bean有状态和无状态的差别与联系

    刚開始对两种sessionbean存在误解.觉得有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用.而觉得无状态是每次调用实例化一次,不保留用户信息.细致分析并用实践检验后,会发现,事实 ...

  5. SSH深度历险(三) EJB Session Bean有状态和无状态的区别与联系

    刚开始对两种sessionbean存在误解,认为有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用,而认为无状态是每次调用实例化一次,不保留用户信息.仔细分析并用实践检验后,会发现,事实 ...

  6. HTTP 无状态啊无状态啊

    无状态的根本原因 根本原因是:因为,HTTP协议使用的是Socket套接字TCP连接的,每次监听到的套接字连接是不可能一个个保存起来的.(很消耗资源,假如一个人服务器只保存一个通信连接,一万个岂不是要 ...

  7. 线程安全,有状态,无状态的对象<转>

    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.另外 ...

  8. Kubernetes 有状态与无状态介绍

    Kubernetes 有状态与无状态介绍 无状态:deployment - 认为所有pod都是一样的,不具备与其他实例有不同的关系. - 没有顺序的要求. - 不用考虑再哪个Node运行. - 随意扩 ...

  9. JavaEE(8) - 本地和远程调用的有状态以及无状态Session EJB

    1. 使用NetBeans开发Session Bean #1. 创建项目:File-->New Project-->Java EE-->EJB Module #2. 在项目中创建Se ...

随机推荐

  1. 新手学习FFmpeg - 调用API完成录屏并进行H.264编码

    Screen Record H.264 目前在网络传输视频/音频流都一般会采用H.264进行编码,所以尝试调用FFMPEG API完成Mac录屏功能,同时编码为H.264格式. 在上一篇文章中,通过调 ...

  2. NN入门,手把手教你用Numpy手撕NN(2)

    这是一篇包含较少数学推导的NN入门文章 上篇文章中简单介绍了如何手撕一个NN,但其中仍有可以改进的地方,将在这篇文章中进行完善. 误差反向传播 之前的NN计算梯度是利用数值微分法,虽容易实现,但是计算 ...

  3. hdu2222 Keywords Search (AC自动机板子

    https://vjudge.net/problem/HDU-2222 题意:给几个模式串和一个文本串,问文本串中包含几个模式串. 思路:贴个板子不解释. #include<cstdio> ...

  4. go 学习笔记之无心插柳柳成荫的接口和无为而治的空接口

    如果你还了解编程概念中的接口概念,那么我建议你最好还是先阅读上一篇文章.详情请点击 go 学习笔记之万万没想到宠物店竟然催生出面向接口编程? ,否则的话,请自动忽略上文,继续探索 Go 语言的接口有什 ...

  5. java中自定义注解的应用

    要想深刻的理解注解,我们必须能实现自己的注解,然后应用自己的注解去实现特定的业务,使用注解可以更优雅的做到某些事情. 有这样一个场景,在需要文件导出时,我们需要将一个model中的一些重要字段导出到c ...

  6. 【Offer】[35] 【复杂链表的复制】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的he ...

  7. docker容器内 java应用程序启动慢

    原谅我对JVM 不是很熟悉. 参考http://hongjiang.info/tomcat-startup-slowly-in-docker/ 感谢作者.

  8. Loadrunner 11 的安装

    安装包可以直接在我的百度网盘下载,这里用的是LR11的版本.电脑系统是win7 链接: https://pan.baidu.com/s/1OApfUemG3oVjLUE79qaikw 提取码: 7n3 ...

  9. Django与mongodb数据库的连接

    1.最开始需要下载一个第三方模块:mongoengine 2.下载完成之后,需要在settings中完成配置(在DATABASES后面,别问我为什么,问了我也不告诉你...) connect中传入的是 ...

  10. Build a pile of Cubes

    version_1: def find_nb(m): # your code ii = 1 total = 0 while total < m: total = sum(each**3 for ...