跳转至

任意路由

在传统的 ns-3 路由类中,路由策略被限制为特定的路由表结构,而 Arbiter 路由 提供了一种更加灵活的路由方式,允许你自定义和实现任何路由策略

Arbiter类本身实现的是一个基础的ECMP,是一个具有普适意义的基类,因此开发者实现自定义类的方式很简单:

直接继承Arbiter类!

构成

  • Arbiter: model/core/arbiter.c/h
    • 抽象基类,最基础的类
    • 针对普通的拓扑
    • 任何继承它的类必须实现一个名为 decide 的函数
    • 根据源节点、目标节点、数据包、IP 头等信息,决定是否丢弃包或将包转发到哪个接口,目标网关的 IP 地址是多少
  • ArbiterPtop: model/core/arbiter-ptop.c/h
    • 继承自Arbiter,不过对于开发者的自定义而言,它还是基类
    • 专门针对点对点拓扑
    • 任何继承它的类必须实现一个名为 topology_decide 的函数
    • 不需要网关,只返回下一跳的节点 ID,或者返回 -1 表示丢弃该包

  • ArbiterEcmp: model/core/arbiter-ecmp.c/h
    • 继承自 ArbiterPtop
    • 根据 5 元组哈希值来决定路由,并从一组候选的下一跳中选择一个作为最终的路由
  • ArbiterEcmpHelper: model/arbiter-ecmp-helper.c/h
    • 辅助类
    • 用于计算 ArbiterEcmp 实例的路由状态,并安装

  • Ipv4ArbiterRouting: model/core/ipv4-arbiter-routing.c/h
    • 路由实例类,
    • 在每次路由决策时调用对应的 Arbiter 实例,从而决定每个数据包的路由路径
  • Ipv4ArbiterRoutingHelper: helper/core/ipv4-arbiter-routing-helper.c/h
    • 辅助类
    • 用于将 Ipv4ArbiterRouting 实例安装到节点

主代码

引入头文件

C++
1
2
#include "ns3/ipv4-arbiter-routing-helper.h"
#include "ns3/arbiter-ecmp-helper.h"

安装ECMP路由

回顾一下,在ns-3中创建路由,都是先创建对象,然后将helper施加到这个对象上,这里也不例外

C++
1
2
3
4
// 创建点对点拓扑
Ptr<TopologyPtop> topology = CreateObject<TopologyPtop>(basicSimulation);
// 使用helper安装路由
ArbiterEcmpHelper::InstallArbiters(basicSimulation, topology);