一,Mesh中SEQ,IV,RPL的含义

1,SEQ(Sequence Number)

SEQ是包含在网络 PDU 的 SEQ 字段中的 24 位值,主要用于防止重放攻击。同一节点内的元素可能会或可能不会彼此共享SEQ。在每个消息源(由 SRC 字段中包含的单播地址标识)的每个新网络 PDU 中具有不同的序列号对于网状网络的安全性至关重要。

最大值:0xFFFFFF, 24 位序列号,一个元素可以在重复一个随机数之前传输 16,777,216 条消息。如果一个元素平均每 5 秒发送一次消息(对于已知用例来说是一个相当高频率的消息),则该元素可以在随机数重复之前传输 2.6 年。

这里提到几个关键词:5秒发一次seq累加1,可用2.6年!SEQ累加到最大值后就需要对IV做进位处理了,这里就需要提到下一个关键词IV.

2,IV(Initialization Vector)

IV Index 是一个 32 位的值,它是共享网络资源(即,网状网络中的所有节点共享相同的 IV Index 值并将其用于它们所属的所有子网)。

最大值:0xFFFFFFFF, 每次seq加到最大值后,IV进行累加,网络状态按照mesh spec说明最大可应用5万亿年,足够我们使用了。

这里延申一个关键词:IVI(Initialization Vector Index),由于有限的广播信道数据传输(即小于31),SIG制定规范时未将3+4字节信息全部包含在Network PDU中,但是包含了最低IV有效位,这个有效位就叫做IVI。

3,RPL(Relay Protection List)

在描述RPL前,我们需要弄清除什么是重放攻击:有合法的元素发起方发送出去的消息可以被攻击者被动接收,然后在不进行任何修改的情况下重新发出。

RPL本质:1,网络设备列表。2,记录了当前网络周边设备的唯一地址和SEQ。

RPL目的:1,防重放攻击。2,Mesh Relay的基础

RPL限制条件:1,单片机存储资源有限,无法对所有在网设备进行存储。2,以200个存储(大部分原厂可提供200,甚至到100的RPL)方式来计算,每个配网设备按照一个element来计算的话,可以存储200个设备列表。如果按照2个element来计算(如mesh开关,每一个开关为一个element),也就只能存储100个设备了。剩下设备我们就无法做到防重放攻击了。

注:关于存储机制与设计方式,各个厂商有些许不同,在下文具体描述。

二,Mesh Seq与IV更新机制分析

1,更新过程分析:

(1):每发一条信息,seq自加,即seq++;
(2):Seq到达最大值后,需要更新IV,即iv++;
(3):由于网络中只存在一个iv,所以我们要通知其它设备更新iv(即便他们的seq没到最大值),这个更新的过程就叫做IV Update。
(4):通过SNB(Secure Network Beacon)的消息来实现IV Update。

2,IV Update存在如下场景:

(1):IV Update过程中正常更新
(2):设备突发断电或进入低功耗模式无法收发数据,触发IV Recovery

3,IV Update如何实现

传输IV Update的数据格式:

(1):基本描述(参考Mesh Spec 3.10.5 IV Update procedure)
IV 索引为应用层和网络层中用于认证加密 (AES-CCM) 的随机数提供熵。 因此,必须经常更改它以避免在nonce中重复使用sequence numbers。 IV 更新过程由作为主子网成员的任何节点启动。 当节点认为它有耗尽其序列号的风险时,或者它确定另一个节点即将耗尽其序列号(sequence numbers)时,可以这样做。 节点更改其 IV 索引并向网络中的其他节点发送 IV 索引正在更新的指示。 然后,网络中的相同或某个其他节点会更改回正常操作。

在密钥索引不同于 0x000 的连接子网上,至少一个安全网络信标状态设置为 1 的节点也必须位于主子网上。
IV 更新程序定义了两种操作状态:

Normal Operation: IV Update Flag = 0
IV Update in Progress:IV Update Flag = 1

