Mesh系统介绍。本文主要对Mesh的profile文档进行翻译与解读,促进对mesh主要协议的理解。
1 Mesh系统架构
1.1分层的架构
- Model Layer:定义了用于标准化典型用户场景操作的模型以及蓝牙网络模型规范或其他更高层规范中定义的,比如灯光和传感器这种更高层模型定义。
- Foundation Model Layer:定义用于配置和管理一个mesh网络的状态、消息和模块。(上面这两层见文档《Mesh Model Specification》)
- Access Layer:定义上层应用如何使用Upper Transport Layer,它定义了应用数据的格式;定义和控制应用数据在upper transport layer执行加密和解密,在被传输到上层之前检查进入的应用数据是否在正确的网络和应用密钥的上下文中被接收。
- Upper Transport Layer:加密、解密和认证应用数据并且用于提供进入消息的机密性。该层也定义了传输控制消息如何管理节点间的上层传输层,包括被朋友特性使用时。
- Lower Transport Layer:定义Upper Transport Layer层消息如何被分割重组到多个Lower Transport PDUs以传输大的Upper Transport层消息给其他节点。它还定义了单一控制消息去管理分割和重组。
- Network Layer:定义传输消息如何寻址到一个或多个元素,它定义允许传输PDUs被bearer层传输的网络消息格式。决定是否转发消息,接收或拒绝;定义一个网络消息如何被加密和认证。
- Bearer Layer:定义网络消息如何在节点之间传输。有两种承载被定义,广播承载和GATT承载。
1.2 mesh操作概述
本规范定义的Mesh网络操作旨在:
- 使得消息可以从一个元素传输到一个或多个元素;
- 允许消息通过其他节点中继,以扩大通信范围;
- 针对已知安全攻击的安全消息,包括窃听攻击、中间人攻击、重播攻击、垃圾桶攻击、蛮力密钥攻击,以及此处未记录的其他可能的安全攻击;
- 兼容目前市场上现存的设备;
- 及时传输消息;
- 有个别或多个设备移除或停止操作时,能继续工作;
- 向前兼容性,能兼容未来版本;
这个规范定义了泛洪网络,即使用广播信道传输消息,其他节点可以接收消息或中继消息,从而扩大原始消息的传输范围。任何在泛洪网络中的设备都能在任何时间发送消息,只要网络中监听和中继消息的设备密度足够。未来版本将会加强路由功能,以路由功能为基础的Mesh网络会被考虑进来。
此规范使用了许多方法来限制泛洪网络中消息的无限中继。使用的两种主要方法是网络消息缓存方法和生存时间方法:
- 网络消息缓存的设计目的是通过将所有消息添加到缓存列表来防止设备中继以前接收到的消息。当接收到消息时,将根据列表对其进行检查,如果消息已经存在,则忽略该消息。如果尚未收到,则将其添加到缓存中,以便将来可以忽略它。为了防止这个列表变得太长,缓存的消息数量可以在正式使用时做限制。
- 每个消息都包含一个生命周期(Time to Live, TTL)值,该值限制了消息可以转发的次数。每次设备接收并转发消息(最多126次)时,TTL值减1。
1.2.1 网络和子网络
Mesh网络由共享四种公共资源的节点组成:
- 网络地址用于识别消息的源和目的;
- 网络密钥用于网络层的安全和消息认证;
- 应用秘钥用于access layer的安全和消息认证;
- IV Index用于扩大网络的生存时间。
一个网络可以有一个或多个子网来促进“区域”隔离(例如,在一个酒店网络中隔离酒店房间子网)。子网是一组节点,它们可以在网络层彼此通信,因为它们共享一个网络密钥。通过知道一个或多个网络密钥,一个节点可以属于一个或多个子网。在配置时,设备被配置到一个子网中,并且可以使用配置模型添加到更多子网中。
有一个特殊的子网称为主子网,它基于主网NetKey(见3.8.6.4节)。主子网上的节点参与IV更新过程(参见3.10.5节),并将IV更新传播到其他子网,而其他子网上的节点只将IV索引更新传播到这些子网。
网络资源由实现配置客户机模型(通常是智能手机或其他移动计算设备)的节点管理,并在配置时使用配置服务器模型(参见第5节)分配给节点(参见第4.4.1节)。特别是,管理地址分配,以确保不分配重复的单播地址,然而一个配置客户机生成和分发网络应用秘钥并确保需要相互通信的设备为网络层和访问层共享正确的密钥。配置客户机还知道设备密钥(请参阅第3.8.6.1节),这些密钥用于保护与每个单独节点的通信,包括分发更新的网络和应用程序密钥。
1.2.2 设备和节点
不是Mesh网络中的设备叫做未配置的设备,Mesh网络中的设备称为节点。配置是管理一个未配置设备和节点之间的传输。
一个未配置的设备不能发送和接受Mesh网络中的消息;然而它向可配置的设备广播它自己的存在,此时配置设备可以在授权后将未配置设备加入Mesh网络,使其从未配置设备变成一个节点。
节点能够收发Mesh网络数据,它被配置客户机管理,也有能被当时的配置设备所管理。一个配置客户端可以从Mesh网络中移除节点,将其转换成未配置设备。
设备可以支持一个节点的多个实例,方法是在已经配置到一个Mesh网络之后,再配到到另一个Mesh网络。 Mesh网络的每个实例由地址和设备在配置期间获得的设备密钥确定。
1.2.3 Mesh网络中添加设备
设备通过配置者添加到Mesh网络,这时他们变为节点。配置过程不同于经典蓝牙中的点对点的配对和绑定过程。设备配置可以使用简单的广播,也可以使用基于点对点协议(GATT)。所有设备都实现了基于广播的配置。通过基于GATT的配置,允许使用诸如老版本手机之类的设备(不支持在原生广播配置设备)成为配置设备。
为了帮助配置多个设备,一个设备有一个attention定时器,可以由配置者设置。当设置为非零值时,设备可以使用任何可能的方法来标识自己。例如,该设备可以闪光、发出声音或振动。当attention定时器超时时,设备停止识别标记自己。这允许配置者向设备发送一条消息,使其标识自身,并且设备在给定时间后自动停止标识自己。
运行在这两个承载器上的协议是蓝牙核心规范v4.2的安全管理器协议的派生,该协议引入了对用户界面非常有限的设备(如电灯或开关)进行身份验证的能力。安全管理器协议需要一个可靠的配置方式,这是广播配置无法保证的;因此,本规范中使用的协议旨在支持独立于两种配置方式的可靠消息传递。与安全管理器协议的相似之处在于,可以在实现此类功能的设备上重用现有代码。
1.2.4 通信的支持
许多当前设备无法在不更新的情况下发送广播或理解Mesh消息。为了使这些设备能够与网状网络中的节点通信,而不需要操作系统更新或类似的硬件/软件更新,该规范允许对所有现有设备使用GATT连接。
1.2.5 低功耗的支持
该规范中的特性使Mesh网络中的许多设备能够使用电池一类的技术供电,这些设备作为Mesh网络的一部分,其功能可能受到限制(例如有些设备只需要发送数据)。本规范不要求设备在每次连接时协调传输、建立连接或重新启动安全性,进而便于其低功耗运行。需要低功耗支持的设备可以使用称为“Friendship”的概念,将自己与一个代表它们存储和转发消息的始终在线的设备关联起来(参见第3.6.6节)。然而,转发消息的设备将在大多数时间接收消息和转发消息,并且很可能比典型的小型电池或电容器使用更多的电能。
1.3 架构概述
mesh网络结构使用几个关键概念:状态、消息、绑定、元素、地址、模块、发布-订阅、mesh密钥以及关联。
1.3.1 状态
状态是表示元素状况的值。
一个展示状态的元素称为服务器,例如一个简单的服务器是开关服务,代表它是开或关;
一个访问状态的元素称为客户端,例如一个简单的客户端是开关客户端,它能够通过定义在Generic OnOff模块中的消息控制开关服务。
具有两个或多个值组成的状态称为复合状态,比如一个颜色改变灯可以控制颜色的饱和度和亮度。
1.3.2 绑定状态
当一个状态绑定到另一个状态时,一个状态改变也会导致另一个状态改变。绑定状态可能来自一个或多个元素中的不同模型。例如,一种常见的绑定类型位于level状态和OnOff状态之间:将level更改为0绑定OnOff状态则更改为Off,将level更改为非零值则将绑定OnOff状态更改为On。
1.3.3 消息
Mesh网络中的通信完成都是依赖消息。消息作用于状态。对于每个状态,都有一组定义好的消息,服务器支持这些消息,客户机可以使用这些消息请求状态值或更改状态。服务器还可以发送未经请求的消息,其中包含关于状态和更改状态的信息。
消息定义为具有操作码、相关参数和行为的集合。操作码可以是单个8bit(对于参数需要最大有效负载的特殊消息)、2个8bit(对于标准消息)或3个8bit(对于特定于供应商的消息)。
总消息大小(包括操作码)由底层传输层决定,底层传输层可能使用分段和重新组装(SAR)机制。为了最大限度地提高性能并避免SAR的开销,设计目标是将消息放入单个段中。
传输层提供了一种能够传输多达32段的SAR机制。使用SAR时,最大消息大小为384字节。这意味着(不包括应用程序MIC)使用1个8位字节操作码时最多379位字节可用于参数,使用2个8位字节操作码时最多378位字节可用于参数,使用特定于供应商的3个8位字节操作码时最多377位字节可用于参数。
消息被定义为需要确认或不需要未确认。确认的消息需要响应,而不需要确认的消息不需要响应。
1.3.4 元素
节点中的每一个元素都有一个唯一的地址,称为单播地址。每一个节点都至少有一个元素-主元素,还会有一个或多个secondar元素。元素的数量和结构是静态的,不会在节点的整个生命周期中发生变化。
主元素使用在provisioning期间分配给节点的第一个单播地址来寻址。每一个额外的secondary元素使用后续的地址进行寻址。这些单播地址能够使节点识别出来是哪些元素在收发消息。
如果元素的结构或者数量改变,例如由于固件更新,节点必须被重新配置,当固件升级导致元素的数量和结构变化时必须将节点删除。
消息是基于操作码和元素地址在模型中分发的。
1.3.5 地址
一个地址可以是单播地址、虚拟地址或者是组地址。还有一个特殊值表示未分配的地址,该地址在消息中不使用。
一个单播地址分配给一个元素,它会一直代表节点的这个元素。一个mesh网络中可以支持32767个单播地址。
虚拟地址是一个多播地址,可以表示一个或多个节点上的多个元素。每一个虚拟地址逻辑上代表一个UUID标签,它是一个不需要集中管理的128-bit的值。每一个发送个UUID标签的消息。发送到UUID标签的每个消息在用于验证消息的消息完整性检查值中包含完整的UUID标签。为了减少检查每个已知UUID标签的开销,使用UUID标签UUID的hash。总共有16384个哈希值,每个哈希值编码一组虚拟地址。尽管只有16384个哈希值用于虚拟地址,但每个哈希值可以表示数百万个可能的UUID标签,因此虚拟地址的数量是非常庞大的。
组地址是一个多播地址,可以表示一个或多个节点上的多个元素。一个mesh网络可以有16384个组播地址。有一组固定的组地址,用于根据节点的功能定位节点的所有主要元素的子集,其它的组地址是动态分配的。共有256个固定的组播地址和16128个可动态分配的组地址。
1.3.6 模型
模型定义了节点的基本功能。节点可能包括多个模型,模型定义了需要的状态,消息对状态的影响和其它的相关行为。
Mesh应用程序使用与发布-订阅范式通信的客户机-服务器体系结构。Mesh网络定义了三个模型:服务端模型,客户端模型,控制端模型。
模型可以被SIG定义也可以被SIG采纳,同时模型也可以有厂商自定义。模型由惟一标识符标识,对于SIG采用的模型,它是16位,对于供应商模型,它是32位。
下面的例子中,一个设备包含了两个element,主element中包含了一个model,该model是扩展自附属model的,在附属model的基础上添加了一个新的状态。
由于State_X1与State_X2可以接收相同的消息,因此必须要放在两个element中。
1.3.7 发布-订阅和消息交换
Mesh网络内使用发布-定于机制,节点产生消息并将这些消息发布给单播地址,组地址和虚拟地址。对这些消息感兴趣的节点回来订阅这些地址。
生成的消息被发送到目标Mesh地址,这些地址可以是单播的、预配置的组地址或虚拟地址。消息可以作为对其他消息的响应发送,也可以是未经请求的消息。当模型的实例发送应答消息时,它使用传入消息发起者的源地址作为目标地址。当模型的实例发送非请求消息时,它使用模型发布地址作为目标地址。节点内模型的每个实例都有一个发布地址。
对于接受者,它可以订阅几个地址,当包含自己订阅的地址时,就对消息进行处理。
对于由更高层规范定义的模型,发布地址和订阅列表使用由配置服务器模型管理的模型发布和订阅列表状态。
例如,一个灯可以订阅发送到床边灯组、卧室组、楼上组和house组的消息。
每个消息都从一个单播地址(一个元素地址)发送,并使用一个惟一的序列号进行排序,以方便检测和防止重传攻击。
1.3.8 安全
所有的消息通过两种类型的keys加密和授权。一种keys是为了网络层通信,整个mesh网络中的通信都是通过相同的key。另一种类型的key是给应用数据使用。将网络层和应用程序的密钥分开,可以将敏感的访问消息(例如,对建筑物的访问控制)与非敏感的访问消息(例如,照明)分开。Mesh网络中没有未加密或未经身份验证的消息。
1.3.8.1 应用和网络安全
在上层传输层和网络层对消息进行加密和认证,是为了保护Mesh网络内的通信免受窃听者和恶意攻击。每一层都维护不同的key,以便在应用程序和网络实体之间进行分离。
将应用程序密钥与网络密钥分离可以实现应用程序消息的安全中继传输:中继节点可以在不访问应用程序数据的情况下在网络级别对消息进行身份验证。例如,作为中继节点的灯泡不应该能够打开门。
这意味着节点可以使用来自网络的密钥来中继访问消息,而不需要知道应用程序密钥;因此,它们将无法更改或理解应用程序数据。预计网络密钥将被网络中的许多节点所广泛知道,从而增加中继节点的密度,同时保护不同的应用区域不受彼此影响。这需要为每个应用程序提供单独的key。例如,敏感的门安全应用程序将从不敏感的门铃和照明应用程序中分离出来。
安全模型定义了三种key来确保消息安全,Devkey Appkey NetKey。一个节点可能包含一个DevKey,多个AppKey和多个NetKey。
设备密钥只由配置客户机和单个节点知道。
1.3.9 Friendship
友谊节点主要用于与低功耗节点的消息交互。如果一个节点不能连续的接收数据,可能就会收不到它应该处理的mesh消息,或者收不到安全网络的更新信息,这都可能导致退出网络。
友谊节点是低功耗节点与相邻朋友节点之间的一种特殊关系。这些节点必须位于彼此之间的单跳范围内,并且位于相同的子网中。友谊节点通过低功耗节点进行第一次建立或初始化。友谊节点为低功耗节点存储了一个友谊队列,其中存储了所有需要达到低功耗节点地址的信息。
一个Friend节点能够与多个低功耗节点建立友谊关系,一个低功耗节点确只能与一个Friend节点建立关系。
如下图是一个典型的拓补关系图:
1.3.10 Features
节点的功能是通过节它所支持的feature决定的。所有的节点都能够收到Mesh消息,他们也可以支持如下功能:
- 中继特性:通过广播承载层去接收或者重传消息以扩大整个Mesh网络。
- 代理特性:在GATT承载层和广播承载层之间接收和转发Mesh消息。
- 低功耗特性:只有与支持Friend功能的节点一起,才能在Mesh网络中以显著降低接收方的占空比来降低功耗。
- 朋友特性:通过存储低功耗节点的消息,来支持低功耗特性。
一个节点可能支持这些特性,但也可以禁用这些特性,只有功能启用时才能称为这种功能的节点。