一文带你学懂 Thread

Matter 2023-10-25 3507 次浏览 次点赞


Thread 开发文档

提示:本文翻译自 Google OpenThread 开发文档,建议大家直接阅读原文,Thread Primter

I. 什么是 Thread

Thread Logo

Thread® 是一种基于 IPv6 的网络协议,专为低功耗、Mesh 组网的 IoT 设备设计,基于 IEEE 802.15.4-2006 的无线 Mesh 网络,通常称为无线个域网(WPAN)。Thread 与其他 802.15 Mesh 网络协议(如 ZigBee、Z-Wave 和蓝牙低功耗)相似,但是独立无关。

Thread 的主要特点包括:

  • 简便性

    安装、启动和操作简单;

  • 安全性

    Thread 网络中的所有设备都经过身份认证,所有通信都经过加密;

  • 可靠性

    自愈合的 Mesh 网络,没有单点故障,并采用扩频技术以提高抗干扰性;

  • 高效性

    低功耗的 Thread 设备可以休眠并以电池供电运行多年;

  • 可扩展性

    Thread 网络可以扩展到数百台设备。

查看完整的规范,点击 Thread 协议规范下载。

II. 节点角色和类型

转发角色

在 Thread 网络中,按照节点是否参与参与消息转发被区分为两种转发角色:

OT 节点角色

Router

Router 是一个节点,具有以下功能:

  • 为网络设备转发数据包;
  • 为试图加入网络的设备提供安全的 Commissioning 服务;
  • 始终保持其 RF 收发器开启。

End Device

End Device (ED) 是一个节点,具有以下功能:

  • 主要与单个 Router 通信;
  • 不会为其他网络设备转发数据包;
  • 可以关闭其 RF 收发器以减少功耗。
关键点: Router 和 End Device 之间的关系是父子关系。End Device 连接到一个 Router 。 Router 始终是父设备, End Device 是子设备。

设备类型

此外,节点还可以按照设备类型区分。

OT 设备分类

提示:从这里开始,你需要尝试记住如上设备类型的颜色和形状,用以以下拓扑的设备类型区分。

Full Thread Device

Full Thread Device (FTD) 始终保持其无线电开启,订阅所有 Router 的组播地址,并维护 IPv6 地址映射。有三种类型的 FTD:

  • Router
  • REED

    Router Eligible End Device ,Router 备用 End Device,可以升级为 Router;

  • FED

    Full End Device,完整 End Device,不能升级为 Router。

FTD 可以作为 Router (父设备) 或 End Device (子设备) 运行。

Minimal Thread Device

Minimal Thread Device 不订阅所有 Router 的组播地址,并将所有消息转发到其父设备。有两种类型的 MTD:

  • MED

    Minimal End Device ,极简 End Device (MED) ,RF 收发器始终打开,不需要轮询来自其父设备的消息;

  • SED

    Sleepy End Device,休眠 End Device (SED) — 通常长时间休眠,偶尔唤醒以轮询来自其父设备的消息。

MTD 只能作为 End Device (子设备) 运行。

升级和降级

当 REED 作为一个新加入 Thread 网络 End Device 的唯一可达节点时,它可以升级为 Router 同时并且作为其父设备运行:

OT  End Device 升级为 Router

相反,当 Router 没有了子设备,它可以降级自己并作为 End Device 运行:

OT  Router 降级为 End Device

其他角色和类型

Thread Leader

Thread Leader 是负责管理 Thread 网络中的其他 Router 集合的 Router 。它动态自我选举以实现容错性,并汇总和分发网络范围的配置信息。

注意:每个 Thread 网络 分区 中始终存在有且只有一个的 Leader 。

OT  Leader 和 Border Router

Border Router

Border Router 是一种特殊设备类型,可以在 Thread 网络和非 Thread 网络 (例如 Wi-Fi) 之间转发信息。它还配置 Thread 网络以进行外部连接和访问。

