物理层
物理层包含物理无线电与MAC层的接口、无线电开关控制、调制解调、信道选择、链路质量评估和能量检测。Zigbee无线电与Wi-Fi共享2.4 GHz ISM频段,使用16个信道(11-26),每个信道宽2 MHz,信道间载波间隔5 MHz。
MAC层
MAC头中有一个2字节的“帧控制”字段。位0-2表示帧类型,通常有四种帧类型:
- 信标帧,用于扫描网络
- 数据帧,用于传输高层数据
- ACK帧,确认帧
- MAC命令帧,MAC层控制命令,如MAC关联过程
每个MAC帧末尾有两个字节的CRC,用于验证数据包完整性。
网络层
网络层位于MAC层和应用支持子层(APS)之间,负责网络管理。网络层处理网络结构、路由和安全。
设备类型
IEEE-802.15.4定义两种网络设备类型:
- FFD(全功能设备),能执行IEEE 802.15.4标准描述的所有职责,可承担网络中任何角色。
- RFD(精简功能设备,通常电池供电),功能有限。
注意:RFD设备的处理能力和内存大小通常小于FFD设备。
在Zigbee中,有三种物理设备类型:
- 协调器(组建网络,具有路由能力,主电源供电,必须始终保持唤醒状态,可作为父设备)
- 每个网络只能有一个协调器。协调器节点ID始终为0000。
- 路由器(不能组建网络,具有路由能力,主电源供电,必须始终保持唤醒状态,可作为父设备)
- 终端设备(不能组建网络,无路由能力,主电源或电池供电,必须有父设备)
- 终端设备可分为非睡眠终端设备和睡眠终端设备。
网络地址
Zigbee使用PAN ID和扩展PAN ID来标识网络。
PAN ID是一个16位标识符,PAN(个人区域网络)中的所有节点共享。PAN ID由协调器在组建网络时选择,用于区分可能在同一信道上的其他邻近网络。
扩展PAN ID是PAN中所有节点已知的备用网络标识符。正常(短)PAN ID在“空中”传输的数据包中发送,因为发送16位比发送64位更快。扩展PAN ID对每个PAN也是唯一的,由协调器在组建网络时选择。然而,扩展PAN ID很少在空气中传输,更多用作PAN ID冲突发生时的备用标准。使用扩展PAN ID允许协调器与所有节点通信,建立新的PAN ID以解决问题。扩展PAN ID仅在响应“主动扫描”(新节点请求加入网络)和罕见的PAN ID更新时在空气中发送。
设备(节点)地址
与网络地址类似,网络中的每个节点都有一个唯一的短地址和长地址,以区别于网络中的其他节点。
长地址是64位IEEE分配的MAC地址(EUI-64),是一个全局唯一ID(GUID),通常在制造阶段分配。作为全局唯一ID,意味着世界上没有两个IEEE无线电具有相同的GUID。与扩展网络地址的情况类似,长(EUI-64)地址很少在空气中发送,除非是加入(信标)请求和/或解决罕见的节点地址冲突。
短地址(16位)由协调器在节点加入网络时分配,在空气中使用。称为节点ID,此地址对其家庭PAN网络是唯一的。
应用层
ZigBee应用层称为应用框架(AF),运行在应用支持层(APS)之上。AF支持许多应用程序,并在注册的应用程序之间处理传入数据。一些注册的应用程序在Zigbee规范中定义,而其他则是供应商实现。Zigbee将应用程序定义为配置文件。ZigBee配置文件用一个0到240之间的整数标识,称为端点。有两种类型的应用程序配置文件:公共和供应商特定。端点ID为零的特殊配置文件是ZDO(Zigbee设备对象),用于网络配置和设置。
Zigbee联盟定义了一些配置文件,如智能能源、家庭自动化、商业建筑自动化、玩具等。
设备端点与逻辑端点
逻辑端点ID是一个8位值,范围从0到255。
- 端点0保留给Zigbee设备对象(ZDO),用于网络管理目的。
- 端点1到239可供用户应用程序使用。
- 端点240到254保留给特殊应用程序。
- 端点255用于广播。
广播地址
应用程序在AF层注册一个端点标识符。当AF层处理传入消息时,它根据端点标识符传递给适当的集群进行处理。如果数据包到达未注册的端点标识符,则数据包被静默丢弃。
端点是在应用层定义的逻辑扩展,可以视为通过单个ZigBee无线电节点访问的设备。例如,连接到无线电节点的灯开关可能是一个端点(物理),而连接到同一节点的调光器可能是另一个端点(逻辑),而不是一个全新的应用程序(见图1)。在另一个例子中,连接到无线电节点的智能插座条可能是一个端点(物理),而条上连接到同一节点的每个插座可能是其他端点(见图2)。
集群
Zigbee集群基于客户端/服务器模型,用于在两个或多个设备之间实现应用协议。集群是一组命令和属性,定义设备可以做什么(按功能分组的一组操作)。每个集群分配一个集群ID,在Zigbee集群库(ZCL)中定义。一个集群可以用几个属性和命令定义。
ZigBee集群库中的集群是一个对象,包含方法(命令)和数据(属性)。
绑定是ZigBee中的一种操作,定义了两个设备、特定端点和集群ID之间的关系。它提供了一种机制,将一个节点上的端点附加到另一个节点上的一个或多个端点,甚至可以应用于节点组。
安全
Zigbee网络内的安全基于网络密钥和链路密钥。任何两个应用层设备之间的单播通信使用由两个设备共享的128位链路密钥进行保护,而广播通信则由网络中所有设备共享的128位网络密钥保护。通信的预期接收者始终知道确切的安全安排;因此,接收者知道帧是用链路密钥还是网络密钥保护的。
网络密钥
Zigbee网络安全使用全网密钥进行加密和解密。网络密钥是一个128位密钥,由网络中的所有设备共享。通常,它由协调器在网络形成时随机生成。当新设备加入网络时,它们必须获取网络密钥的副本。
信任中心网络
在Zigbee网络中,向新设备分发网络密钥的角色称为信任中心(TC)。有两种安全模型:集中式安全网络和分布式安全网络。
在集中式安全网络中,只有一个信任中心,即协调器。所有新设备将从协调器获取网络密钥。
在分布式安全网络(无协调器设备)中,每个路由器都是一个信任中心。新设备可以从任何路由器获取网络密钥,因为任何路由器都可以授权和认证希望加入的新设备。
注意:使用分布式信任中心网络还是信任中心网络的决定是在网络形成时做出的。网络启动后无法更改此决定。
所有被授权加入网络的设备都拥有密钥的副本,并使用它加密和解密所有网络消息。网络密钥还有一个与之关联的序列号,用于标识密钥的特定实例。偶尔,当网络密钥更新时,序列号会增加,以允许设备识别用于保护数据包数据的网络密钥实例。序列号范围从0到255。当序列号达到255时,它会回绕到0。所有属于安全Zigbee网络的设备都拥有网络密钥的副本。
由于网络密钥需要从一个设备传输到另一个设备,密钥值在传输过程中需要加密。此加密在应用层完成。
网络层安全
数据包安全
在网络层安全的数据包由以下元素组成(见下文)。
辅助安全头
辅助头包含有关数据包安全的数据,接收节点使用这些数据正确验证和解密数据包。这些数据包括使用的密钥类型、序列号(如果是网络密钥)、保护数据的设备的IEEE(长)地址和帧计数器。
认证和加密
Zigbee使用128位对称密钥在网络层加密所有传输。网络和辅助头以明文发送但经过认证,而网络有效负载经过认证和加密。AES-128用于创建消息整个网络部分(安全头和有效负载)的哈希,该哈希附加到消息末尾。
此哈希称为消息完整性代码(MIC),用于通过确保消息未被修改来验证消息。接收设备对消息进行哈希处理,并将计算出的MIC与附加到消息的值进行验证。对消息的更改会使MIC无效,接收节点将静默丢弃消息。注意:Zigbee目前使用4字节MIC。
消息完整性代码(MIC)
AES-CCM*加密过程中使用的随机数(见图3)是一个13八位字节字符串,使用安全控制字段、帧计数器和Zigbee安全头的源地址字段构建。MIC的大小可以是32位、64位或128位(以下示例中为32位)。
以下截图(见图4)显示了我的智能插座#1发送的广播数据包的Zigbee网络层和Zigbee安全头部分:
网络安全帧计数器
帧计数器包含在辅助头中,作为防止重放攻击的一种手段。所有设备都有自己唯一的传出帧计数器,并维护其邻居和子设备帧计数器的列表。每次设备发送数据包时,它都会增加其传出帧计数器。所有正常的网络通信都需要具有网络安全和有效的帧计数器。唯一的例外是在加入期间,设备尚未拥有网络密钥。在这种情况下,加入设备的消息通过其父设备中继,直到完全加入和认证。任何其他没有网络层安全的消息都被静默丢弃。
接收设备验证发送设备的帧计数器是否从上次看到的值增加。如果没有增加,则数据包被静默丢弃。如果接收设备不是最终目的地,则数据包被解密并修改以包括路由设备的帧计数器。然后数据包被重新加密并发送到下一跳(称为逐跳安全)。
帧计数器为32位,可能不会回绕到零。网络密钥可以在帧计数器达到最大值之前更新。当发生时,如果本地设备的值高于0x80000000,帧计数器可以重置为零。
应用支持层(APS)安全
端到端安全
APS安全旨在提供一种在Zigbee网络内安全发送消息的方式,使得除源和目标外没有其他设备可以解密数据。这与网络安全不同,网络安全仅提供逐跳安全。在那种情况下,网络中每个设备都听到发送到其目的地的数据包并解密它。
APS安全使用只有源和目标知道的共享密钥(链路密钥),从而提供端到端安全。APS层和网络层加密可以同时使用来加密消息内容。在那种情况下,首先应用APS层安全,然后应用网络层安全。
在APS层安全的数据包由以下元素组成(见下文):
链路密钥
APS安全使用称为链路密钥的对等密钥。两个设备在发送APS安全数据之前必须已经彼此建立此密钥。有两种类型的链路密钥:信任中心链路密钥和应用程序链路密钥。
信任中心链路密钥
信任中心链路密钥是一种特殊的链路密钥,其中合作伙伴设备之一是信任中心。堆栈使用此密钥发送和接收与信任中心的APS命令消息。应用程序也可以使用此密钥发送APS加密的数据消息。Zigbee网络中的所有设备都必须拥有链路密钥。在信任中心网络中,设备必须拥有信任中心链路密钥。在分布式信任中心网络中,此密钥称为分布式信任中心链路密钥。
应用程序链路密钥
应用程序链路密钥是可以在网络中任何两个节点之间建立的共享密钥,其中两个设备都不是信任中心。它们可用于增加发送到或来自节点上运行的应用程序的消息的额外安全性。设备可以为每个与之通信的设备拥有不同的应用程序链路密钥。
设备可以预配置应用程序链路密钥或请求自身与另一个设备之间的链路密钥。在后一种情况下,它向信任中心发出请求,使用其信任中心链路密钥加密。信任中心充当两个设备的可信第三方,因此它们可以安全地彼此建立通信。
未加密的APS数据
APS层安全独立于网络层安全操作。对于Zigbee堆栈发送到和来自信任中心的某些安全消息(APS命令)是必需的。与网络安全不同,应用程序消息的APS安全是可选的。
安装代码
安装代码密钥只是一个预配置的信任中心链路密钥,用于进入Zigbee网络并获取当前网络密钥。因为此唯一密钥必须在网络进入时对加入设备和信任中心都已知,所以使用称为“安装代码”的可共享数据在双方导出密钥。作为此过程的一部分,安装代码和加入设备的EUI64必须带外传送到网络的信任中心,以允许创建适当的链路密钥表条目。
代码可以是6、8、12或16字节的任意值,后跟这些字节的16位CRC(最低有效字节优先)。然后此代码用作Matyas-Meyer-Oseas(MMO)哈希函数的输入,摘要大小(哈希长度)等于128位。此AES-MMO哈希函数的128位结果用作该设备的预配置信任中心链路密钥的值。信任中心然后可以安装一个具有该密钥和加入设备EUI64的密钥表条目,从而允许在加入期间成功进行认证,并且加入设备可以成功接收和解密网络密钥。
应注意,从Zigbee 3.0开始,所有认证设备都需要有安装代码,但在网络中的使用最终由信任中心决定。
Zigbee数据包嗅探
加入网络
以下Wireshark捕获的数据包将演示新设备如何加入网络的过程。在此示例中,我使用协调器(AduroSmart ERIA智能家居集线器/网关)和路由器设备(Innr Zigbee智能插座)创建了一个Zigbee网络。
关联请求
加入网络的过程始于加入设备在所有信道上发送信标请求命令。基本上,新设备在问:“有人在吗?”在以下帧(5)中,请注意此信标请求的目标是0xffff,我们在本文中较早发现这是对区域中所有节点的广播。
响应信标请求,区域中的所有Zigbee路由器和协调器将响应信标响应。信道上的每个路由器和协调器将宣布:“我在这里!”信标响应帧包含有关响应节点及其所属网络的有用信息。
在以下帧(14)中,我们可以看到网络PAN ID是0x2999,此信标响应的源是0x0000,意味着此设备是Zigbee网络PAN 0x2999的协调器。超帧规范字段也验证了这一点,PAN协调器=真。还要注意关联许可=真,意味着协调器给予加入设备加入(与此网络关联)的许可。
此外,请注意信标的帧控制字段是0x8000,并且在这种情况下堆栈配置文件是0x02(Zigbee Pro)。
既然已授予“加入许可”,下一步是加入设备向协调器发送关联请求。
我们可以在以下帧(18)中看到这一点。帧控制字段的命令标识符是“关联请求”命令(0x01),源(加入设备)现在显示其EUI-64长地址,目标是到协调器0x0000的单播消息。
作为关联请求的一部分,加入设备提供有关自身的信息。关联请求=0x8e表示加入设备(我们的智能插座)是一个全功能设备(FFD),意味着它可以作为路由器运行。电源=交流/主电源表示它不是电池供电,并将始终保持唤醒状态。
顺便说一句,如果我们的加入设备是电池供电设备,它永远不能是路由器(子设备的父设备),而是作为Zigbee终端设备(ZED)运行。在Zigbee网络中,ZED将始终是子设备,并始终逻辑附加到其父设备(路由器或协调器)。
在帧20中,我们看到加入设备向协调器0x0000发出数据请求命令(0x04)。数据请求命令基本上由终端设备(智能插座)用于轮询其父设备(协调器)以接收数据。在这种情况下,加入设备希望确认它现在是网络的一部分(完全加入)。
注意:在捕获此沙盒Zigbee网络上的“加入”过程时,我选择同时运行两个Zigbee嗅探器(带有Wireshark的API-MOTE和带有PACKET-SNIFFER — SmartRF协议数据包嗅探器的德州仪器CC2531)。以下截图显示了刚刚呈现的相同信息,但如德州仪器数据包嗅探器应用程序所示。
数据包15显示加入设备信标请求,数据包16显示协调器的信标响应,关联许可位设置为真。(注意数据包17也被捕获,但来自不同的(邻近)PAN(0x8848),所以我们可以忽略它。)
继续顺序,数据包18显示加入设备(EUI-64长地址)关联请求命令(序列号0xb2)。数据包19是序列(0xb2)的Ack。
数据包20显示加入设备数据请求命令,轮询协调器以获取数据(加入状态确认)。注意加入设备序列计数器增加到0xb3。数据包21是序列0xb3的Ack。
数据包22显示协调器(EUI-64长地址)关联响应,向加入设备(EUI-64长地址)发送请求的数据。在这种情况下,请求的数据是向加入设备分配新节点ID(短地址0x2d24)和关联状态成功。数据包23是关联响应的Ack。
请记住,这仅仅是确认加入设备(0x2d24)已成功加入网络(PAN 0x2999),但设备在获得信任中心的网络密钥之前无法与网络中的任何其他设备通信。在这种情况下,我们可以说新加入的设备已关联,但尚未认证。
注意,序列号每次协调器与加入设备通信以及加入设备与协调器通信时都会增加。此外,请注意每个都有自己唯一的序列号。这与唯一设备帧计数器结合,有助于保护网络免受重放攻击。
认证(获取网络密钥)
在创建我的沙盒Zigbee网络时,我使用手机和AduroSmart ERIA家庭自动化应用程序带外(OOB)认证了智能插座设备。此加入网络的实现使用安装代码(所有智能能源设备和所有运行Zigbee 3.0或更高版本的设备的标准)。
使用安装代码为向设备初始交换网络密钥提供安全性,代价是用户和信任中心之间增加的交互。用户必须以某种方式将密钥从设备传输到信任中心。这可以通过Zigbee网络外(OOB)的机制完成,例如从设备上的标签键入代码到信任中心或扫描相关的QR码。
在制造过程中,安装代码放置在设备的内存中,并打印在设备上的某处(和/或外部包装)。设备内的应用程序将安装代码作为输入提交给Matyas-Meyer-Oseas(MMO)单向压缩函数(https://en.wikipedia.org/wiki/One-way_compression_function),输出128位哈希(预配置链路密钥)。
此安装代码和加入设备的EUI-64(扩展)地址OOB提供给协调器,协调器使用相同的MMO函数。两个端点现在可以产生用于加密和解密消息的预配置链路密钥。预配置链路密钥对新加入的设备和协调器是独占(私有)的。协调