【蓝牙mesh】Network协议层介绍
【蓝牙mesh】Network协议层介绍
Network层简介
上一章节我们讲解了蓝牙Mesh中Lower层的功能和数据格式。 Lower层的数据往下传输就到了网络层(Network Layer)。网络层定义了收到Lower层的数据后,如何对其进行判断、封装、加密、认证,最后通过承载层(Bearer层)将其发送出去。同时它对接收到的承载层的消息报文进行解密并验证,将其传给Lower层或转发给其他节点。
Network层应该说是蓝牙Mesh网络中最重要的一层,消息报文在该层会进行单独的加解密和认证, 只要接收到的承载层的数据包通过了Network的校验,那该数据包就是该蓝牙Mesh网络节点的数据, 至于目的地址是不是自身,消息是否正确,则是更上层的处理。 换句话说,只要不是该蓝牙Mesh网络的数据,在蓝牙Mesh的Network层就会被拦截掉,只要通过了Network层的校验,该数据包就是该蓝牙Mesh网络的数据。
2.2.1 地址
网络层定义了4种基本类型的地址:未分配地址、单播地址、虚拟地址和组播地址。这四种地址的区别,我在之前的博客中都有讲过,这里不多赘述。
下面我们分析Network层的PDU格式
Network层数据包分析
下面介绍下每个字段的含义:
网络层PDU使用从单个网络密钥派生的密钥进行保护,由NID字段标识。
-
表示IV Index的最低有效位,当SEQ耗尽时会触发IV Index的更新,到时候会更新该标志位。
-
NID字段是一个7位网络标识符,该标识符用来方便地查找用于验证和加密此网络层PDU的加密密钥和隐私密钥。NID值是与加密密钥和隐私密钥一起从网络密钥派生出来的。对于主网络消息和朋友及其低功耗节点之间的私有网络消息,它的派生方式有所不同。
-
CTL字段是一个1位的值,用于确定消息是控制消息的一部分还是访问消息的一部分。
如果将CTL字段设置为0,则NetMIC为32位值,底层传输层的PDU包含一条访问消息。
如果将CTL字段设置为1,则NetMIC为64位值,底层传输层的PDU包含一条控制消息。 -
TTL字段表示该数据包还可以被转发几次,每被转发一次,该字段值减一,当TTL为0时,表示数据不可被转发。
-
SEQ字段是一个24位的整数,与IV Index结合使用,对于该节点发起的每个新网络层PDU,该整数应该是唯一的值。
-
SRC字段表示数据包发送方的源地址,是一个16位的值,该地址应为单播地址。SRC字段由发包节点来设置,作为中继节点运行的节点在转发过程中不能修改该字段。
-
DST字段表示数据包接收方的地址,是一个16位的值,该地址应为单播地址、组播地址或虚拟地址。DST字段由发包节点设置,作为中继节点运行的节点在转发过程中不能修改该字段。
-
TransportPDU表示传输协议数据单元,从网络层的角度看,TransportPDU字段是数据的字节序列。当CTL位为0时,TransportPDU字段的最大值为128位。当CTL位为1时,TransportPDU字段的最大值为96位。TransportPDU字段由发包节点的底层传输层设置,网络层不能更改。
-
NetMIC字段表示网络消息完整校验值,是一个32位或64位的字段(取决于CTL位的值),它用于验证DST和TransportPDU是否被更改。当CTL位为0时,NetMIC字段为32位。当CTL位为1时,NetMIC字段为64位。NetMIC由网络层中每个传输节点或中继该网络层PDU的节点设置。
Network层过滤
Network层支持通过多个Bearer层发送和接受消息。一个承载器可能存在多个实例。承载器的每个实例都通过网络接口连接到Network层。
什么意思呢?很简单举个例子: 我们的蓝牙Mesh设备配网后,既可以通过ble广播通道来接收来自其他节点的广播数据,也可以通过GATT连接来接收来自手机APP的数据,这两种数据虽然使用不同的Bearer层,但是最终使用的Network层接口都是一样的。
Network层会对输入和输出的数据进行过滤,当Network层接收到下层的数据包,会将其缓存在Buffer中,当再次接收到相同的数据,就会将其过滤掉,不会再进行处理,这可以减少Network层处理的数据包数量,防止阻塞。
举个例子:比如一个数据包在网络内,被很多节点进行转发,那每个节点都会多次收到该数据包,难道没收到一次network层都会处理一次该数据包吗? 不是的,Network层的过滤功能就是用在过滤这类数据包的。
Network层行为
中继功能
中继功能用于中继节点或转发结点通过广播承载器接受的网络层PDU。此功能是可选的,如果支持此功能,则可以单独启用和禁用此功能。如果支持代理特性,则必须同时支持GATT承载器和广播承载器。
代理功能
代理功能指节点在GATT承载网络和广播承载网络之间中继或转发网络层PDU来实现GATT承载网络和广播承载网络间的消息互通。此功能是可选的,如果支持此功能,可以单独启用和禁用此功能。如果支持代理特性,则同时支持GATT和广播承载。
Network层数据逻辑处理
当Network层接收到来自Bearer层的数据后,数据的处理流程是怎样的呢?
逻辑流程图如下:
下面介绍上述流程:
-
当Network层接收到来自Bearer层的数据后,首先会经过上面说的过滤,如果该数据包是重复包在,则直接过滤掉,否则进入下一步处理。
-
经过过滤后,Network层会检查数据包的NID字段是否匹配,如果NID字段不匹配,则数据包直接丢弃。
-
NID匹配后,就使用Netkey来对数据进行认证,计算消息认证码是否正确,如果消息认证码不匹配则丢弃该数据包。
-
匹配通过后,就认定该数据包就是蓝牙Mesh网络中的数据包,检查如果不再Cache缓存中,则可以将数据包发送到Lower层进行处理了。
-
如果节点启用了中继功能,并且Network层收到来自广播Bearer层的消息的TTL字段大于等于2,并且目标地址不是自身节点的地址,则会将数据包的TTL值减一,并且将数据转发给网络内的其他节点。
总结
Network层是蓝牙Mesh协议栈中中,按照协议栈层级仅次于网络承载层的,是对整个蓝牙MeshMesh网络中非常重要的一个协议层。Network层会使用netkey对数据包进行单独的加解密和认证,为mesh网络的数据安全提供有力的保障。
相关文章:

