OLSR 路由过程描述

阶段 1:邻居发现与对称链路建立(HELLO 消息交互)

HELLO 消息发送

所有节点周期性(默认 1 秒)广播 HELLO 消息,消息包含自身 IP 地址、当前一跳邻居列表、转发意愿(Willingness,如 WILL_ALWAYS/WILL_NEVER)。 HELLO 只在一跳范围内传输

对称链路验证

节点接收邻居的 HELLO 消息后,若发现自身地址在对方的“一跳邻居列表”中,判定为对称链路(可双向通信);若仅单向接收 HELLO(如 A 能收到 C 的消息,但 C 收不到 A 的),则视为无效链路,不纳入后续计算。 所有链路必须双向验证才被认为是可用的。可以双向交互的链路是对称链路,可以双向交互的两个节点是对称节点。

邻居侦听的过程如下图所示,在初始化阶段,当节点 A 收到一个来自于邻居节点 B 的 HELLO 分组,A 将 B 放入自己的邻居集中,并将到 B 的链路标记为非对称状态,然后,在 A 向 B 发送 HELLO 分组时,在 HELLO 分组中就包含有 B 是 A 的非对称状态的邻居节点的信息,当 B 收到该 HELLO 分组时,B 将在邻居集中将 A 的状态更新为对称状态。同理,在 B 再次向 A 发送 HELLO 分组时,HELLO 分组中就包含了 A 是 B 的对称状态的邻居节点的信息,当 A 收到该 HELLO 分组时,A 就在邻居集中将 B 的状态更新为对称状态。

邻域信息收集

每个节点通过 HELLO 消息构建“一跳邻居表”(如 B 的一跳邻居表:{A,C,D};A 的一跳邻居表:{B}),为后续 MPR 选择提供基础。

阶段 2:MPR(多点中继)节点选择

多点广播中继即 MPR 技术作为 OLSR 路由协议中的一个重要组成部分,可以有效地减少网络中控制分组的发送数量。

两跳邻居推导

每个节点基于“一跳邻居表”,通过 HELLO 消息中的“邻居的邻居”信息,推导自身的“两跳邻居表”(如 A 通过 B 的 HELLO 消息,得知 B 的邻居是 C/D,因此 A 的两跳邻居是 C/D)。

MPR 选择原则(贪心算法):

  • 目标:从一跳邻居中选最小子集,确保该子集能覆盖所有两跳邻居(即通过 MPR 节点,可到达所有两跳节点)。
  • 步骤 1:优先选择覆盖“孤立两跳邻居”的节点(如 A 的两跳邻居 C/D 仅能通过 B 到达,因此 B 必须被选为 A 的 MPR);
  • 步骤 2:若存在多个候选节点,按“覆盖未覆盖两跳邻居数量”排序,选覆盖度最高的(如 B 的覆盖度为 3,能覆盖 A/C/D 的两跳邻居,因此被多个节点选为 MPR);

MPR 角色确认

被至少一个节点选为 MPR 的节点,成为全网的“MPR 节点”(如 B),负责后续 TC 消息的转发;未被选中的节点(如 A/C/D)不转发 TC 消息,仅接收和处理。

阶段 3:TC 消息传播(全网拓扑信息同步)

TC 消息生成

MPR 节点周期性(默认 5 秒)生成 TC 消息,内容包含:

  • 自身 IP 地址;
  • MPR 选择器列表(即“哪些节点选了自己当 MPR”,如 B 的选择器是 A/C/D);
  • 序列号(递增,用于判断消息新鲜度,避免过时拓扑)。

TC 消息转发规则

仅 MPR 节点有权转发 TC 消息,且仅转发给自身的一跳邻居(非 MPR 节点接收后不转发)——这是 OLSR 减少控制开销的核心:传统链路状态协议(如 OSPF)需全网洪泛,而 OLSR 通过 MPR 将 TC 传播范围缩小 60%-80%。

全局拓扑表构建

所有节点接收 MPR 节点的 TC 消息后,整合自身的 HELLO 邻域信息,构建全网拓扑表(记录所有节点的连接关系,如 A 通过拓扑表知道“D 可通过 B 到达”“C 可通过 B 到达”)。

阶段 4:路由表计算(Dijkstra 算法求最短路径)

最短路径计算

每个节点以自身为“根节点”,对拓扑表运行 Dijkstra 算法,计算到所有其他节点的最短路径(以“跳数”为权重,也可扩展为带宽/延迟)。

示例:A 计算到 D 的路径:A→B→D(2 跳),无更短路径,因此路由表中“目的地 D”的下一跳为 B,跳数 2;

路由表生成

路由表核心字段包括“目的地 IP、下一跳 IP、跳数、路径状态”,用于后续数据转发;

拓扑变化更新

若节点移动导致链路中断(如 B 与 D 断开),MPR 节点 B 会立即发送“序列号 +1”的 TC 消息(标注“B→D 链路失效”),全网节点接收后更新拓扑表,并重新运行 Dijkstra 算法修复路由(收敛时间通常 <5 秒)。

阶段 5:数据分组转发(基于路由表逐跳转发)

数据封装

源节点 A 将应用数据封装为 IP 分组,目的地址设为 D,不携带完整路径(仅需下一跳);

逐跳转发

每个节点接收数据分组后,提取目的地址,查询自身路由表,将分组转发给对应的下一跳(如 B 接收 A 的分组后,查路由表“D 的下一跳是自身直连”,直接发给 D);

路径失效处理

若转发过程中发现下一跳不可达(如 B 发 D 失败),B 会立即发送“TC 更新消息”,触发局部路由修复(如 A 重新计算到 D 的路径,若存在 A→C→D 则切换,无则标记“D 不可达”);

多路径扩展(OLSRv2)

若为 OLSRv2,源节点 A 可计算多条不相交路径(如 A→B→D、A→C→D),通过“负载均衡”将数据分配到不同路径,提升吞吐量。

整体流程总结

OLSR 路由过程本质是“主动维护拓扑 → 优化控制开销 → 精准计算路径 → 高效转发数据”的闭环,核心依赖 MPR 机制减少控制消息洪泛,通过 Dijkstra 算法保证路径最优,最终实现 MANET(移动自组织网络)中低开销、快收敛的路由。全流程可简化为:

HELLO邻居发现→MPR选择→TC拓扑同步→Dijkstra路由计算→数据逐跳转发