导言

前两篇文章分别讨论了自组网的技术选型和最小可行搭建。假设你按照拼多多清单采购了 2 个 Heltec V3,跑通了第一条 Mesh 消息,然后热情开始扩散——邻居、同事、技术社区的朋友陆续加入。两个月后,你的社区 Mesh 从 2 个节点长到了 20 个。

这时候你会开始收到这样的反馈:

  • "为什么我的消息有时候发不出去?"
  • "明明显示节点在线,但他收不到我的消息"
  • "白天还好,晚上大家都在线的时候就特别慢"
  • "我在城东加了个太阳能中继,结果整个网反而更不稳定了"

恭喜——你的 Mesh 网络从'玩具'变成了'基础设施',而基础设施需要面对玩具阶段不需要面对的工程问题。

这篇文章逐一拆解四个核心挑战:信道拥塞、路由震荡、服务质量(QoS)、混合介质桥接,并讨论 Reticulum 的架构如何应对这些问题。

一、信道拥塞:LoRa 最诚实的物理限制

1.1 问题本质

LoRa 的物理层带宽极其有限——在 CN470 频段,典型数据速率约为 0.3~5.5 kbps。这意味着什么?用一个直观的对比:

1
2
3
4
5
一条 LoRa 信道(SF7, 125kHz)理论速率 ≈ 5.5 kbps
一个微信文字消息平均 ≈ 50 字节 ≈ 400 bit
假设每个消息加上路由开销 ≈ 100 字节 ≈ 800 bit

单信道理论最大吞吐 = 5500 / 800 ≈ 6~7 条消息/秒

6~7 条消息/秒——这是整张网络所有节点共享的带宽池。20 个节点如果平均每 3 秒发一条消息,信道就已经饱和。

1.2 Meshtastic 的放大效应

问题在 Meshtastic 上尤其严重,因为它使用**洪泛(flooding)**传播:

1
2
3
4
5
节点A 发一条 100 字节的消息
→ B 收到,转发
→ C 收到,转发
→ D 收到,转发
→ ... 直到 TTL 耗尽

一条消息被 N 个节点转发 N 次。20 个节点 → 一条消息产生 ~20 次空中传输 → 信道占用量放大 20 倍。

Meshtastic 规模化的死循环

  • 节点越多 → 每条消息的洪泛开销越大
  • 洪泛开销越大 → 信道越拥挤
  • 信道越拥挤 → 碰撞率越高 → 重传增多
  • 重传增多 → 信道更拥挤 → 崩溃

这就是为什么许多 Meshtastic 公共 Mesh 在超过 30~50 个活跃节点后体验急剧劣化。

1.3 Reticulum 的缓解策略

Reticulum 从三个层面应对信道拥塞:

层面一:路由寻址替代洪泛

1
2
3
Reticulum 的路由方式:
节点A → 计算路径 → B → C → D(目标)
只沿确定的路径传输,不像 Meshtastic 全网广播

一条消息只被路径上的节点(约 3~5 跳)转发,而非全部 20 个节点。信道占用与网络规模解耦

层面二:异构分流

Reticulum 不会把所有流量都往 LoRa 上堆。如果两个节点之间同时存在 LoRa 链路和 Wi-Fi 链路(比如两台树莓派既插了 LoRa 模块又连着同一个局域网),Reticulum 会自动优先走 Wi-Fi:

1
2
3
A ── Reticulum ── B
├── LoRa (0.5 kbps) ← 低优先级,仅作为备份
└── Wi-Fi (20 Mbps) ← 自动选这条路

层面三:通告速率限制

Reticulum 的路由通告(announce)有内置的速率限制机制。节点不会无节制地向全网广播自己的存在:

1
2
3
class Announce:
rate_limit = 1 # 每秒最多 1 次
per_interface_limit = True # 每个接口独立限速

这避免了 Meshtastic 中"每来一个新节点就引发一轮全网节点信息交换"的雪崩效应。

二、路由震荡:当路径太多反而成了问题

2.1 什么是路由震荡

考虑这样一个场景:

1
2
3
4
5
[节点A] —— LoRa —— [节点B]
| |
LoRa LoRa
| |
[节点C] —— Wi-Fi —— [节点D]

A 要给 D 发消息。有两条路径:

  • A → B → D(3 跳,全 LoRa)
  • A → C → D(2 跳 LoRa + 1 跳 Wi-Fi,更快)

Reticulum 会选择 A → C → D。

但如果 C 的 Wi-Fi 链路质量不稳定(比如 C 和 D 之间的 Wi-Fi 信号时好时坏),Reticulum 会在两条路径之间反复切换——这就是路由震荡(route flapping)

每次切换都会导致短暂的数据包丢失和路由表更新。频繁震荡会让网络表现得不稳定,即使物理链路并没有断。

