NS3中的路由模型-5 OLSR路由协议

NS3中OLSR路由协议原理与实现


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. 工作流程

节点启动
广播HELLO消息
收集邻居信息
选择MPR集合
广播TC消息
收集全网拓扑
计算路由表
转发数据包

NS3中OLSR的具体实现细节,包括路由建立(邻居发现、MPR选择、拓扑扩散和路由计算)以及数据包如何根据路由表进行转发。

1.3.1 路由建立过程

在NS3中,OLSR的路由建立过程遵循RFC 3626,并通过几个周期性的事件来驱动:

  1. Hello消息的发送与邻居发现
    • 每个节点会周期性地(默认2秒)广播Hello消息(通过SendHello()函数实现)。Hello消息只在一跳范围内传播(TTL=1)。
    • Hello消息包含以下信息:
      • 邻居接口地址列表(包括链路类型:对称链路、非对称链路或丢失链路)
      • 该节点选择的MPR集合(MPR Set)
      • MPR选择器集合(即哪些邻居选择本节点作为MPR)
    • 当节点收到邻居的Hello消息,它会更新邻居表(Neighbor Set)和两跳邻居表(Two-hop Neighbor Set)。这些表存储在OlsrState对象中。
  2. MPR选择
    • 在收到Hello消息后(或者当邻居信息发生变化时),节点会触发MPR计算(MprComputation()函数)。
    • MPR选择的目标是选择最小数量的一跳邻居,使得这些邻居可以覆盖所有的两跳邻居(即每个两跳邻居至少有一个一跳邻居是所选MPR)。
    • 在NS3中,MPR选择算法在RoutingProtocol::MprComputation()中实现,它使用贪心算法来求解。
  3. TC消息的发送与拓扑扩散
    • 被选为MPR的节点会周期性地(默认5秒)广播TC消息(通过SendTc()函数)。
    • TC消息包含该节点的MPR选择器集合(即哪些邻居选择本节点作为MPR)。这样,其他节点就可以通过这些信息构建全网拓扑。
    • TC消息会被MPR节点转发(但每个节点只转发一次),从而在整个网络内扩散。在NS3中,TC消息的转发通过RoutingProtocol::ForwardDefault()处理。
  4. 路由表计算
    • 节点在以下情况下会触发路由表计算(RoutingProtocol::RoutingTableComputation()):
      • 收到TC消息(拓扑信息更新)
      • 邻居表发生变化(如链路断开)
      • 路由表过期(默认周期为5秒)
    • 路由计算使用Dijkstra算法,基于收集到的拓扑信息(存储在拓扑表中)计算到所有节点的最短路径。
    • 计算出的路由存储在节点的路由表中(m_table)。

1.3.2 数据包转发过程

一旦路由表建立,数据包的转发过程如下:

  1. 数据包到达网络层
    • 当节点需要发送数据包时,它会查询路由表(通过RouteOutput()函数)。
    • 对于转发的数据包(即目的地址不是本节点),节点会调用RouteInput()函数来决定如何处理。
  2. 路由查询
    • RouteInput()中,节点首先检查数据包的目的地址是否为本节点或广播地址。如果不是,则查询路由表(Lookup()函数)以确定下一跳。
    • 路由表查询返回一个Ipv4Route对象,其中包含下一跳地址和输出接口。
  3. 数据包转发
    • 如果找到有效路由,节点会将数据包发送到下一跳节点(通过SendPacket()函数)。
    • 如果没有找到路由,数据包会被丢弃,并可能触发ICMP目的不可达消息。
  4. 路由维护
    • OLSR会持续维护路由信息。当链路断开时(通过Hello消息检测到邻居丢失),节点会更新邻居表,重新计算MPR,并触发新的TC消息广播,从而更新全网路由。

1.4. NS3中的关键函数和流程

  • 周期性事件
    • HelloTimerExpire():触发Hello消息的发送。
    • TcTimerExpire():触发TC消息的发送(如果是MPR)。
    • MidTimerExpire():处理多接口声明(可选)。
    • HnaTimerExpire():处理主机和网络关联(连接外部网络)。
    • RoutingTableCalculationTimerExpire():周期性触发路由表计算。
  • 消息处理函数
    • RecvOlsr():接收OLSR消息的总入口,根据消息类型分发给ProcessHello()Proces
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wenxin-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值