NS3中的路由模型-5 OLSR路由协议
1. OLSR工作原理
核心思想:通过选择多点中继(MPR, MultiPoint Relays) 来优化控制消息(尤其是拓扑信息)的传播范围,减少冗余广播。
1.1. 关键机制
-
邻居发现(Neighbor Detection):
- 每个节点定期广播 HELLO 消息(小范围广播,TTL=1)。
- HELLO 消息包含:邻居列表、链路状态(对称/非对称)、MPR 选择器状态等。
- 用于维护一跳邻居和两跳邻居信息。
-
多点中继(MPR)选择:
- 每个节点独立选择自己的 MPR 集合。
- 目标:选出一组最小的一跳邻居,使得通过这些邻居可以覆盖所有两跳邻居。
- 作用:只有 MPR 节点有权转发 TC(Topology Control)消息,减少洪泛开销。
-
拓扑扩散(Topology Dissemination):
- MPR 节点定期广播 TC 消息(Topology Control)。
- TC 消息包含:该 MPR 的邻居信息(即 MPR Selector 列表)。
- 非 MPR 节点不转发 TC 消息,极大减少控制开销。
-
路由表计算:
- 节点利用收集到的 TC 消息构建全网拓扑图。
- 使用 Dijkstra 算法计算到所有节点的最短路径。
- 路由表包含:目的地址、下一跳地址、跳数等。
1.2. 消息类型
| 消息类型 | 作用 | 发送范围 |
|---|---|---|
HELLO |
邻居发现与维护 | 一跳 (TTL=1) |
TC |
扩散拓扑信息 | 全网 (由 MPR 转发) |
MID |
多接口声明(可选) | 全网 |
HNA |
主机与网络关联(连接外部网络) | 全网 |
1.3. 工作流程
NS3中OLSR的具体实现细节,包括路由建立(邻居发现、MPR选择、拓扑扩散和路由计算)以及数据包如何根据路由表进行转发。
1.3.1 路由建立过程
在NS3中,OLSR的路由建立过程遵循RFC 3626,并通过几个周期性的事件来驱动:
- Hello消息的发送与邻居发现:
- 每个节点会周期性地(默认2秒)广播Hello消息(通过
SendHello()函数实现)。Hello消息只在一跳范围内传播(TTL=1)。 - Hello消息包含以下信息:
- 邻居接口地址列表(包括链路类型:对称链路、非对称链路或丢失链路)
- 该节点选择的MPR集合(MPR Set)
- MPR选择器集合(即哪些邻居选择本节点作为MPR)
- 当节点收到邻居的Hello消息,它会更新邻居表(Neighbor Set)和两跳邻居表(Two-hop Neighbor Set)。这些表存储在
OlsrState对象中。
- 每个节点会周期性地(默认2秒)广播Hello消息(通过
- MPR选择:
- 在收到Hello消息后(或者当邻居信息发生变化时),节点会触发MPR计算(
MprComputation()函数)。 - MPR选择的目标是选择最小数量的一跳邻居,使得这些邻居可以覆盖所有的两跳邻居(即每个两跳邻居至少有一个一跳邻居是所选MPR)。
- 在NS3中,MPR选择算法在
RoutingProtocol::MprComputation()中实现,它使用贪心算法来求解。
- 在收到Hello消息后(或者当邻居信息发生变化时),节点会触发MPR计算(
- TC消息的发送与拓扑扩散:
- 被选为MPR的节点会周期性地(默认5秒)广播TC消息(通过
SendTc()函数)。 - TC消息包含该节点的MPR选择器集合(即哪些邻居选择本节点作为MPR)。这样,其他节点就可以通过这些信息构建全网拓扑。
- TC消息会被MPR节点转发(但每个节点只转发一次),从而在整个网络内扩散。在NS3中,TC消息的转发通过
RoutingProtocol::ForwardDefault()处理。
- 被选为MPR的节点会周期性地(默认5秒)广播TC消息(通过
- 路由表计算:
- 节点在以下情况下会触发路由表计算(
RoutingProtocol::RoutingTableComputation()):- 收到TC消息(拓扑信息更新)
- 邻居表发生变化(如链路断开)
- 路由表过期(默认周期为5秒)
- 路由计算使用Dijkstra算法,基于收集到的拓扑信息(存储在拓扑表中)计算到所有节点的最短路径。
- 计算出的路由存储在节点的路由表中(
m_table)。
- 节点在以下情况下会触发路由表计算(
1.3.2 数据包转发过程
一旦路由表建立,数据包的转发过程如下:
- 数据包到达网络层:
- 当节点需要发送数据包时,它会查询路由表(通过
RouteOutput()函数)。 - 对于转发的数据包(即目的地址不是本节点),节点会调用
RouteInput()函数来决定如何处理。
- 当节点需要发送数据包时,它会查询路由表(通过
- 路由查询:
- 在
RouteInput()中,节点首先检查数据包的目的地址是否为本节点或广播地址。如果不是,则查询路由表(Lookup()函数)以确定下一跳。 - 路由表查询返回一个
Ipv4Route对象,其中包含下一跳地址和输出接口。
- 在
- 数据包转发:
- 如果找到有效路由,节点会将数据包发送到下一跳节点(通过
SendPacket()函数)。 - 如果没有找到路由,数据包会被丢弃,并可能触发ICMP目的不可达消息。
- 如果找到有效路由,节点会将数据包发送到下一跳节点(通过
- 路由维护:
- OLSR会持续维护路由信息。当链路断开时(通过Hello消息检测到邻居丢失),节点会更新邻居表,重新计算MPR,并触发新的TC消息广播,从而更新全网路由。
1.4. NS3中的关键函数和流程
- 周期性事件:
HelloTimerExpire():触发Hello消息的发送。TcTimerExpire():触发TC消息的发送(如果是MPR)。MidTimerExpire():处理多接口声明(可选)。HnaTimerExpire():处理主机和网络关联(连接外部网络)。RoutingTableCalculationTimerExpire():周期性触发路由表计算。
- 消息处理函数:
RecvOlsr():接收OLSR消息的总入口,根据消息类型分发给ProcessHello()、Proces
NS3中OLSR路由协议原理与实现

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