提示:Border Router 可以类比家庭无线路由器,它实现了不同MAC 的 WiFi 和有线以太网的 IP 报文转发。

任何设备都可以充当 Border Router 。

注意:在 Thread 网络中可以存在多个 Border Router 。

分区

OT 分区

Thread 网络可能由分区组成。这发生在一组 Thread 设备不再能够与另一组 Thread 设备进行通信时。每个分区在逻辑上被视为一个独立的 Thread 网络,具有自己的 Leader 、 Router ID 分配和网络数据,同时保留所有分区中所有设备的相同安全凭据。

Thread 网络中的分区之间没有无线连接,如果分区恢复了连接,它们将自动合并为一个单一分区。

关键点:安全凭据定义了 Thread 网络。物理无线连接定义了 Thread 网络内的分区。

请注意,本文中对 "Thread 网络" 的使用假定存在单个分区。如有必要,关键概念和示例将使用术语 "分区" 加以澄清。关于分区的更深入内容将在本文后面介绍。

设备限制

单个 Thread 网络存在限制数量的设备类型。

角色限制
Leader1
Router32
End Device每个 Router 511

Thread 尝试保持 Router 的数量在 16 到 23 之间。如果 REED 当前为 End Device ,且网络中的 Router 数量低于 16,则它将自动升级为 Router 。

总结

如下总结:

  • Thread 设备要么是 Router (父设备),要么是 End Device (子设备);
  • Thread 设备要么是 Full Thread Device (维护 IPv6 地址映射),要么是 Minimal Thread Device (将所有消息转发到其父设备);
  • REED 可以升级为 Router ,反之亦然;
  • 每个 Thread 网络分区都有一个 Leader 来管理 Router ;
  • Border Router 用于连接 Thread 和非 Thread 网络;
  • Thread 网络可能由多个分区组成。

III. IPv6 地址分配

让我们来看看 Thread 如何寻址网络中的每个设备,以及它们用于相互通信的不同地址类型。

关键术语: 在本文中,术语 "接口" 用于标识网络内 Thread 设备的一个端点。通常地,单个 Thread 设备具有一个 Thread 接口。

范围

OT 范围

在 Thread 网络中,有三种单播寻址范围:

  • Link Local

    本地链路 ,所有可通过单个无线电传输到达的接口;

  • Mesh Local

    Mesh 本地,所有可在同一 Thread 网络内到达的接口;

  • Global

    所有可从 Thread 网络外部到达的接口。

前两个范围对应于 Thread 网络指定的前缀。Link Local 具有 fe80::/16 的前缀,而 Mesh Local 具有 fd00::/8 的前缀。

单播 RLOC 地址

一个 Thread 设备存在多个不同 IPv6 地址。每个地址根据范围和用例具有不同的功能。如我们所知,对于 IPv4 地址,可以通过 DHCP 获取,对于 IPv6 地址应该如何生成或者分配呢?

这里详细介绍一个地址类型及其分配方法,称为路由定位器(Routing Locator,RLOC)。RLOC 根据网络拓扑中的位置标识 Thread 接口。

如何生成 RLOC 地址

网络中所有设备都分配了 Router ID 和子设备 ID。每个 Router 维护其所有子设备的列表,组合这两个 ID 将唯一标识网络拓扑中的设备。例如,如下拓扑中的高亮显示节点,其中 Router (五边形)中的数字是 Router ID, End Device (圆形)中的数字是子设备 ID。

OT RLOC 拓扑

每个子设备的 Router ID 对应于其父设备( Router )。父设备(Router) 的子设备 ID 始终为 0。这些值一起对于 Thread 网络中的每个设备都是唯一的,用于创建 RLOC16,代表 RLOC 的最后 16 位。

例如,以下是为左上角的节点( Router ID = 1 和子设备 ID = 1)计算的 RLOC16:

OT RLOC16

RLOC16 又组成了接口标识符(IID)的一部分,IID 对应 IPv6 地址的最后 64 位。某些 IID 可用于标识某些类型的 Thread 接口。例如,RLOC 的 IID 始终具有以下形式:

0000:00ff:fe00:RLOC16

将 IID 与 Mesh Local 前缀结合使用,结果即为 RLOC。例如,使用 Mesh Local 前缀 fde5:8dba:82e1:1::/64,其中 RLOC16 = 0x401 的节点的 RLOC 如下所示:

OT RLOC

当此方法作用上述示例拓扑中所有高亮显示节点后的 RLOC 地址:

OT 包含地址的拓扑图

但是,由于 RLOC 是基于节点在拓扑中的位置生成的,因此节点的 RLOC 可能会随着拓扑的变化而更改。

例如,如果父节点 0x400 从 Thread 网络中删除。子节点 0x4010x402 建立到不同 Router 的新链接,因此它们都被分配了新的 RLOC16 和 RLOC:

OT 更改后的拓扑

单播地址类型

RLOC 只是 Thread 设备可以具有的多个 IPv6 单播地址中的一种。另一类地址称为端点标识符(EID),用于标识 Thread 网络分区内 Thread 设备的唯一接口。EID 与 Thread 网络拓扑无关。

下面详细介绍其他的单播类型。

Link Local 地址(LLA)

用于标识可通过单个无线电传输可到达的 Thread 接口的 EID。

示例fe80::54db:881c:3845:57f4
IID基于 802.15.4 扩展地址
范围Link Local
详细信息用于发现邻居、配置链接和交换路由信息,不参与路由转发的,始终具有前缀 fe80::/16

Mesh Local EID 地址(ML-EID)

用于标识 Thread 接口的 EID,与网络拓扑无关。用于在同一 Thread 分区内到达 Thread 接口。对应 IPv6 地址规范的唯一本地地址(ULA)。

示例fde5:8dba:82e1:1:416:993c:8399:35ab
IID随机选择,完成 Commissioning 后选择。
范围Mesh Local
详细信息随着拓扑的变化不会更改,应该由应用程序使用,始终具有前缀 fd00::/8

Routing Locator 地址(RLOC)

根据其在网络拓扑中的位置标识 Thread 接口。

示例fde5:8dba:82e1:1::ff:fe00:1001
IID0000:00ff:fe00:RLOC16
范围Mesh Local
详细信息一旦设备连接到网络就生成,用于在 Thread 网络内传递 IPv6 数据包。但是随着拓扑的变化而更改,通常不被应用程序使用

Anycast Locator 任意地址 (ALOC)

在不知道目的设备的 RLOC 时,通过 RLOC 查找标识 Thread 接口。

示例fde5:8dba:82e1:1::ff:fe00:fc01
IID0000:00ff:fe00:fcXX
范围Mesh Local
详细信息fcXX = ALOC 目的地,可查找适当的 RLOC通常不被应用程序使用

Global 单播地址(GUA)

用于标识 Thread 接口的全局范围 EID,超出 Thread 网络。

示例2000::54db:881c:3845:57f4
IIDSLAAC — 设备自己随机分配DHCP — 由 DHCPv6 服务器分配手动 — 由应用层分配
范围Global
详细信息公共 IPv6 地址始终具有前缀 2000::/3

组播

组播用于一次向多个设备传递信息。在 Thread 网络中,针对不同设备组的组播使用保留了特定地址,具体取决于范围。

IPv6 地址范围传递给
ff02::1Link Local所有 FTD 和 MED
ff02::2Link Local所有 FTD
ff03::1Mesh Local所有 FTD 和 MED
ff03::2Mesh Local所有 FTD

关键点: FTD 和 MTD 之间的一个重要区别是 FTD 订阅 ff03::2 组播地址。MTD 不订阅。

你可能会注意到休眠终端设备 Sleepy End Device (SED)未包括在上述组播表中。取而代之的是,Thread 为所有 Thread 节点,包括 SED,定义了基于 Link Local 和 Realm Local 范围单播前缀的 IPv6 组播地址。这些组播地址因 Thread 网络不同而异,因为它是建立在单播 Mesh Local 前缀上的(详细信息请参阅RFC 3306)。