在正常操作状态期间,安全网络信标和朋友更新消息中的 IV 更新标志应设置为 0。
当此状态处于活动状态时,节点应使用当前 IV Index进行传输,并应处理来自当前 IV Index 以及当前的 IV Index - 1的消息。
例如, IV Update Flag 设置为 0, current IV Index 等于 0x00101847 时,这个节点发送消息的 IV Index为0x00101847,接收消息的两种情况:

网络层的 IVI 字段设置为 1时,IV Index为0x00101847。
网络层的 IVI 字段设置为 0时,IV Index为 0x00101846 。

(2):任意一端接收到Secure Network Beacon后存在如下场景:
场景一:
如果正常操作中的节点,接收到一个安全网络信标,其 IV Index大于最后一个已知 IV Index + 1 ,它可以启动 IV 索引恢复过程(IV Index Recovery procedure)。

场景二:
如果正常操作中的节点,接收到一个安全网络信标,其 IV Index等于最后一个已知的 IV Index +1 并且 IV 更新标志设置为 0,则该节点根据
根据自上次 IV Update以来的时间
节点错过 IV update Flag设置为 1 安全网络信标的可能性
做出如下三种可能的选择

可能会直接更新其 IV 而不进入 IV Update正在进行状态,
或者它可能会启动 IV 索引恢复过程,
或者它可能会忽略安全网络信标。

(3):关于约定熟成的规定
3.1 节点启动 IV Update过程的频率不得超过每 192 小时一次。

3.2 在正常操作中运行 96 小时后,节点可以通过转换到 IV 更新进行中状态来启动 IV 更新过程。 当节点从正常操作状态转换到 IV 更新进行中状态时,节点上的 IV 索引应增加 1。

3.3 从正常操作状态到 IV 更新进行中状态的转换必须在序列号用完之前至少 96 小时发生。

3.4 处于正常操作状态的节点接收并接受 IV 更新标志设置为 1 的安全网络信标(指示 IV 更新进行中状态)应尽快转换到 IV 更新进行中状态。

3.5 在 IV 更新进行中状态期间,安全网络信标和好友更新消息中的 IV 更新标志应设置为 1。当此状态处于活动状态时,节点应使用当前 IV Index - 1 进行传输,并处理接收消息 从current IV index - 1 以及current IV index。

例如,如果在从 Normal Operation 状态转换到 IV Update in Progress 状态之前 IV Index 为
0x00101847,则转换后 ,IV Update Flag 将为 1,当前 IV Index 将为 0x00101848。节点应使用
IV 索引 0x00101847 进行发送,并接收如下两种情况的消息:

(1)在网络层中的 IVI 字段设置为 1 时,使用 IV 索引 0x00101847 接收消息;

(2)当网络层中的 IVI 字段设置为 0 时,使用 IV 索引 0x00101848 接收消息。

这允许所有处于正常操作状态的节点使用旧的 IV 索引向该节点发送消息,该节点向那些尚未转换的节点发送消息。

3.6 在 IV Update in Progress 状态下运行 96 小时至 144 小时之间时,节点应转换回 IV Normal Operation 状态并且不更改 IV Index。 在转换点,节点应将序列号重置为 0x000000。

例如,当转换回正常操作状态时,IV 更新标志将为 0,当前 IV 索引将为 0x00101848,节点应使用 IV 索引
0x00101848 发送,并接收如下两种情况的消息:

(1)当网络层中的 IVI 字段设置为 1 时,使用 IV 索引 0x00101847 接收的消息

(2)当网络层中的 IVI 字段设置为 0时,使用 IV 索引0x00101848接收的消息。

这允许节点向网络中的所有节点发送消息,无论它们是否也处于正常操作状态或处于 IV 更新进行中状态。 它还允许节点从处于正常操作状态或 IV
更新进行状态的所有节点接收消息。

下表提供了 IV 更新程序的摘要:

IV Index Flag Procedure State Accepted transmitting
n 0 Normal n-1, n n
n+1 1 In Progress n,n+1 n
n+1 0 Normal n,n+1 n+1

3.7 处于 IV 更新进行中状态的节点,接收并接受了 IV 更新标志设置为 0(指示正常操作状态)的安全网络信标,应尽快转换到正常操作状态。

