Thread网络
说明
本文档内容参考自 https://openthread.google.cn/guides 是基于这个官方文档内容进行的添加一些个人理解的介绍文档,文档内容仅能作为对thread 网络的一个概念学习和参考。
基本概念
Thread® 是一个为低功耗物联网(IEEE 802.15.4-2006 WPAN)设备设计的通过 6LoWPAN 技术支持 IPv6,是一种基于IP的无线网络协议。Thread 是一个新的网状网络协议,它并不依赖其它的 802.15 网状网络协议(如 ZigBee、Z-Wave 和 Bluetooth LE)。
主要特性
- 易于部署和维护 — 安装、启动和操作相对简单
- 通信安全 — Thread 网络中的设备都必须通过身份验证,并且所有的通信都经过了加密(AES)
- 稳定可靠 — 具有自愈能力的网状网络,无单点故障,并且采用扩频技术以提高抗干扰能力
- 低功耗 — Thread 低功耗设备可以进入休眠并使用电池供电,通常使用一块电池便能工作数年
- 规模可扩展 — Thread 网络的规模可以扩展达数百个设备
- 双向通信服务发现和连接 — Thread提供通信注册服务,设备可以对其是否可用以及是否可提供通信服务进行注册,而客户端可以使用单播查询来查找已注册的服务。
网络架构
角色定位
Thread网络包含以下两种节点角色:
Router
- 为网络设备转发数据包
- 为尝试加入网络的设备提供安全的 commissioning 服务 (即配置属性、设备能力等)
- 始终打开它的收发器(即需要为非低功耗类设备)
End device
- 主要与单个 Router 进行通信
- 不会为其他网络设备转发数据包
- 可以关闭它的收发器来降低功耗
router 与 end device 之间可以看做是父子关系,end device 需要依附到 router上,其中router作为父节点,end device始终是子节点。
thread中可以说只有这两类节点角色,不管是设备以什么方式入网,它在thread中大的节点角色定位只有这两个。
设备类型
设备节点还能细分为不同的设备类型
FTD设备(Full Thread Device)
一个FTD设备绝对不能是一个低功耗设备,他订阅Thread网络中所有的router节点的多播地址(这个点为进行大量设备订阅,因为手上只有两块板只能验证两个router设备是相互订阅的),并且维护IPV6地址映射,FTD设备又能细分为三种类型:
-
Router
-
REED(Router Eligible End Device)— 可以升级为 Router
-
FED(Full End Device)— 无法升级为 Router
FTD设备可以作为router (父节点)也可以作为 end device(子设备)但是只能是一个非低功耗的 子设备,可以从字面意思理解,FTD就是全功能的Thread设备。FED 从出厂就被定义为END device设备,不能升级为父节点,可以思考可能某种用市电供电的设备,只需要做为端节点,但是就是不需要作为router功能,所以被定义为FED
FTD设备的升级和降级
既然是全功能的设备,那么在Thread网络发生变化时设备也就会发生一些适配性的变化,这里就可以顺便提一下Thread里面升级和降级的概念
当待加入设备仅能与某个 REED 通信时, 则该 REED 可以升级成为 Router
相反,当一个 Router 没有子节点时,它可以降级成 End Device
升级成 Router
子设备连接到 Thread 网络后,可以选择成为 Router。在开始 MLE Link Request 过程之前,子设备会向 Leader 发送 Address Solicit 消息,以请求一个 Router ID。如果 Leader 同意该请求,则它将响应一个 Router ID 给子设备,并且子设备会将自身升级为 Router。
然后,MLE Link Request 过程用于与相邻的 Router 建立双向 Router-Router 链路。
- 新 Router 将发送一个多播 Link Request到相邻的 Router。
- Router 使用 Link Accept and Request 消息进行响应。
- 新 Router 使用单播的 Link Accept 响应每个 Router,以建立 Router-Router 链路。
Link Request
Link Request 是从 Router 到 Thread 网络中所有其他 Router 的请求。首次成为 Router 时,设备会发送一个多播 Link Request 到 ff02::2
。稍后,在通过 MLE Advertisement 发现其他 Router 后,设备将发送单播的 Link Request。
Link Request Message Contents | |
---|---|
Version | Thread 协议版本 |
Challenge | 测试 Link Response 的及时性,以防止重放攻击 |
Source Address | 发送者的 RLOC16 |
Leader Data | Router 的 Leader 的相关信息(RLOC, Partition ID, Partition weight) |
Link Accept and Request
Link Accept and Request 是 Link Accept 和 Link Request 消息的组合。Thread 在 MLE Link Request 过程中使用此优化将消息的数量从四减少到三
Link Accept
Link Accept 是对来自相邻 Router 的 Link Request 的单播响应,该响应提供有关自身的信息并接受到相邻 Router 的链路。
Link Accept Message Contents | |
---|---|
Version | Thread 协议版本 |
Response | 测试 Link Response 的及时性,以防止重放攻击 |
Link Frame Counter | 发送者上的 802.15.4 帧计数器 |
MLE Frame Counter | 发送者上的 MLE 帧计数器 |
Source Address | 发送者的 RLOC16 |
Leader Data | Router 的 Leader 的相关信息(RLOC, Partition ID, Partition weight) |
降级成 REED
当 Router 降级成 REED 时,其 Router-Router 链路断开,并且设备开始 MLE Attach(在加入现有网络中有介绍) 过程以建立父子链路。
MTD设备(Minimal Thread Device)
MTD设备不会订阅所有的多播地址,并且它会将它的所有消息发送给它的父节点。MTD设备又可以细分为两种设备类型
- MED(Minimal End Device)— 始终打开自身的收发器,无需从父节点中轮询消息
- SED(Sleepy End Device)— 通常会关闭自身的收发器(睡眠),偶然会打开收发器(唤醒)以从父节点中轮询消息
MTD设备从字面意思理解,即迷你功能的Thread设备,只能作为End device(子设备)使用
一般这种设备类型在设备出厂时就会定义好。
其他的设备类型(router角色)
Thread Leader
Thread Leader 是一个 Router设备,它负责管理 Thread 网络中的 Router。Thread Leader 是动态自选的(提高容错率),它负责汇总和分发全网络的配置信息。
一个Thread 网络中有且仅能有一个leader。
在Thread网络中,第一个加入网络的路由设备作为Leader。假设一个设备创建新网络,它将选择最不繁忙的 Channel 和其他网络未使用的 PAN ID,然后成为 Router 并选举自己为Leader。在每个 Thread 网络分区中总是只有一个 Leader,当Leader设备掉线后,Router设备可以升级为Leader。
Border Router
Border Router 是一种可以在 Thread 网络和其他网络(如 Wi-Fi)之间转发信息的设备。它还为外部连接配置 Thread 网络。
任何Router设备都可以充当 Border Router。
分区
一个 Thread 网络可能由多个分区组成。当一组 Thread 设备不能再与另一组 Thread 设备通信时,会发生这种情况。每个分区在逻辑上均作为独立的 Thread 网络来运行,它们具有各自的 Leader、Router ID 分配和网络数据,同时分区前相同的安全凭证都将被保留下来。
当分区之间可以连通时,它们会自动合并。
限制
单个 Thread 网络所支持的设备类型数量是有限制的。
角色 | 限制 |
---|---|
Leader | 1 |
Router | 32 |
End Device | 511(每个 Router) |
Thread 会尝试将 Router 的数量保持在 16 ~ 23 之间。如果一个 REED 作为 End Device 加入,并且网络中的 Router 数量低于 16,那么它将自动升级为 Router。
设备通讯
Thread通过IPV6地址来进行相互通讯,以下进行一些介绍
一些网络层的概念
Thread网络中的设备都有三个IPV6地址分别为:
- Link-Local — 所有通过单次射频传输可访问的接口
- Mesh-Local — 所有在同一 Thread 网络中可访问的接口
- Global — 所有从 Thread 网络外部可以访问的接口
前两个域与 Thread 网络指定的 Prefix(前缀)相对应。Link-Local 的 Prefix 为 fe80::/16
单播
单个 Thread 设备可以通过多种 IPv6 单播地址来进行标识。每种地址都有不同的功能(基于域和用例)。
在介绍每种类型之前,让我们先了解一个共同的概念,它叫作 RLOC(Routing Locator)。RLOC 根据 Thread 接口在网络拓扑中的位置来对其进行标识。
所有设备都获得一个 Router ID 和一个 Child ID。每个 Router 维护一个包含其所有子节点的表,两个 ID 的组合唯一地标识拓扑中的设备。例如,请参考以下拓扑中高亮的节点,其中 Router(五边形)中的数字是 Router ID,End Device(圆形)中的数字是 Child ID:
简而言之 RLOC16(设备路由定位值)设备加入thread后会有一个RLOC值,这个值是根据设备定位得到的值
每个子节点的 Router ID 对应于它的父节点(Router)。因为 Router 不会是子节点,所以 Router 的 Child ID 始终为 0。这些值对于 Thread 网络中的每个设备都是唯一的,并用于创建 RLOC16(代表 RLOC 的后 16 位)
这个值有两个字节(16位),前0~5共6位表示router ID(父节点id),第7位为保留位,一般置为0,后面9位为child id,router设备child id为0,所以可以根据RLOC值获取到设备的父节点的地址
如果一个设备离开了Thread网络,那么他的子设备会与其他router节点进行连接并且生成新的RLOC16值
单播地址类型
RLOC 只是 Thread 设备可以获得的多种 IPv6 单播地址之一。另一类用于在 Thread 网络分区内标识唯一的 Thread 接口的地址称为 EID(Endpoint Identifier)。EID 与 Thread 网络拓扑无关。
常见的单播类型如下。
Link-Local Address (LLA) | |
---|---|
一种用于标识单次射频传输可访问的 Thread 接口的 EID。 | |
示例 | fe80::54db:881c:3845:57f4 |
IID | 基于 802.15.4 Extended Address |
域 | Link-Local |
详情 | 用于发现邻居、配置链路和交换路由信息非可路由地址总是带 fe80::/16 Prefix |
Mesh-Local EID (ML-EID) | |
---|---|
一种用于标识 Thread 接口的 EID,其与网络拓扑无关。用于访问同一 Thread 分区内的 Thread 接口。也称为 ULA(Unique Local Address)。 | |
示例 | fde5:8dba:82e1:1:416:993c:8399:35ab |
IID | 在 commissioning 完成后随机生成 |
域 | Mesh-Local |
详情 | 不会随拓扑变化而变化应由应用程序使用总是带 fd00::/8 Prefix |
Routing Locator (RLOC) | |
---|---|
根据 Thread 接口在网络拓扑中的位置来对其进行标识。 | |
示例 | fde5:8dba:82e1:1::ff:fe00:1001 |
IID | 0000:00ff:fe00:RLOC16 |
域 | Mesh-Local |
详情 | 在设备连接到网络后生成用于在 Thread 网络中传递 IPv6 数据报随拓扑变化而变化通常不会由应用程序使用 |
Anycast Locator (ALOC) | |
---|---|
用于标识 Thread 网络分区中一个或多个 Thread 接口的位置。如果始发者不知道目的地的 RLOC,则使用 ALOC 进行查找。 | |
示例 | fde5:8dba:82e1:1::ff:fe00:fc01 |
IID | 0000:00ff:fe00:fcXX |
域 | Mesh-Local |
详情 | fcXX = ALOC 目的地址,用于查询对应的 RLOC通常不会由应用程序使用 |
Global Unicast Address (GUA) | |
---|---|
一个EID,用于标识除 Thread 网络外的全局范围内的 Thread 接口。 | |
示例 | 2000::54db:881c:3845:57f4 |
IID | SLAAC — 由设备自身随机分配DHCP — 由 DHCPv6 服务器分配Manual — 由应用层分配 |
域 | Global |
详情 | 一个公开的 IPv6 地址总是带 2000::/3 Prefix |
一般用Mesh-Local EID 地址进行通讯,这里有个思考 其他地址能否从Thread网络外部进行通讯,暂时未进行验证,后续会进行验证得出结果再进行补充,但是既然网关已经做了数据转化和处理的事情,应该是不需要外部直接进行通讯的,否则安全性有些降低了
多播
多播用于一次将信息传达给多个设备。Thread 网络中保留了特定的地址,以提供给不同分组的设备在多播时使用。
IPv6 地址 | 域 | 传递给 |
---|---|---|
ff02::1 | Link-Local | 所有 FTD 和 MED |
ff02::2 | Link-Local | 所有 FTD |
ff03::1 | Mesh-Local | 所有 FTD 和 MED |
ff03::2 | Mesh-Local | 所有 FTD |
Key Point: FTD 和 MTD 之间的主要区别在于 FTD 订阅了 ff03::2
多播地址。而 MTD 没有订阅。
你可能会注意到,上面的多播表中没有将 SED 作为接收者包括在内。Thread 为所有 Thread 节点(包括 SED)定义了(link-local 和 realm-local 域)基于单播 prefix 的 IPv6 多播地址。这些多播地址基于单播 Mesh-Local prefix 构成,因 Thread 网络而异。(有关基于单播 prefix 的 IPv6 多播地址的详情,请参阅 RFC 3306)。
Thread 设备还支持除表中所列举域之外的任意域。
多播这块内容未进行验证,手中能用的thread设备不多,后续有机会再进行验证和补充
任播
当目的地的 RLOC 未知时,可以使用任播将流量路由到 Thread 接口。ALOC(Anycast Locator)标识 Thread 分区内多个接口的位置。ALOC 的后 16 位,称为 ALOC16,其格式为 0xfcXX
,表示 ALOC 的类型。
例如,0xfc01
和 0xfc0f
之间的 ALOC16 保留给了 DHCPv6 Agent。如果特定的 DHCPv6 Agent RLOC 是未知的(可能是因为网络拓扑已更改),则可以将消息发送到 DHCPv6 Agent ALOC 以获取 RLOC。
Thread 定义了以下 ALOC16 值:
ALOC16 | 类型 |
---|---|
0xfc00 | Leader |
0xfc01 – 0xfc0f | DHCPv6 Agent |
0xfc10 – 0xfc2f | Service |
0xfc30 – 0xfc37 | Commissioner |
0xfc40 – 0xfc4e | Neighbor Discovery Agent |
0xfc38 – 0xfc3f 0xfc4f – 0xfcff | Reserved |
网络发现和构建
网络发现
Thread 网络由三个唯一的标识符标识:
- 2 字节的 PAN ID(Personal Area Network ID,个域网标识符)
- 8 字节的 XPAN ID(Extended Personal Area Network ID,扩展个域网标识符)
- 方便人类阅读的 Network Name(网络名称)
例如,一个 Thread 网络可能具有以下标识符:
标识符 | 值 |
---|---|
PAN ID | 0xBEEF |
XPAN ID | 0xBEEF1111CAFE2222 |
Network Name | yourThreadCafe |
在创建新的 Thread 网络或搜索现有的网络时,Thread 设备会主动扫描射频范围内的 802.15.4 网络:
- 设备在特定 Channel 上广播 802.15.4 信标请求(Beacon Request)。
- 范围内的所有 Router 或 REED 都会广播包含其 Thread 网络 PAN ID、XPAN ID 和 Network Name 的信标(Beacon),以作为回应。
- 设备为每个 Channel 重复前两个步骤。
Thread 设备发现范围内的所有网络后,可以选择连接到现有的网络,也可以在未发现任何网络的情况下创建新的网络。
补充:Thread信道据说与zigbee一致,但是未找到可靠文档说明,目前zigbee信道为11~26
网络构建
Thread 使用 MLE(Mesh Link Establishment)协议来配置链路并将网络的相关信息传播到 Thread 设备。
在链路配置中,MLE 用于:
- 发现相邻设备的链路
- 确认到相邻设备的链路质量
- 建立到相邻设备的链路
- 与对端协商链路参数(设备类型、帧计数器、超时)
MLE 将以下类型的信息传播给希望建立链路的设备:
- Leader data(Leader RLOC, Partition ID(分区标识符), Partition weight(分区权重))
- Network data(on-mesh prefixes, address autoconfiguration(地址自动配置), more-specific routes(具体路由))
- Route propagation(路由传播)
Thread 中路由传播的工作原理类似于 RIP(Routing Information Protocol,路由信息协议),RIP 是一种距离矢量路由协议。
仅当 Thread 设备通过 Thread Commissioning 获得 Thread 网络凭据后,才会继续进行 MLE 过程。Commissioning 和安全性将在本教程的后续部分中深入介绍。目前,假定设备已通过 Commissioning
创建新网络
如果设备选择创建新网络,它将选择最不繁忙的 Channel 和其他网络未使用的 PAN ID,然后成为 Router 并选举自己为 Leader。该设备将 MLE Advertisement 消息发送到其他 802.15.4 设备,以通知其链路状态,并响应其他执行主动扫描的 Thread 设备所发出的信标请求。
加入现有网络
如果设备选择加入到现有的网络,则会通过 Thread Commissioning 将其 Channel、PAN ID、XPAN ID 和 Network Name 配置为与目标网络相同,然后进行 MLE Attach 过程以作为子节点(End Device)进行加入。此过程用于“父子链路(Child-Parent link)”。
每个设备(无论是否具有充当 Router 的能力),最初都作为子设备(End Device)连接到 Thread 网络。
注意这句话很容易绕晕,end device 其实也可能是router的角色,而router也是可以作为子设备的,然后再看网络中router角色多不多,再决定是否升级。所以并不是说作为子设备就不能升级为父节点了,如果是MTD设备,那就是纯粹的子设备了
通讯过程
- 子节点向目标网络中的所有相邻的 Router 和 REED 发送多播 Parent Request。
Parent Request Message Contents | |
---|---|
Mode | 描述待连接设备 |
Challenge | 测试 Parent Response 的时效性,以防止重放攻击 |
Scan Mask | 将请求限制为仅 Router 或 Router 和 REED |
- 所有相邻的 Router 和 REED(如果 Parent Request Scan Mask(父节点请求扫描掩码)包括了 REED)都应发送Parent Response 以将其自身的信息告诉给子节点。
Parent Response Message Contents | |
---|---|
Version | Thread 协议版本 |
Response | Parent Request Challenge 的副本 |
Link Frame Counter | Router/REED 上的 802.15.4 帧计数器 |
MLE Frame Counter | Router/REED 上的 MLE 帧计数器 |
Source Address | Router/REED 的 RLOC16 |
Link Margin | Router/REED 的接收信号质量 |
Connectivity | 描述 Router/REED 的连通性 |
Leader Data | 有关 Router/REED 的 Leader 的信息 |
Challenge | 测试 Child ID Request 的时效性,以防止重放攻击 |
- 子节点选择一个父节点,并向其发送 Child ID Request。
Child ID Request Message Contents | |
---|---|
Version | Thread 协议版本 |
Response | Parent Response Challenge 的副本 |
Link Frame Counter | Child 上的 802.15.4 帧计数器 |
MLE Frame Counter | Child 上的 MLE 帧计数器 |
Mode | 描述子节点 |
Timeout | 父节点移除子节点之前的闲置时间 |
Address Registration (MEDs and SEDs only) | 注册 IPv6 地址 |
-
父节点发送 Child ID Response 以确认链路建立。
Child ID Response Message Contents Source Address 父节点的 RLOC16 Address16 子节点的 RLOC16 Leader Data 父节点的 Leader 的相关信息(RLOC, Partition ID, Partition weight) Network Data Thread 网络的相关信息(on-mesh prefixes, address autoconfiguration, more-specific routes) Route (REED only) 路由传播 Timeout 父节点移除子节点之前的闲置时间 Address Registration (MEDs and SEDs only) 确认已注册地址
CDS(连接支配集)
Router 必须形成一个 CDS(Connected Dominating Set),这意味着
- 在任何两个 Router 之间都有一个 Router-only 的路径。
- Thread 网络中的任何一个 Router 都可以通过完全位于 Router 集中而到达其他任何 Router。
- Thread 网络中的每个 End Device 都直接连接到 Router。
Thread 在下列情况下将会增添 Router:
- 如果网络低于 Router 阈值(16) —— 为了增加覆盖范围
- 增加路径多样性
- 保持最低程度的冗余
- 扩展连接并支持更多子节点
Thread 在下列情况下将会移除 Router:
- 将路由状态减少到最多 32 个 Router 以下
- 必要时允许在网络的其他部分使用新 Router
单向接收链路
在某些情况下,建立单向接收链路是有必要的。
在 Router 重置后,相邻 Router 可能仍具有与重置的 Router 的有效接收链路。在这种情况下,重置的 Router 发送 Link Request 消息以重新建立 Router-Router 链路。
End Device 也可能希望与相邻的 Router(非父节点)建立接收链路,以提高多播可靠性。
中而到达其他任何 Router。
3. Thread 网络中的每个 End Device 都直接连接到 Router。
Thread 在下列情况下将会增添 Router:
- 如果网络低于 Router 阈值(16) —— 为了增加覆盖范围
- 增加路径多样性
- 保持最低程度的冗余
- 扩展连接并支持更多子节点
Thread 在下列情况下将会移除 Router:
- 将路由状态减少到最多 32 个 Router 以下
- 必要时允许在网络的其他部分使用新 Router
单向接收链路
在某些情况下,建立单向接收链路是有必要的。
在 Router 重置后,相邻 Router 可能仍具有与重置的 Router 的有效接收链路。在这种情况下,重置的 Router 发送 Link Request 消息以重新建立 Router-Router 链路。
End Device 也可能希望与相邻的 Router(非父节点)建立接收链路,以提高多播可靠性。