[docs] add Chinese translation for Thread Primer (#5106)

This commit is contained in:
Yaoxing Shan
2020-07-16 08:44:02 -07:00
committed by GitHub
parent 89cd4b59f8
commit a67fa9b5e7
5 changed files with 780 additions and 0 deletions
@@ -0,0 +1,25 @@
# 什么是 Thread
<figure class="attempt-right">
<img src="../images/ot-logo-thread.png" srcset="../images/ot-logo-thread.png 1x, ../images/ot-logo-thread_2x.png 2x" border="0" alt="Thread" />
</figure>
<a href="http://threadgroup.org/">Thread<sup>®</sup></a> 是一个为低功耗物联网(IEEE 802.15.4-2006 WPAN)设备设计的基于 IPv6 的网络协议。Thread 是一个新的网状网络协议,它并不依赖其它的 802.15 网状网络协议(如 ZigBee、Z-Wave 和 Bluetooth LE)。
Thread 的主要特性包括:
* 易于部署和维护 — 安装、启动和操作相对简单
* 通信安全 — Thread 网络中的设备都必须通过身份验证,并且所有的通信都经过了加密
* 稳定可靠 — 具有自愈能力的网状网络,无单点故障,并且采用扩频技术以提高抗干扰能力
* 低功耗 — Thread 低功耗设备可以进入休眠并使用电池供电,通常使用一块电池便能工作数年
* 规模可扩展 — Thread 网络的规模可以扩展达数百个设备
如果你不熟悉 Thread,那么了解基本的 Thread 知识对于你在应用中使用 OpenThread 是至关重要的。本入门教程的目的是解释 Thread 的基本概念和工作原理,并为你提供了 OpenThread 开发的起点。
本教程假定读者已具备如下的基本知识:
* IEEE 802.15.4
* 网络及路由概念
* IPv6
本入门教程基于 Thread Specification V1.1.1。Thread Specification 可以在 [threadgroup.org](http://threadgroup.org/ThreadSpec) 中获取。
@@ -0,0 +1,231 @@
# IPv6 寻址
让我们来看一下 Thread 如何识别网络中的每个设备,以及设备间用何种类型的地址进行相互通信。
Key Term: 在本入门教程中,术语“接口(interface)”用于标识网络内 Thread 设备的端点。通常,单个 Thread 设备具有单个 Thread 接口。
## 域
<figure class="attempt-right">
<a href="../images/ot-primer-scopes_2x.png"><img src="../images/ot-primer-scopes.png" srcset="../images/ot-primer-scopes.png 1x, ../images/ot-primer-scopes_2x.png 2x" border="0" alt="OT Scopes" /></a>
</figure>
Thread 网络中有三种域用于单播寻址:
* Link-Local — 所有通过单次射频传输可访问的接口
* Mesh-Local — 所有在同一 Thread 网络中可访问的接口
* Global — 所有从 Thread 网络外部可以访问的接口
前两个域与 Thread 网络指定的 Prefix(前缀)相对应。Link-Local 的 Prefix 为 `fe80::/16`Mesh-Local 的 Prefix 为 `fd00::/8`
<h2 style="clear:right">单播</h2>
单个 Thread 设备可以通过多种 IPv6 单播地址来进行标识。每种地址都有不同的功能(基于域和用例)。
在介绍每种类型之前,让我们先了解一个共同的概念,它叫作 RLOCRouting Locator)。RLOC 根据 Thread 接口在网络拓扑中的位置来对其进行标识。
### 如何生成 RLOC
所有设备都获得一个 Router ID 和一个 Child ID。每个 Router 维护一个包含其所有子节点的表,两个 ID 的组合唯一地标识拓扑中的设备。例如,请参考以下拓扑中高亮的节点,其中 Router(五边形)中的数字是 Router ID,End Device(圆形)中的数字是 Child ID:
<figure>
<a href="../images/ot-primer-rloc-topology_2x.png"><img src="../images/ot-primer-rloc-topology.png" srcset="../images/ot-primer-rloc-topology.png 1x, ../images/ot-primer-rloc-topology_2x.png 2x" border="0" width="600" alt="OT RLOC Topology" /></a>
</figure>
每个子节点的 Router ID 对应于它的父节点(Router)。因为 Router 不会是子节点,所以 Router 的 Child ID 始终为 0。这些值对于 Thread 网络中的每个设备都是唯一的,并用于创建 RLOC16(代表 RLOC 的后 16 位)。
例如,以下是左上节点(Router ID = 1Child ID = 1)的 RLOC16 的计算方法:
<figure>
<a href="../images/ot-primer-rloc16_2x.png"><img src="../images/ot-primer-rloc16.png" srcset="../images/ot-primer-rloc16.png 1x, ../images/ot-primer-rloc16_2x.png 2x" border="0" width="400" alt="OT RLOC16" /></a>
</figure>
RLOC16 是 IIDInterface Identifier)的一部分,IID 对应的是 IPv6 地址的后 64 位。一些 IID 可用于标识某些类型的 Thread 接口。例如,RLOC 的 IID 始终为 <code>0000:00ff:fe00:<var>RLOC16</var></code> 的形式。
RLOC 由 Mesh-Local Prefix 和 IID 组成。例如,如果 Mesh-Local Prefix 是 `fde5:8dba:82e1:1::/64`RLOC16 = `0x401`,那么该节点的 RLOC 就是:
<figure>
<a href="../images/ot-primer-rloc_2x.png"><img src="../images/ot-primer-rloc.png" srcset="../images/ot-primer-rloc.png 1x, ../images/ot-primer-rloc_2x.png 2x" border="0" width="600" alt="OT RLOC" /></a>
</figure>
可以使用相同的逻辑来确定以上示例拓扑中所有高亮的节点的 RLOC:
<figure>
<a href="../images/ot-primer-rloc-topology-address_2x.png"><img src="../images/ot-primer-rloc-topology-address.png" srcset="../images/ot-primer-rloc-topology-address.png 1x, ../images/ot-primer-rloc-topology-address_2x.png 2x" border="0" width="600" alt="OT Topology w/ Address" /></a>
</figure>
但是,因为 RLOC 是基于节点在拓扑中的位置的,所以节点的 RLOC 会随着拓扑的变化而改变。
例如,如果 Thread 网络中的 `0x400` 节点离开了网络,那么它的子节点 `0x401``0x402` 会与其它的 Router 建立新连接,从而获得新的 RLOC16 和 RLOC
<figure>
<a href="../images/ot-primer-rloc-topology-change_2x.png"><img src="../images/ot-primer-rloc-topology-change.png" srcset="../images/ot-primer-rloc-topology-change.png 1x, ../images/ot-primer-rloc-topology-change_2x.png 2x" border="0" width="600" alt="OT Topology after Change" /></a>
</figure>
## 单播地址类型
RLOC 只是 Thread 设备可以获得的多种 IPv6 单播地址之一。另一类用于在 Thread 网络分区内标识唯一的 Thread 接口的地址称为 EIDEndpoint Identifier)。EID 与 Thread 网络拓扑无关。
常见的单播类型如下。
<table>
<tbody>
<tr>
<th colspan=2><h3>Link-Local Address (LLA)</h3></th>
</tr>
<tr>
<td colspan=2 style="background-color:rgb(238, 241, 242)">一种用于标识单次射频传输可访问的 Thread 接口的 EID。</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>示例</b></td><td><code>fe80::54db:881c:3845:57f4</code></td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>IID</b></td><td>基于 802.15.4 Extended Address</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>域</b></td><td>Link-Local</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>详情</b></td><td><ul><li>用于发现邻居、配置链路和交换路由信息</li><li>非可路由地址</li><li>总是带 <code>fe80::/16</code> Prefix</li></ul></td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<th colspan=2><h3>Mesh-Local EID (ML-EID)</h3></th>
</tr>
<tr>
<td colspan=2 style="background-color:rgb(238, 241, 242)">一种用于标识 Thread 接口的 EID,其与网络拓扑无关。用于访问同一 Thread 分区内的 Thread 接口。也称为 ULAUnique Local Address)。</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>示例</b></td><td><code>fde5:8dba:82e1:1:416:993c:8399:35ab</code></td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>IID</b></td><td>在 commissioning 完成后随机生成</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>域</b></td><td>Mesh-Local</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>详情</b></td><td><ul><li>不会随拓扑变化而变化</li><li>应由应用程序使用</li><li>总是带 <code>fd00::/8</code> Prefix</li></ul></td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<th colspan=2><h3>Routing Locator (RLOC)</h3></th>
</tr>
<tr>
<td colspan=2 style="background-color:rgb(238, 241, 242)">根据 Thread 接口在网络拓扑中的位置来对其进行标识。</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>示例</b></td><td><code>fde5:8dba:82e1:1::ff:fe00:1001</code></td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>IID</b></td><td><code>0000:00ff:fe00:<var>RLOC16</var></code></td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>域</b></td><td>Mesh-Local</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>详情</b></td><td><ul><li>在设备连接到网络后生成</li><li>用于在 Thread 网络中传递 IPv6 数据报</li><li>随拓扑变化而变化</li><li>通常不会由应用程序使用</li></ul></td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<th colspan=2><h3>Anycast Locator (ALOC)</h3></th>
</tr>
<tr>
<td colspan=2 style="background-color:rgb(238, 241, 242)">用于标识 Thread 网络分区中一个或多个 Thread 接口的位置。如果始发者不知道目的地的 RLOC,则使用 ALOC 进行查找。</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>示例</b></td><td><code>fde5:8dba:82e1:1::ff:fe00:fc01</code></td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>IID</b></td><td><code>0000:00ff:fe00:fc<var>XX</var></code></td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>域</b></td><td>Mesh-Local</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>详情</b></td><td><ul><li><code>fc<var>XX</var></code> = <a href="#anycast">ALOC 目的地址</a>,用于查询对应的 RLOC</li><li>通常不会由应用程序使用</li></td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<th colspan=2><h3>Global Unicast Address (GUA)</h3></th>
</tr>
<tr>
<td colspan=2 style="background-color:rgb(238, 241, 242)">一个EID,用于标识除 Thread 网络外的全局范围内的 Thread 接口。</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>示例</b></td><td><code>2000::54db:881c:3845:57f4</code></td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>IID</b></td><td><ul><li>SLAAC — 由设备自身随机分配</li><li>DHCP — 由 DHCPv6 服务器分配</li><li>Manual — 由应用层分配</li></ul></td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>域</b></td><td>Global</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>详情</b></td><td><ul><li>一个公开的 IPv6 地址</li><li>总是带 <code>2000::/3</code> Prefix</li></td>
</tr>
</tbody>
</table>
## 多播
多播用于一次将信息传达给多个设备。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](https://tools.ietf.org/html/rfc3306))。
Thread 设备还支持除表中所列举域之外的任意域。
## 任播
当目的地的 RLOC 未知时,可以使用任播将流量路由到 Thread 接口。ALOCAnycast Locator)标识 Thread 分区内多个接口的位置。ALOC 的后 16 位,称为 ALOC16,其格式为 <code>0xfc<var>XX</var></code>,表示 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`<br>`0xfc4f` `0xfcff` | Reserved |
## 回顾
你应该学到了:
* Thread 网络包含三个域:Link-Local、Mesh-Local 和 Global
* Thread 设备具有多种单播 IPv6 地址
* RLOC 表示设备在 Thread 网络中的位置
* ML-EID 对于分区内的 Thread 设备是唯一的,并且应由应用程序使用
* Thread 使用多播将数据转发到节点组和 Router 组
* 当目的地的 RLOC 未知时,Thread 可以使用任播
要了解有关 Thread 的 IPv6 寻址的更多信息,请参阅 [Thread Specification](http://threadgroup.org/ThreadSpec) 的 5.2 和 5.3 节。
@@ -0,0 +1,254 @@
# 网络发现与形成
## Thread 网络
Thread 网络由三个唯一的标识符标识:
* 2 字节的 PAN IDPersonal Area Network ID,个域网标识符)
* 8 字节的 XPAN IDExtended Personal Area Network ID,扩展个域网标识符)
* 方便人类阅读的 Network Name(网络名称)
例如,一个 Thread 网络可能具有以下标识符:
| 标识符 | 值 |
| ------------ | -------------------- |
| PAN ID | `0xBEEF` |
| XPAN ID | `0xBEEF1111CAFE2222` |
| Network Name | `yourThreadCafe` |
<figure class="attempt-right">
<a href="../images/ot-primer-network-active-scan_2x.png"><img src="../images/ot-primer-network-active-scan.png" srcset="../images/ot-primer-network-active-scan.png 1x, ../images/ot-primer-network-active-scan_2x.png 2x" border="0" alt="OT Active Scan" /></a>
</figure>
在创建新的 Thread 网络或搜索现有的网络时,Thread 设备会主动扫描射频范围内的 802.15.4 网络:
1. 设备在特定 Channel 上广播 802.15.4 信标请求(Beacon Request)。
2. 范围内的所有 Router 或 REED 都会广播包含其 Thread 网络 PAN ID、XPAN ID 和 Network Name 的信标(Beacon),以作为回应。
3. 设备为每个 Channel 重复前两个步骤。
Thread 设备发现范围内的所有网络后,可以选择连接到现有的网络,也可以在未发现任何网络的情况下创建新的网络。
<h2 style="clear:right">Mesh Link Establishment</h2>
Thread 使用 MLEMesh Link Establishment)协议来配置链路并将网络的相关信息传播到 Thread 设备。
在链路配置中,MLE 用于:
* 发现相邻设备的链路
* 确认到相邻设备的链路质量
* 建立到相邻设备的链路
* 与对端协商链路参数(设备类型、帧计数器、超时)
MLE 将以下类型的信息传播给希望建立链路的设备:
* Leader dataLeader RLOC, Partition ID(分区标识符), Partition weight(分区权重))
* Network dataon-mesh prefixes, address autoconfiguration(地址自动配置), more-specific routes(具体路由))
* Route propagation(路由传播)
Thread 中路由传播的工作原理类似于 RIPRouting Information Protocol,路由信息协议),RIP 是一种距离矢量路由协议。
Note: 仅当 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)”。
Key Point: 每个设备(无论是否具有充当 Router 的能力),最初都作为子设备(End Device)连接到 Thread 网络。
1. 子节点向目标网络中的所有相邻的 Router 和 REED 发送多播 [Parent Request](#1-Parent-Request)。
2. 所有相邻的 Router 和 REED(如果 Parent Request Scan Mask(父节点请求扫描掩码)包括了 REED)都应发送 [Parent Response](#2-Parent-Response) 以将其自身的信息告诉给子节点。
3. 子节点选择一个父节点,并向其发送 [Child ID Request](#3-Child-ID-Request)。
4. 父节点发送 [Child ID Response](#4-Child-ID-Response) 以确认链路建立。
### 1. Parent Request
Parent Request 是来自待连接设备的多播请求,用于发现目标网络中的相邻的 Router 和 REED。
<figure>
<a href="../images/ot-primer-network-mle-attach-01_2x.png"><img src="../images/ot-primer-network-mle-attach-01.png" srcset="../images/ot-primer-network-mle-attach-01.png 1x, ../images/ot-primer-network-mle-attach-01_2x.png 2x" width="350" border="0" alt="OT MLE Attach Parent Request" /></a>
</figure>
<table>
<tbody>
<tr>
<th colspan=2>Parent Request Message Contents</th>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Mode</b></td>
<td>描述待连接设备</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Challenge</b></td>
<td>测试 Parent Response 的时效性,以防止重放攻击</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Scan Mask</b></td>
<td>将请求限制为仅 Router 或 Router 和 REED</td>
</tr>
</tbody>
</table>
### 2. Parent Response
Parent Response 是对 Parent Request 的单播响应,它向待连接设备提供有关 Router 或 REED 的信息。
<figure>
<a href="../images/ot-primer-network-mle-attach-02_2x.png"><img src="../images/ot-primer-network-mle-attach-02.png" srcset="../images/ot-primer-network-mle-attach-02.png 1x, ../images/ot-primer-network-mle-attach-02_2x.png 2x" width="350" border="0" alt="OT MLE Attach Parent Response" /></a>
</figure>
<table>
<tbody>
<tr>
<th colspan=2>Parent Response Message Contents</th>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Version</b></td>
<td>Thread 协议版本</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Response</b></td>
<td>Parent Request Challenge 的副本</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Link Frame
Counter</b></td>
<td>Router/REED 上的 802.15.4 帧计数器</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>MLE Frame
Counter</b></td>
<td>Router/REED 上的 MLE 帧计数器</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Source
Address</b></td>
<td>Router/REED 的 RLOC16</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Link
Margin</b></td>
<td>Router/REED 的接收信号质量</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Connectivity</b></td>
<td>描述 Router/REED 的连通性</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Leader
Data</b></td>
<td>有关 Router/REED 的 Leader 的信息</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Challenge</b></td>
<td>测试 Child ID Request 的时效性,以防止重放攻击</td>
</tr>
</tbody>
</table>
### 3. Child ID Request
Child ID Request 是来自待连接设备(子)的单播请求,该单播请求被发送到 Router(父)或 REED(父),目的是建立父子链路。如果将请求发送到 REED,则 REED 会在接受请求之前将自身升级为 Router。
<figure>
<a href="../images/ot-primer-network-mle-attach-03_2x.png"><img src="../images/ot-primer-network-mle-attach-03.png" srcset="../images/ot-primer-network-mle-attach-03.png 1x, ../images/ot-primer-network-mle-attach-03_2x.png 2x" width="350" border="0" alt="OT MLE Attach Child ID Request" /></a>
</figure>
<table>
<tbody>
<tr>
<th colspan=2>Child ID Request Message Contents</th>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Version</b></td>
<td>Thread 协议版本</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Response</b></td>
<td>Parent Response Challenge 的副本</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Link Frame
Counter</b></td>
<td>Child 上的 802.15.4 帧计数器</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>MLE Frame
Counter</b></td><td>Child 上的 MLE 帧计数器</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Mode</b></td>
<td>描述子节点</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Timeout</b></td>
<td>父节点移除子节点之前的闲置时间</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Address
Registration (MEDs and SEDs only)</b></td>
<td>注册 IPv6 地址</td>
</tr>
</tbody>
</table>
### 4. Child ID Response
Child ID Response 是父节点对 Child ID Request 的单播响应,该响应发送给对应的子节点以确认父子链路的建立。
<figure>
<a href="../images/ot-primer-network-mle-attach-04_2x.png"><img src="../images/ot-primer-network-mle-attach-04.png" srcset="../images/ot-primer-network-mle-attach-04.png 1x, ../images/ot-primer-network-mle-attach-04_2x.png 2x" width="350" border="0" alt="OT MLE Attach Child ID Response" /></a>
</figure>
<table>
<tbody>
<tr>
<th colspan=2>Child ID Response Message Contents</th>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Source
Address</b></td>
<td>父节点的 RLOC16</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Address16</b></td>
<td>子节点的 RLOC16</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Leader
Data</b></td>
<td>父节点的 Leader 的相关信息(RLOC, Partition ID, Partition weight</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Network
Data</b></td>
<td>Thread 网络的相关信息(on-mesh prefixes, address autoconfiguration, more-specific routes</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Route
(REED only)</b></td>
<td>路由传播</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Timeout</b></td>
<td>父节点移除子节点之前的闲置时间</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Address
Registration (MEDs and SEDs only)</b></td>
<td>确认已注册地址</td>
</tr>
</tbody>
</table>
## 回顾
你应该学到了:
* Thread 设备通过主动扫描发现现有网络
* Thread 使用 MLE 来配置链路并分发有关网络设备的信息
* MLE Advertisement 消息通知其他 Thread 设备有关设备的网络和链路状态
* MLE Attach 过程建立了父子链路
@@ -0,0 +1,125 @@
# 节点角色和类型
## 转发角色
<figure class="attempt-right">
<a href="../images/ot-primer-roles_2x.png"><img src="../images/ot-primer-roles.png" srcset="../images/ot-primer-roles.png 1x, ../images/ot-primer-roles_2x.png 2x" border="0" alt="OT Node Roles" /></a>
</figure>
在 Thread 网络中,节点分成两种转发角色:Router 和 End Device。
### Router
Router 节点的行为如下:
* 为网络设备转发数据包
* 为尝试加入网络的设备提供安全的 commissioning 服务
* 始终打开它的收发器
### End Device
End Device 节点的行为如下:
* 主要与单个 Router 进行通信
* 不会为其他网络设备转发数据包
* 可以关闭它的收发器来降低功耗
Key Point: Router 和 End Device 之间的关系称为父子关系。End Device 正确地依附到一个 Router 上,其中 Router 始终作为父节点,End Device 则始终是子节点。
## 设备类型
此外,节点有许多种类型。
<figure class="attempt-right">
<a href="../images/ot-primer-taxonomy_2x.png"><img src="../images/ot-primer-taxonomy.png" srcset="../images/ot-primer-taxonomy.png 1x, ../images/ot-primer-taxonomy.png 2x" border="0" alt="OT Device Taxonomy" /></a>
</figure>
### Full Thread Device
一个 FTDFull Thread Device)总是打开它的射频收发器,它订阅所有 Router 的多播地址,并维护 IPv6 地址映射。FTD 有三种类型:
* Router
* REEDRouter Eligible End Device)— 可以升级为 Router
* FEDFull End Device)— 无法升级为 Router
FTD 可以作为 Router(父)或 End Device(子)。
### Minimal Thread Device
MTDMinimal Thread Device)不会订阅 all-routers 多播地址,并且它会将它的所有消息发送给它的父节点。MTD 有两种类型:
* MEDMinimal End Device)— 始终打开自身的收发器,无需从父节点中轮询消息
* SEDSleepy End Device)— 通常会关闭自身的收发器(睡眠),偶然会打开收发器(唤醒)以从父节点中轮询消息
MTD 只能作为 End Device(子)。
### 升级和降级
当待加入设备仅能与某个 REED 通信时, 则该 REED 可以升级成为 Router
<figure>
<a href="../images/ot-primer-router-upgrade_2x.png"><img src="../images/ot-primer-router-upgrade.png" srcset="../images/ot-primer-router-upgrade.png 1x, ../images/ot-primer-router-upgrade_2x.png 2x" border="0" width="400" alt="OT End Device to Router" /></a>
</figure>
相反,当一个 Router 没有子节点时,它可以降级成 End Device:
<figure>
<a href="../images/ot-primer-router-downgrade_2x.png"><img src="../images/ot-primer-router-downgrade.png" srcset="../images/ot-primer-router-downgrade.png 1x, ../images/ot-primer-router-downgrade_2x.png 2x" border="0" width="400" alt="OT Router to End Device" /></a>
</figure>
## 其他角色和类型
### Thread Leader
<figure class="attempt-right">
<a href="../images/ot-primer-leader_2x.png"><img src="../images/ot-primer-leader.png" srcset="../images/ot-primer-leader.png 1x, ../images/ot-primer-leader_2x.png 2x" border="0" alt="OT Leader and Border Router" /></a>
</figure>
Thread Leader 是一个 Router,它负责管理 Thread 网络中的 Router。Thread Leader 是动态自选的(提高容错率),它负责汇总和分发全网络的配置信息。
Note: 每个 Thread 网络[分区](#分区)中总是只有一个 Leader。
### Border Router
Border Router 是一种可以在 Thread 网络和其他网络(如 Wi-Fi)之间转发信息的设备。它还为外部连接配置 Thread 网络。
任何设备都可以充当 Border Router。
Note: 一个 Thread 网络中可以有多个 Border Router。
## 分区
<figure class="attempt-right">
<a href="../images/ot-primer-partitions_2x.png"><img src="../images/ot-primer-partitions.png" srcset="../images/ot-primer-partitions.png 1x, ../images/ot-primer-partitions_2x.png 2x" border="0" alt="OT Partitions" /></a>
</figure>
一个 Thread 网络可能由多个分区组成。当一组 Thread 设备不能再与另一组 Thread 设备通信时,会发生这种情况。每个分区在逻辑上均作为独立的 Thread 网络来运行,它们具有各自的 Leader、Router ID 分配和网络数据,同时分区前相同的安全凭证都将被保留下来。
当分区之间可以连通时,它们会自动合并。
Key Point: 安全凭证(security credentials)定义了 Thread 网络。物理无线电的连通性定义了该 Thread 网络中的分区。
请注意,在本入门教程中一般将 Thread 网络假定成单个分区。在必要时,将使用“分区”一词来阐明关键概念和示例。本教程稍后将详细介绍分区。
## 设备限制
单个 Thread 网络所支持的设备类型数量是有限制的。
| 角色 | 限制 |
| ---------- | ------------------ |
| Leader | 1 |
| Router | 32 |
| End Device | 511(每个 Router |
Thread 会尝试将 Router 的数量保持在 16 ~ 23 之间。如果一个 REED 作为 End Device 加入,并且网络中的 Router 数量低于 16,那么它将自动升级为 Router。
## 回顾
你应该学到了:
* Thread 设备可以是 Router(父)或 End Device(子)
* Thread 设备可以是 FTD(维护 IPv6 地址映射),也可以是 MTD(将所有消息发送给其父节点)
* REED 可以升级为 RouterRouter 也可以降级为 REED
* 每个 Thread 网络分区都有一个 Leader 来管理 Router
* Border Router 用于连接 Thread 和其他网络
* 一个 Thread 网络可能由多个分区组成
@@ -0,0 +1,145 @@
# Router 选择
## Connected Dominating Set
<figure class="attempt-right">
<a href="../images/ot-primer-cds_2x.png"><img src="../images/ot-primer-cds.png" srcset="../images/ot-primer-cds.png 1x, ../images/ot-primer-cds_2x.png 2x" width="350" border="0" alt="OT Connected Dominating Set" /></a><figcaption style="text-align: center"><i>Example of a Connected Dominating Set</i></figcaption>
</figure>
Router 必须形成一个 CDSConnected Dominating Set,连接支配集),这意味着:
1. 在任何两个 Router 之间都有一个 Router-only 的路径。
2. Thread 网络中的任何一个 Router 都可以通过完全位于 Router 集中而到达其他任何 Router。
3. Thread 网络中的每个 End Device 都直接连接到 Router。
Thread 使用分布式算法维护 CDS,从而确保最低程度的冗余。每个设备最初都作为 End Device(子)连接到网络。随着 Thread 网络状态的更改,算法会增添或移除 Router 以维护 CDS。
Thread 在下列情况下将会增添 Router:
* 如果网络低于 Router 阈值(16) —— 为了增加覆盖范围
* 增加路径多样性
* 保持最低程度的冗余
* 扩展连接并支持更多子节点
Thread 在下列情况下将会移除 Router:
* 将路由状态减少到最多 32 个 Router 以下
* 必要时允许在网络的其他部分使用新 Router
## 升级成 Router
子设备连接到 Thread 网络后,可以选择成为 Router。在开始 MLE Link Request 过程之前,子设备会向 Leader 发送 Address Solicit 消息,以请求一个 Router ID。如果 Leader 同意该请求,则它将响应一个 Router ID 给子设备,并且子设备会将自身升级为 Router。
然后,MLE Link Request 过程用于与相邻的 Router 建立双向 Router-Router 链路。
1. 新 Router 将发送一个多播 [Link Request](#1-Link-Request) 到相邻的 Router。
2. Router 使用 [Link Accept and Request](#2-Link-Accept-and-Request) 消息进行响应。
3. 新 Router 使用单播的 [Link Accept](#3-Link-Accept) 响应每个 Router,以建立 Router-Router 链路。
### 1. Link Request
Link Request 是从 Router 到 Thread 网络中所有其他 Router 的请求。首次成为 Router 时,设备会发送一个多播 Link Request 到 `ff02::2`。稍后,在通过 MLE Advertisement 发现其他 Router 后,设备将发送单播的 Link Request。
<figure>
<a href="../images/ot-primer-network-mle-link-request-01_2x.png"><img src="../images/ot-primer-network-mle-link-request-01.png" srcset="../images/ot-primer-network-mle-link-request-01.png 1x, ../images/ot-primer-network-mle-link-request-01_2x.png 2x" width="350" border="0" alt="OT MLE Link Request" /></a>
</figure>
<table>
<tbody>
<tr>
<th colspan=2>Link Request Message Contents</th>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Version</b></td>
<td>Thread 协议版本</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Challenge</b></td>
<td>测试 Link Response 的及时性,以防止重放攻击</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Source
Address</b></td>
<td>发送者的 RLOC16</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Leader
Data</b></td>
<td>Router 的 Leader 的相关信息(RLOC, Partition ID, Partition weight</td>
</tr>
</tbody>
</table>
### 2. Link Accept and Request
Link Accept and Request 是 Link Accept 和 Link Request 消息的组合。Thread 在 MLE Link Request 过程中使用此优化将消息的数量从四减少到三。
<figure>
<a href="../images/ot-primer-network-mle-link-request-02_2x.png"><img src="../images/ot-primer-network-mle-link-request-02.png" srcset="../images/ot-primer-network-mle-link-request-02.png 1x, ../images/ot-primer-network-mle-link-request-02_2x.png 2x" width="350" border="0" alt="OT MLE Link Accept and Request" /></a>
</figure>
### 3. Link Accept
Link Accept 是对来自相邻 Router 的 Link Request 的单播响应,该响应提供有关自身的信息并接受到相邻 Router 的链路。
<figure>
<a href="../images/ot-primer-network-mle-link-request-03_2x.png"><img src="../images/ot-primer-network-mle-link-request-03.png" srcset="../images/ot-primer-network-mle-link-request-03.png 1x, ../images/ot-primer-network-mle-link-request-03_2x.png 2x" width="350" border="0" alt="OT MLE Link Accept" /></a>
</figure>
<table>
<tbody>
<tr>
<th colspan=2>Link Accept Message Contents</th>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Version</b></td>
<td>Thread 协议版本</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Response</b></td>
<td>测试 Link Response 的及时性,以防止重放攻击</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Link Frame
Counter</b></td>
<td>发送者上的 802.15.4 帧计数器</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>MLE Frame
Counter</b></td>
<td>发送者上的 MLE 帧计数器</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Source
Address</b></td>
<td>发送者的 RLOC16</td>
</tr>
<tr>
<td width="25%" style="background-color:rgb(238, 241, 242)"><b>Leader
Data</b></td>
<td>Router 的 Leader 的相关信息(RLOC, Partition ID, Partition weight</td>
</tr>
</tbody>
</table>
## 降级成 REED
当 Router 降级成 REED 时,其 Router-Router 链路断开,并且设备开始 MLE Attach 过程以建立父子链路。
有关 MLE Attach 过程的更多信息,请参阅 [加入现有网络](/guides/thread-primer/network-discovery#加入现有网络)。
## 单向接收链路
在某些情况下,建立单向接收链路是有必要的。
在 Router 重置后,相邻 Router 可能仍具有与重置的 Router 的有效接收链路。在这种情况下,重置的 Router 发送 Link Request 消息以重新建立 Router-Router 链路。
End Device 也可能希望与相邻的 Router(非父节点)建立接收链路,以提高多播可靠性。当我们进入多播路由时,我们将学习更多与此相关的内容。
## 回顾
你应该学到了:
* Thread 网络中的 Router 必须形成 CDS
* Thread 设备将升级成 Router 或降级成 REED 以维护 CDS
* MLE Link Request 过程用于建立 Router-Router 链路