【蓝牙mesh】Network协议层介绍
【蓝牙mesh】Network协议层介绍 Network层简介 上一章节我们讲解了蓝牙Mesh中Lower层的功能和数据格式。 Lower层的数据往下传输就到了网络层(Network Layer)。网络层定义了收到Lower层的数据后,如何对其进行判断、封装、加密、认证…...

基于遗传算法的配电网故障定位(Matlab代码实现)
👨🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…...

Leetcode.1247 交换字符使得字符串相同
题目链接 Leetcode.1247 交换字符使得字符串相同 Rating : 1597 题目描述 有两个长度相同的字符串 s1和 s2,且它们其中 只含有 字符 "x"和 "y",你需要通过「交换字符」的方式使这两个字符串相同。 每次「交换字符」的时…...

python语音识别whisper
一、背景 最近想提取一些视频的字幕,语音文案,研究了一波 二、whisper语音识别 Whisper 是一种通用的语音识别模型。它在不同音频的大型数据集上进行训练,也是一个多任务模型,可以执行多语言语音识别以及语音翻译和语言识别。 …...

Prometheus -- 浅谈Exporter
Prometheus系统 – Exporter原理 为什么我们需要Exporter? 广义上讲所有可以向Prometheus提供监控样本数据的程序都可以被称为一个Exporter。而Exporter的一个实例称为target,如下所示,Prometheus通过轮询的方式定期从这些target中获取样本…...