2.2 Reticulum 的处理方式

Reticulum 采用了类似 BGP 的**路径阻尼(path damping)**策略:

1
2
3
4
路径评估 = 带宽权重 × 0.6 + 延迟权重 × 0.2 + 稳定性权重 × 0.2

稳定性权重 = 路径连续可用时间 / 总观测时间
新路径初始稳定性 = 0,随时间增长

实际效果:一条新出现的"更优"路径不会立刻取代当前路径。它需要证明自己稳定(连续可用一段时间),权重才会超过旧路径。这避免了"出现→切换→消失→切回→出现→切换"的震荡循环。

2.3 你可以做的手动优化

对于社区 Mesh 的管理者,以下实践可以减少路由震荡:

1
2
3
4
1. 骨干节点之间优先使用有线或稳定无线链路(Wi-Fi/LAN),不要只依赖 LoRa
2. 避免在一个小区内部署过多相互可见的中继节点(3~5 个足够覆盖)
3. 为关键骨干链路配置静态路由(Reticulum 支持静态路径配置)
4. 监控节点的接口切换频率,发现频繁切换的节点及时排查链路质量问题

三、QoS:不是所有消息都同等重要

3.1 问题场景

在 20+ 节点的社区 Mesh 上,不同类型的消息共享同一条 LoRa 信道:

消息类型 优先级 容忍延迟 示例
紧急消息 最高 < 5 秒 求救、灾难通知
即时消息 < 30 秒 人与人之间的实时对话
节点通告 < 5 分钟 路由表更新、新节点广播
遥测数据 < 30 分钟 传感器读数、GPS 位置更新
大文件传输 最低 数小时 Wikipedia 离线包同步

如果没有 QoS 机制,一个节点正在传输 Wikipedia 离线包(几千个数据包),会阻塞同信道上其他所有节点的紧急消息——这在灾难场景下是不可接受的。

3.2 Reticulum 的优先级队列

Reticulum 在数据包头部预留了优先级字段,传输层根据优先级调度:

1
2
3
4
5
6
7
8
9
10
11
数据包头部(简化):
┌─────────────────┬──────────┬──────────────┐
│ Destination Hash │ Priority │ Payload ... │
│ (80 bit) │ (2 bit) │ │
└─────────────────┴──────────┴──────────────┘

Priority 取值:
00 = 普通(Bulk) — 大文件传输、日志同步
01 = 优先(Priority) — 即时消息
10 = 高优(High) — 路由通告、网络管理
11 = 紧急(Emergency)— 保留,灾难通知

实际数据传输时:

1
2
3
4
5
6
发送队列(按优先级排序):

[紧急] ██ (先发)
[高优] ████
[优先] ██████████
[普通] ████████████████████████ (最后发,可能被抢占)

3.3 在应用层配合

使用 Reticulum 的应用(如 NomadNet、Sideband)也可以在应用层实现更细粒度的 QoS:

1
2
3
4
5
6
7
8
# 使用 Reticulum API 发送不同优先级的消息
import RNS

# 紧急消息
RNS.Packet(destination, data, priority=RNS.Packet.PRIORITY_EMERGENCY).send()

# 普通文件传输
RNS.Packet(destination, file_chunk, priority=RNS.Packet.PRIORITY_BULK).send()

对于社区 Mesh 的运营者,建议:

  1. 配置边界策略:在 LoRa 接口上禁止 PRIORITY_BULK 级别的流量,大文件只允许在 Wi-Fi/有线链路上传输
  2. 设置带宽预留:每个 LoRa 节点保证紧急消息可用 10% 的信道时间
  3. 监控队列深度:如果某个节点的发送队列持续超过 50 条,说明它在尝试发送过多数据——考虑限制该节点的发送速率

四、混合介质桥接:让 LoRa 孤岛互联

4.1 问题:物理孤岛

LoRa 的通信距离虽然远(城市 2~5 km,郊区 10+ km),但在不同城区之间仍然存在物理隔离:

1
2
3
4
5
6
7
[城东 LoRa Mesh]          [城西 LoRa Mesh]
A → B → C X → Y → Z
470MHz 470MHz
↑ ↑
│ 20 公里距离 │
└───────── ✗ ───────────┘
LoRa 无法跨越

两边的节点互相看不见——形成了两个"LoRa 孤岛"。如果没有桥接,城东的用户永远无法给城西的用户发消息。

4.2 Meshtastic 的做法:MQTT 桥接

Meshtastic 通过 MQTT 服务器将孤岛互联:

1
[城东 Mesh] → MQTT Broker(云服务器) → [城西 Mesh]