Thread 设备还支持超出上述范围的任意范围。

任播

任播用于在不知道目的地的 RLOC 时将流量路由到 Thread 接口。任播定位器(ALOC)标识 Thread 分区内多个接口的位置。ALOC16 的最后 16 位,称为 ALOC16,采用 0xfcXX 格式,表示 ALOC 的类型。

例如,0xfc010xfc0f 之间的 ALOC16 保留用于 DHCPv6 代理。如果不知道特定的 DHCPv6 代理 RLOC(也许是因为网络拓扑已更改),可以发送消息到 DHCPv6 代理 ALOC 以获取 RLOC。

Thread 定义以下 ALOC16 值:

ALOC16类型
0xfc00Leader
0xfc010xfc0fDHCPv6 代理
0xfc100xfc2f服务
0xfc300xfc37Commissioning
0xfc400xfc4e邻居发现代理
0xfc380fc3f
0xfc4f0xfcff
保留

总结

如下总结:

  • Thread 网络由 Link Local 、 Mesh Local 和 Global 三种范围组成;
  • Thread 设备具有多个单播 IPv6 地址;

    • RLOC 代表 Thread 网络中设备的位置;
    • ML-EID 是分区内 Thread 设备的唯一标识,应该由应用程序使用。
  • Thread 使用组播来将数据转发到节点和 Router 组中;
  • Thread 在目的地的 RLOC 未知时使用任播。

要了解有关 Thread 的 IPv6 地址分配的更多信息,请参阅Thread 规范的第 5.2 和 5.3 节。

IV. 网络发现与组建

Thread 网络

Thread 网络由三个唯一标识符组成:

  • 2 字节的个域网 ID(PAN ID);
  • 8 字节的扩展个域网 ID(XPAN ID);
  • 一个方便人可读的网络名称。

例如,Thread 网络可能具有以下标识符:

标识符
PAN ID0xBEEF
XPAN ID0xBEEF1111CAFE2222
Network NameyourThreadCafe

OT 主动扫描

创建新的 Thread 网络或搜索要加入的现有网络时,Thread 设备会执行主动扫描以查找无线电范围内的 802.15.4 网络:

  1. 设备会在特定信道上广播 802.15.4 Beacon request。
  2. 作为回应,范围内的任何 Router 或 REEDs 都会广播回复一个包含它们的 Thread 网络 PAN ID、XPAN ID 和网络名称的 Beacon。
  3. 该设备会在每个信道(11-26)重复前两个步骤。

一旦 Thread 设备扫描了范围内的所有网络,它可以选择连接到现有网络或创建一个新网络。

Thread 使用 Mesh Link Establishment(MLE)协议来配置链接并向 Thread 设备传输有关网络的信息。

在链接配置中,MLE 用于:

  • 发现与邻近设备的链接;
  • 确定到邻近设备的链接质量;
  • 与邻近设备建立链接;
  • 与对等设备协商链接参数(设备类型、帧计数器、超时)。

MLE 向希望建立链接的设备传播以下类型的信息:

  • Leader 数据(Leader RLOC、分区 ID、分区权重);
  • 网络数据(Mesh 前缀、地址自动配置、更具体的路由);
  • 路由传播(Route propagation)。

Thread 中的路由传播类似于路由信息协议(RIP),这是一种距离矢量路由协议。

注意 :仅当 Thread 设备通过 Thread Commissioning 获得 Thread 网络凭证时,MLE 才会继续进行。 Thread Commissioning 和安全性将在本入门指南的后续部分进行深入讨论。这里假定设备已经通过 Commissioning 进行了配置。

创建新网络

如果设备选择创建新网络,它会选择最为空闲的信道并且尚未被其他网络使用的 PAN ID,然后成为一个 Router 并自行选举为 Leader。这个设备会向其他 802.15.4 设备发送 MLE Advertisement 消息,以通知它们其链接状态,并回复正在执行主动扫描的其他 Thread 设备的 Beacon 请求。