如何确定RocketMQ中消费者的线程大小
背景 随着物联网行业的发展、智能设备数量越来越多,随着设备活跃量过大,常常存在一些高并发的请求,形成了流量尖峰,过多的请求会压垮服务器,影响其他服务运行。因此,为了保护云端服务,需要对请求…...

OpenAPI SDK组件之Spring Aop源码拓展
Spring Aop 看这个分享的应该都用过Spring Aop,这里就不再过多介绍了它是什么了。 我抽取了Spring Aop的部分源码,通过它实现请求参数可变拦截,同时apisdk离开Spring框架,仍然可以正常运行。 讲拦截也好,通知也罢&a…...

蓝桥杯C/C++VIP试题每日一练之龟兔赛跑预测
💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客…...

为你的Vue2.x老项目安装Vite发动机吧
天下苦webpack久矣,相信作为前端开发者一定经历过在项目迭代时间较长的时候经历漫长等待的这一过程,每一次保存都会浪费掉大量时间,这是webpack这种机制所带来的问题。 于是,尤大为我们带来了新一代前端构建工具:vite…...

ZCMU--5012: 铺设道路(差分思路)
Description 春春是一名道路工程师,负责铺设一条长度为 n 的道路。 铺设道路的主要工作是填平下陷的地表。 整段道路可以看作是 n 块首尾相连的区域,一开始,第 i 块区域下陷的深度为 di。 春春每天可以选择一段连续区间 [L,R]&…...

算法模板总结(自用)
算法模板总结滑动窗口双指针算法数组相关合并两个有序数组左右指针技巧快慢指针技巧字符串相关左右指针反转字符串问题快慢指针替换空格字符问题链表相关快慢双指针删除链表的倒数第N个节点链表相交环形链表链表操作几数之和两数之和四个数组的四数之和三数之和同一数组中四数之…...

【架构师】零基础到精通——架构发展
博客昵称:架构师Cool 最喜欢的座右铭:一以贯之的努力,不得懈怠的人生。 作者简介:一名Coder,软件设计师/鸿蒙高级工程师认证,在备战高级架构师/系统分析师,欢迎关注小弟! 博主小留言…...

C++(20):三路比较运算符
C20增加了三路比较运算符<>(戏称航天飞机运算符),用于对类的比较运算符进行统一的设计。有两种使用方式:默认比较对于某些类,如果按照其成员逐一比较即可决定比较运算符的值,那么可以使用默认的三路运…...

MySQL workbench 字符集、字符序的概念与联系
在数据的存储上,MySQL提供了不同的字符集支持。而在数据的对比操作上,则提供了不同的字符序支持。 MySQL提供了不同级别的设置,包括server级、database级、table级、column级,可以提供非常精准的设置。 什么是字符集、字符序&am…...

DBA之路---数据库启动与关闭过程
DBA之路—数据库启动与关闭过程 1、启动过程 oracle启动的四个状态 shutdown、就是数据库关闭状态。 nomount模式 #启动instance ,读取参数文件、分配sga空间启动后台进程,打开alter日志和其他trace文件startup nomount #该模式下只会创建实例并不加…...

Shell文件包含
和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。 一、语法格式 Shell 文件包含的语法格式如下: . filename # 注意点号(.)和文件名中间有一空格 或 source filename 在当前bash环境下读取并执行file…...

计算机网络(六): HTTP,HTTPS,DNS,网页解析全过程
文章目录一、HTTP头部包含的信息通用头部请求头部响应头部实体头部二、Keep-Alive和非Keep-Alive的区别三、HTTP的方法四、HTTP和HTTPS建立连接的过程4.1 HTTP4.2 HTTPS五、HTTP和HTTPS的区别六、HTTPS的加密方式七、cookie和sessionsessioncookie八、HTTP状态码状态码200&…...

Android仿京东金融的数值滚动尺功能
自定义数值滚动尺,这个用的还是挺多的,例如京东金融的通过滚动尺选择金额等,而这次就是高仿京东金融的数值滚动尺。首先看看下效果图,如下:首先先给你们各个变量的含义,以免在后面的讲解中不知变量的意思,代码如下://最…...