当节点已发送分段访问消息或分段控制消息而未接收到相应的分段确认消息时,节点应将状态更改从进行中的 IV
更新推迟到正常操作,如本程序所定义。当收到适当的段确认消息或达到此消息传递的超时时间时,应执行延迟的状态更改。

注意:此要求是必要的,因为在完成 IV 更新过程后,序列号将重置为 0x000000,并且 SeqAuth 值将无效。

3.8 当一个节点被添加到网络中时,该节点被赋予一个 IV 索引。如果在网络处于正常运行状态时将节点添加到网络,则它应在正常运行状态下运行至少 96 小时。如果在网络处于 IV Update in Progress 状态时将节点添加到网络,则应赋予该节点新的 IV Index 值并在正常操作中运行至少 96 小时。

三,IV Recovery如何实现

一个节点应该支持IV索引恢复过程,因为一个节点长时间远离网络可能会错过IV更新过程,在这种情况下它不能再与其他节点通信。为了恢复 IV 索引,节点必须侦听安全网络信标,其中包含网络 ID 和当前 IV 索引。在接收并成功验证其 IV 索引比当前已知 IV 索引高 1 或更多的主子网的安全网络信标后,节点应根据此安全网络中的值设置其当前 IV 索引及其当前 IV 更新过程状态信标。
注意:在 IV 指数恢复程序更新 IV 指数后,改变 IV 更新程序状态的 96 小时时间限制(如 IV 更新程序中定义)不适用。
鉴于节点每 10 秒集体传输一次安全网络信标,低占空比节点将必须平均侦听 5 秒以在传输和接收网格消息之前恢复当前的 IV 索引。如果 Low Power 节点没有足够的电量来监听 5 秒,那么它必须通过至少每 96 小时轮询一次它的 Friend 节点来保持与当前 IV 索引的最新状态。
节点在 192 小时内不得执行超过一次的 IV 索引恢复。

四,Mesh中Seq,IV,RPL存储机制分析

1,分析前说明
Flash的读写寿命是有限的,频繁写入Seq+IV与RPL肯定会对flash有一定影响,为应对该问题,每个厂商都有去设计一套如何存储seq,iv,rpl的机制。

2,关于rpl存储机制分析
(1),前面说到Mesh RPL记录了当前网络节点的seq+unicast address,seq一直在更新,频繁的更新seq必定不可以频繁的存储,这里就引入步进的方式,我们以zephyr mesh provisioner为例,存储rpl的时间为接收倒数计时600s,如果连续时间内没有更新,我们将根据最新的rpl信息进行存储。
(2),关于新增的节点信息,如果超出阈值,我们将循环保存。

3,关于seq,iv存储机制分析
我们说到设备节点端的seq变更,这里也涉及当前发送端seq+iv的存储。每发送一次数据seq++,还是以zephyr mesh provisioner为例,这里就需要引入步长来说明了,当每递增的seq到达128时,我们进行存储,如果出现重新上电,我们默认自加128减一以应对掉电场景。即:如果mesh网关向已配网设备节点上电后发送一条消息,此时seq = 127 + 1,突然掉电后,下次上电后mesh网关发送的seq值则为127+ 128 - 1= 254,如此往复。