加入现有网络

如果设备选择加入现有网络,它会通过 Thread Commissioning 将其信道、PAN ID、XPAN ID 和网络名称配置为与目标网络相匹配,然后通过 MLE 附加流程以 Child( End Device )的身份连接。这个过程用于 Child-Parent 链接。

关键点: 初始阶段,每个设备,无论是否支持路由功能,都会作为 Child( End Device )连接到 Thread 网络。
  1. Child 发送组播 Parent 请求,发送给目标网络中所有附近的 Router 和 REED。
  2. 所有附近的 Router 和 REED(如果 Parent 请求扫描掩码包括 REED)都会发送 Parent 回复,提供关于自己的信息。
  3. Child 选择一个 Parent 设备并发送 Child ID 请求
  4. Parent 发送 Child ID 回复以确认链接建立。
提示:如果你熟悉 ZigBee,这里建立网络和设备关联加入都是 MAC 层完成,然后再到网络层,与之不同的是 Thread 是在 MLE 应用层完成。

1. Parent 请求

Parent 请求是连接设备的组播请求,用于发现目标网络中的邻近 Router 和 Router 和 REEDs。

OT MLE 附加 Parent 请求

Parent 请求消息内容

描述
Mode描述连接设备
Challenge用于测试 Parent 回复的时效性,以防止重放攻击
Scan Mask限制请求仅适用于 Router 或两者兼有的 Router 和 REEDs

2. Parent 回复

Parent 回复是对 Parent 请求的单播回复,为连接设备提供有关 Router 或 REED 的信息。

OT MLE 附加 Parent 回复

Parent 回复消息内容

描述
VersionThread 协议版本
ResponseParent 请求挑战的副本
Link Frame CounterRouter /REED 上的 802.15.4 帧计数器
MLE Frame CounterRouter /REED 上的 MLE 帧计数器
Source AddressRouter /REED 的 RLOC16
Link MarginRouter /REED 的接收信号质量
Connectivity描述 Router /REED 的连接级别
Leader Data关于 Router /REED 的 Leader 的信息
Challenge用于测试 Child ID 请求的时效性,以防止重放攻击

3. Child ID 请求

Child ID 请求是由连接设备(Child)发送给 Router 或 REED(Parent)的用于建立 Child-Parent 链接的单播请求。如果请求发送给 REED,它会在接受请求之前升级自身为 Router

OT MLE 附加 Child ID 请求

Child ID 请求消息内容

描述
VersionThread 协议版本
ResponseParent 回复挑战的副本
Link Frame CounterChild 上的 802.15.4 帧计数器
MLE Frame CounterChild 上的 MLE 帧计数器
Mode描述 Child
Timeout在 Parent 移除 Child 之前的不活动持续时间
Address Registration(仅适用于 MED 和 SED)注册 IPv6 地址

4. Child ID 回复

Child ID 回复是由 Parent 发送给 Child 的用于确认已建立 Child-Parent 链接的单播回复。

OT MLE 附加 Child ID 回复

Child ID 回复消息内容

回复
Source AddressParent 的 RLOC16
Address16Child 的 RLOC16
Leader Data关于 Parent 的 Leader 的信息(RLOC、分区 ID、分区权重)
Network Data关于 Thread 网络的信息(网内前缀、地址自动配置、更具体的路由)
Route (仅适用于 REED)路由传播
Timeout在 Parent 移除 Child 之前的不活动持续时间
Address Registration(仅适用于 MED 和 SED)确认已注册的地址

总结

如下总结:

  • Thread 设备会主动扫描现有网络;
  • Thread 使用 Mesh Link Establishment 来配置链接并传播有关网络设备的信息;
  • MLE 广告消息通知其他 Thread 设备有关设备的网络和链接状态;
  • MLE 附加流程用于建立 Child-Parent 链接。