Nginx 和 Tomcat 实现负载均衡
Nginx 和 tomcat 实现负载均衡 🏆荣誉认证:51CTO博客专家博主、TOP红人、明日之星;阿里云开发者社区专家博主、技术博主、星级博主。 💻微信公众号:微笑的段嘉许 📌本文由微笑的段嘉许原创! &am…...

【万能排序之qsort、b_sort 、s_sort】
文章目录前言:star:qsort函数函数参数qsort函数的使用:star:模拟实现万冒泡排序函数参数模拟实现b_sort注意点:star:模拟实现万能选择排序函数参数模拟实现s_sort最后前言 我们所熟悉的冒泡排序,选择排序,插入排序,二分排序等都是基于给定的一…...

利用InceptionV3实现图像分类
最近在做一个机审的项目,初步希望实现图像的四分类,即:正常(neutral)、涉政(political)、涉黄(porn)、涉恐(terrorism)。有朋友给推荐了个github上…...

【Java】CAS锁
一、什么是CAS机制(compare and swap) 1.概述 CAS的全称为Compare-And-Swap,直译就是对比交换。是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值。经过调查发现,…...

Linux服务器配置系统安全加固方法
1. SSH空闲超时时间建议为: 600-900 解决方案: 在【/etc/ssh/sshd_config】文件中设置【ClientAliveInterval】设置为600到900之间 vim /etc/ssh/sshd_config #将 ClientAliveInterval 参数值设置为 900 2. 修改检查SSH密码修改最小间隔 解决方案: 在【/etc/login.defs】文件…...

Codeforces Round #850 (Div. 2, based on VK Cup 2022 - Final Round)(A~E)
t宝酱紫喜欢出这种分类讨论的题?!A1. Non-alternating Deck (easy version)给出n张牌,按照题目给的顺序分给两人,问最后两人手中各有几张牌。思路:模拟。AC Code:#include <bits/stdc.h>typedef long…...

qt源码--信号槽
本篇主要从Qt信号槽的连接、断开、调用、对象释放等方面展开; 1.信号建立连接过程 connect有多个重载函数,主要是为了方便使用者,比较常用的有2种方式: a. QObject::connect(&timer, &QTimer::timeout, &loop, &am…...

RecycleView详解
listview缓存请看: listview优化和详解RecycleView 和 ListView对比:使用方法上ListView:继承重写 BaseAdapter,自定义 ViewHolder 与 converView优化。RecyclerView: 继承重写 RecyclerView.Adapter 与 RecyclerView.ViewHolder。设置 Layou…...

【算法】最短路算法
😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!Ǵ…...

< Linux > 进程间通信
目录 1、进程间通信介绍 进程间通信的概念 进程间通信的本质 进程间通信的分类 2、管道 2.1、什么是管道 2.2、匿名管道 匿名管道的原理 pipe函数 匿名管道使用步骤 2.3、管道的读写规则 2.4、管道的特点 2.5、命名管道 命名管道的原理 使用命令创建命名管道 mkfifo创建命名管…...

学习 Python 之 Pygame 开发魂斗罗(二)
学习 Python 之 Pygame 开发魂斗罗(二)魂斗罗的需求开始编写魂斗罗1. 搭建主类框架2. 设置游戏运行遍历和创建窗口3. 获取窗口中的事件4. 创建角色5. 完成角色更新函数魂斗罗的需求 魂斗罗游戏中包含很多个物体,现在要对这些物体进行总结 类…...

户籍管理系统测试用例
目录 一、根据页面的不同分别设计测试用例 登录页面 用户信息列表 用户编辑页面 用户更新页面 二、根据目的不同分别设计测试用例 一、根据页面的不同分别设计测试用例 上图是针对一个网站的测试,按照页面的不同分别来设计对应的测试用例。 登录页面 用户信息列…...