【Mesh】关于Mesh中Seq+IV与RPL分析相关推荐

  1. [Unity]利用Mesh在Unity中绘制扇形图片2

    之前那篇文章后,和同事又就这个问题讨论了一下,发现,其实不需要那么死心眼画n个三角形,因为图片本身除了圆以外的地方都是透明的, 画出来也没事. 这样的话, 其实可以把正方形的图片分成4个三角形,这样的 ...

  2. Unity 利用Mesh在Unity中绘制扇形图片

    直接上脚本,挂空物体上就行: using UnityEngine; using System.Collections; using System.Collections.Generic; [Requi ...

  3. [Unity]利用Mesh在Unity中绘制扇形图片

    背景 最近碰到个功能, 要画一个扇形图案, 如下图: 美术原图: 需求是这个图形跟随角色, 在角色背后, 并且每个角色的扇形角度可能不同. So, NGUI和UGUI很好用的FilledType是用不 ...

  4. Unity Mesh(五) Mesh 立方体Cube贴图以及六个面分别贴不同的图片

    在前面的篇章中已经有了怎么Mesh画一个立方体,当时的立方体是按照逆时针的画的,其它大都都是按照顺时针画的,当时一开始画立方体顺时针没画出来,有些面看不到就调换了下顺序,没特别注意方向问题,然而这一篇 ...

  5. Unity Mesh(七) Mesh给球贴图

    之前在 Unity Mesh(三) Mesh画球 中已经说明了如何画球,现在我们在这个球的基础上贴图. 这里我们有个极坐标和直角坐标的转换,具体我也不是很明白,反正就是拿来用吧,据某位大神讲解,极坐标 ...

  6. Not allowed to access vertices on mesh ‘Combined Mesh (root: scene)

    Not allowed to access vertices on mesh 'Combined Mesh (root: scene)' (isReadable is false; Read/Writ ...

  7. Not allowed to access normals on mesh ‘Combined Mesh (root: scene)‘ (isReadable is false...报错解决方法

      Unity播放时如果出现的"Not allowed to access normals on mesh 'Combined Mesh (root: scene)' (isReadable ...

  8. 风控建模中的IV和WOE

      在风控建模中IV(信息价值)和WOE(证据权重)分别是变量筛选和变量转换中不可缺少的部分.   很多文章已经讨论过这两个变量,本文在吸收前人优秀成果的基础上,希望用通俗易懂的语言让大家快速理解这两 ...

  9. linux命令seq,Linux 中seq 命令的用法

    Linux 中seq 命令的用法 用于产生从某个数到另外一个数之间的所有整数 用法:seq [选项]... 尾数 或:seq [选项]... 首数 尾数 或:seq [选项]... 首数 增量 尾数 ...

  10. mysql 性能分析 命令_MySQL中使用SHOW PROFILE命令分析性能的用法整理

    show profile是由Jeremy Cole捐献给MySQL社区版本的.默认的是关闭的,但是会话级别可以开启这个功能.开启它可以让MySQL收集在执行语句的时候所使用的资源.为了统计报表,把pr ...

最新文章

  1. java对象转为json字符串
  2. anemometer mysql_MySQL慢日志简介及Anemometer工具介绍 | | For DBA
  3. Applese 走迷宫
  4. 关于缓存穿透,缓存击穿,缓存雪崩,热点数据失效问题的解决方案(转)
  5. 玩转SpringBoot 2 之项目启动篇
  6. SELECTION-SCREEN 加按钮
  7. ionic3-ng4学习见闻--(多环境方案)
  8. dynamipsgui 模拟器模块详细介绍
  9. 关于 Android 8.0 gts 的 widevine 类问题 GtsMediaTestCases / GtsExoPlayerTestCases
  10. oracle 客户端怎样配置,oracle 之客户端配置
  11. 周杰伦 jay《青花瓷》mp3 下载/试听/MV/在线播放
  12. 人工智能帮你文字转为Logo | 机器学习
  13. 在加洲,我与我的加洲宝贝儿
  14. pycharm 隐藏或显示文件类型
  15. Linux系统开机无限重启的解决办法
  16. java不属于约束,【单选题】在Java中,以下哪个约束符可以用来定义成员常量()。 A. static B. finally C. abstract D. final...
  17. 关于本号,你想看的都在这里
  18. python运行excel宏_从python运行excel宏
  19. 【常见的优化算法介绍】
  20. (C语言实现)页面置换——先进先出算法(FIFO)

热门文章

  1. ASP.NET网页打印
  2. shopNC注册后无法登陆的问题
  3. 教你设置让电脑每天在指定时间自动关机
  4. 韩波兄的好文:写给过去,现在和未来的自己
  5. 传奇地图时间限制脚本_地图时间限制脚本
  6. LeetCode 水壶问题
  7. 想撩产品小姐姐?你必须学会的这篇产品经理必读文章,如何构建电商产品认知体系?
  8. 拼接大屏数据展示_大屏拼接可视化
  9. 转:著名的100个管理定律点评8 - 竞争决胜的智慧与策略
  10. CoffeeScript 简介