V. Router 选择

Connected Dominating Set

OT 连接支配集

所有的Router 必须组成一个连接支配集(CDS),这意味着:

  1. 任意两个 Router 之间存在一条仅包含 Router 的路径。
  2. Thread 网络中的任何一个 Router 都可以通过完全位于 Router 集合内的路径来到达任何其他 Router 。
  3. Thread 网络中的每个 End Device 都直接连接到一个 Router 。

一个分布式算法维护着 CDS,从而确保了最低程度的冗余。每个设备最初连接到网络时都作为 End Device (Child)。随着Thread网络状态的变化,该算法会添加或删除 Router 以维护 CDS。

Thread 添加 Router 以:

  • 增加网络覆盖范围,如果网络低于16个 Router 的阈值
  • 增加路径多样性
  • 保持最低程度的冗余
  • 扩展连通性并支持更多的 End Device

Thread 移除 Router 以:

  • 将 Router 状态减少到不超过32个 Router 的最大状态
  • 在其他网络部分需要时允许新的 Router

升级为 Router

连接到 Thread 网络后, End Device 可以选择升级为 Router 。在启动 MLE Link Request 过程之前, End Device 会向 Leader 发送地址请求消息,请求 Router ID。如果 Leader 接受,它将回应 Router ID, End Device 会将自己升级为 Router 。

然后,MLE Link Request 过程用于与相邻 Router 建立双向 Router - Router 链接。

  1. 新 Router 向相邻 Router 发送组播链接请求
  2. Router 回复带有链接接受和请求消息;
  3. 新 Router 向每个 Router 发送单播链接接受以建立 Router - Router 链接。

1. 链接请求

链接请求是 Router 对 Thread 网络中的所有其他 Router 发送的请求。当首次成为 Router 时,设备会发送组播链接请求到ff02::2。稍后,在通过MLE Advertisements发现其他 Router 后,设备会发送单播链接请求。

OT MLE Link Request

链接请求消息内容

描述
VersionThread 协议版本
Challenge用于测试链接回复的时效性,以防止重放攻击
Source Address发送者的 RLOC16
Leader Data关于发送者的 Router Leader 的信息(RLOC,分区ID,分区权重)

2. 链接接受和请求

链接接受和请求是链接接受和链接请求消息的组合。Thread在MLE Link Request过程中使用这种优化,将消息数量从四条减少到三条。

OT MLE Link Accept and Request

3. 链接接受

链接接受是对相邻 Router 的链接请求的单播回复,它提供有关自身的信息并接受与相邻 Router 的链接。

OT MLE Link Accept

链接接受消息内容

描述
VersionThread 协议版本
Response用于测试链接回复的时效性,以防止重放攻击
Link Frame Counter发送者的802.15.4帧计数器
MLE Frame Counter发送者的MLE帧计数器
Source Address发送者的 RLOC16
Leader Data关于发送者的 Router Leader 的信息(RLOC,分区ID,分区权重)

降级为 REED

当 Router 降级为 REED 时,它的 Router - Router 链接被断开,并且设备启动 MLE Attach 过程以建立 End Device -父设备链接。

有关 MLE Attach 过程的更多信息,请参阅加入现有网络

单向接收链接

在某些情况下,有必要建立单向接收链接。

在 Router 重置后,相邻 Router 可能仍具有有效的与重置 Router 的接收链接。在这种情况下,重置 Router 发送链接请求消息以重新建立 Router - Router 链接。

End Device 也可能希望与相邻非父设备的 Router 建立接收链接,以提高组播可靠性。更多细节包含在组播路由相关章节。

总结

如下总结:

  • Thread 网络中的 Router 必须形成连接支配集(CDS);
  • 为维护 CDS,Thread 设备会升级为 Router 或降级为 End Device ;
  • 使用 MLE Link Request 过程来建立 Router - Router 链接。

本文由 Jay 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处,点赞3

还不快抢沙发

添加新评论