但问题很明显:

  • 依赖互联网:MQTT Broker 宕机 → 桥断
  • 依赖中心化服务器:有人在控制桥接点
  • 信道压力:MQTT 转发会把远程消息注入本地 LoRa 信道,加重拥塞

4.3 Reticulum 的做法:原生多接口桥接

Reticulum 不需要专门的"桥接"概念——因为每个 Reticulum 节点本身就是多接口的:

1
2
3
4
5
6
7
8
9
[骨干桥接节点]
┌─────┴─────┐
│ Reticulum │
│ Stack │
├───────────┤
│ LoRa 470 │ ← 连接本地 Mesh
│ Wi-Fi │ ← 连接互联网 → 远程 Mesh
│ Ethernet │ ← 连接骨干光纤(如果有)
└───────────┘

当这个节点收到来自本地 LoRa 的目标为远程节点的消息时,它自动选择最优出口接口:

1
2
3
目标在本地 LoRa 网络内 → 走 LoRa 接口
目标在远程(互联网可达)→ 走 Wi-Fi / Ethernet 接口
目标未知 → 先尝试所有接口,学习路由

关键优势:一旦城东和城西的某个节点通过任何方式建立了连接(哪怕只是临时的 Wi-Fi 热点),两张网络的拓扑就自动合并,之后消息自动选择最优路径。

4.4 实战:搭建一个城域网桥接节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
硬件清单:
- Orange Pi Zero 2W(运行 Reticulum): ~130 元
- Heltec V3(RNode 固件,LoRa 接口): ~35 元
- 已有的家庭宽带 / Wi-Fi: 0 元
- USB 供电线材: ~10 元
总成本: ~175 元

配置要点:
1. Heltec V3 刷 RNode 固件,USB 连接 Orange Pi
2. Orange Pi 连 Wi-Fi,安装 rns
3. 配置两个接口:
- LoRa Interface(RNode, 470MHz, CN 频段)
- TCP Server Interface(监听 0.0.0.0:4242,允许远程节点通过互联网接入)
4. 可选:在防火墙上做端口映射,让公网上的其他 Reticulum 节点也能通过你的节点接入本地 Mesh

这样一个节点放在客厅窗边,就完成了"本地 LoRa Mesh ↔ 互联网 ↔ 远程 Mesh"的无缝桥接。

需要注意的是,通过互联网桥接时,节点间的通信依赖了中心化的 ISP。这在你追求"完全离网"的场景下不适用——但 Reticulum 的设计允许多路径并存:互联网断了,至少本地 LoRa 网还活着;远程链路断了,至少本地消息不受影响。这就是"异构冗余"的价值。

五、规模化的分级路线图

总结一下,从 2 个节点到 200 个节点,自组网的工程复杂度是如何增长的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
阶段 1:点对点(2~5 节点)
├── 挑战:基本连通性
├── 方案:Heltec V3 + Meshtastic,即插即用
├── 复杂度:★☆☆☆☆
└── 关键词:玩

阶段 2:小群组(5~20 节点)
├── 挑战:信道利用率开始下降,消息偶发丢失
├── 方案:引入 Router 角色节点,配置合理 TTL
├── 复杂度:★★☆☆☆
└── 关键词:用

阶段 3:社区级(20~100 节点)
├── 挑战:信道拥塞频发,路由震荡,孤岛问题
├── 方案:迁移至 Reticulum,部署固定骨干节点,启用混合介质
├── 复杂度:★★★★☆
└── 关键词:管

阶段 4:城域级(100+ 节点)
├── 挑战:跨区桥接、QoS 策略、安全与身份管理、频谱规划
├── 方案:层次化路由拓扑、专用骨干网、自动化运维
├── 复杂度:★★★★★
└── 关键词:运营

大部分社区 Mesh 会在阶段 2 撞墙——不是因为技术不可行,而是因为继续往下走需要从"把固件刷进去就能用"切换到"理解网络协议栈的运作方式"。

这恰恰是 Reticulum 的价值所在:它提供的不是一个更快的 Meshtastic,而是一个能支撑你从阶段 1 一直走到阶段 4 的统一网络栈。你不需要在"从小变大的过程中"更换基础架构——只需要在同一套协议上增加接口、调整配置、优化拓扑。

六、写在中间:先跑起来,再理解

这三篇 Mesh 系列文章的信息密度逐篇递升。如果你是第一次接触自组网,我的建议是:

  1. 先按第二篇的采购清单买两个 Heltec V3(86 元),刷 Meshtastic,和另一个人发一条消息
  2. 当你亲身体验到"不经过任何运营商,消息出现在几公里外的另一个人屏幕上"的那一刻,很多东西就不再是抽象概念了
  3. 然后带着实际遇到的问题回来看这篇文章——信道拥塞、路由震荡、混合桥接——你会发现自己面对的正是这些问题