NS3中的路由模型-4 DSDV路由协议

发布于:2025-07-10 ⋅ 阅读:(21) ⋅ 点赞:(0)

NS3中的路由模型-4 DSDV路由协议

在NS3中,DSDV(Destination-Sequenced Distance Vector)路由是一种基于距离向量的主动式路由协议[1]。以下是关于DSDV路由的一些关键特点和工作原理:


1. DSDV特点

  • 周期性更新

    • DSDV通过周期性地交换网络拓扑信息来维护正确的路由信息。每个节点会定期向邻居节点广播包含自身路由表信息的更新消息,以确保整个网络中的节点都能获取到最新的路由信息[1]。
  • 序列号机制

    • 每条路由记录都有一个由目标节点生成的序列号,该序列号用于区分路由信息的新旧。当节点接收到来自邻居节点的路由更新消息时,会根据序列号来判断是否接受新的路由信息,从而避免路由环路的形成[2]。
  • 事件触发更新

    • 除了周期性更新外,DSDV还支持事件触发的更新机制。当网络拓扑发生变化(如节点移动或链路断开)时,相关节点会立即向邻居节点发送包含最新路由信息的更新消息,以快速传播网络变化情况[1]。

2. 工作原理

  • 路由表建立与维护

    • 初始时,每个节点都会创建自己的路由表,其中包含了到达网络中其他所有节点的路径信息。随着网络运行,节点通过接收来自邻居节点的路由更新消息来不断更新自己的路由表。
    • 当节点接收到一个新的路由更新消息时,它会比较消息中的序列号与自己路由表中对应条目的序列号。如果新序列号更大,则表示这是一条更新的路径,节点会更新自己的路由表;否则,节点将忽略该消息。
    • 在更新路由表时,节点还会考虑跳数(即到达目标节点所需的中间节点数量)。通常情况下,节点会选择跳数更少的路径作为最优路径。
  • 数据包转发

    • 当源节点需要向目标节点发送数据包时,它首先会在自己的路由表中查找到达目标节点的路径。如果找到了有效的路径,源节点就会将数据包沿着该路径发送出去;如果没有找到有效路径,则会丢弃该数据包或采取其他错误处理措施。
    • 在转发过程中,每个中间节点都会重复上述查找过程,直到数据包最终到达目标节点为止。

综上所述,DSDV路由协议在NS3中扮演着重要的角色,其通过周期性更新、序列号机制以及事件触发更新等特点,能够有效地维护网络中的路由信息,确保数据包的正确转发。

NS3中的DSDV路由发现过程:

  1. 初始状态,将节点本身加入到本节点的路由表,并广播本节点的路由表;
  2. 收到其他节点的路由表后,计算跳数,更新到本节点的路由表中;
  3. 路由表出现更新,则全网广播路由表,无更新则周期性广播路由表;
  4. 路由表更新完成,开启数据发送。

2.1 DSDV 路由建立过程

图 1:DSDV 路由建立过程(序列号机制)

NodeA NodeB NodeC 初始状态: 路由表 = [A: seq=5, hops=0] 周期广播: [A: seq=5, hops=0] 更新路由表: 添加 [A: seq=5, hops=1, next=NodeA] 广播: [A: seq=5, hops=1] [B: seq=3, hops=0] 更新路由表: 添加 [A: seq=5, hops=2, next=NodeB] 添加 [B: seq=3, hops=1, next=NodeB] 移动导致链路断开 自增序列号:seq=6 更新路由表:[A: seq=6, hops=0] 触发广播: [A: seq=6, hops=0] 发现seq=6 > 原seq=5 → 更新路由表: [A: seq=6, hops=1, next=NodeA] 广播: [A: seq=6, hops=1] 发现seq=6 > 原seq=5 → 更新路由表: [A: seq=6, hops=2, next=NodeB] NodeA NodeB NodeC

关键步骤解析:

  1. 初始广播

    • NodeA 广播自身路由(seq=5, hops=0
    • NodeB 接收后添加路由(下一跳=NodeA,hops=1)
    • NodeC 通过 NodeB 间接学习 NodeA(hops=2)
  2. 拓扑变化处理

    • NodeA 移动后自增序列号(seq=6
    • 广播新路由(seq=6, hops=0
    • NodeB/NodeC 根据更高序列号无条件更新路由
  3. 防环路机制

    • 低序列号路由(如旧seq=5)被自动丢弃
    • 所有节点最终收敛到最新路径

2.2 DSDV 数据包转发过程

图 2:DSDV 数据包转发过程

在这里插入图片描述

路由表内容(转发依据)

节点 目的地址 下一跳 跳数 序列号
S D N1 3 12
N1 D N2 2 12
N2 D D 1 12

转发步骤:

  1. 源节点 S 发起数据

    • 查路由表:目标 D → 下一跳 N1
    • 发送数据包到 N1
  2. 中间节点 N1 转发

    • 查路由表:目标 D → 下一跳 N2
    • 转发数据包到 N2
  3. 中间节点 N2 交付

    • 查路由表:目标 D → 下一跳 D(直连)
    • 直接交付给 D

3. 在 NS-3 中的实现:

  1. 模块位置: src/dsdv 目录。
  2. 主要类:
  • dsdv::RoutingProtocol: 实现 DSDV 协议逻辑的核心类。它继承自 ns3::Ipv4RoutingProtocol
  • dsdv::RoutingTable: 内部数据结构,存储路由条目(目的地址、下一跳、跳数、序列号、接口、生存时间等)。
  • dsdv::RoutingTableEntry: 表示单个路由表条目。
  • dsdv::QueueEntry: 用于管理等待发送的 DSDV 包(更新包)。
  • dsdv::PacketQueue: 队列结构,存放等待传输或重传的 DSDV 包。
  1. 关键机制:
  • 周期性更新定时器: 定期广播全量或增量路由表更新
  • 触发更新: 当本地路由表发生重要变化(如链路中断、新邻居发现导致度量显著改善)时,立即发送增量更新。
  • 序列号管理: 每个节点维护自己的序列号,并在发起关于自身的更新时使用它。
  • 路由表超时: 条目如果长时间未更新会被标记为无效或删除。
  • “Settling Time” 机制: 在广播新发现的路由或显著改进的路由之前,等待一小段时间(m_settlingTime),以收集潜在的更好更新,减少网络中的更新风暴。

3.1 如何在 NS-3 仿真中使用 DSDV:

使用 `InternetStackHelper` 为节点安装 DSDV 路由协议是最简单的方式。

```cpp
#include "ns3/dsdv-helper.h"
// ... 其他必要的头文件 ...

int main()
{
    // 1. 创建节点
    NodeContainer nodes;
    nodes.Create(20); // 例如,创建20个移动节点

    // 2. 配置移动模型 (MobilityModel) - DSDV需要节点移动
    MobilityHelper mobility;
    // ... 设置移动模型(如 RandomWalk2dMobilityModel, RandomWaypointMobilityModel)...

    // 3. 配置物理层和MAC层 (如 Wifi)
    WifiHelper wifi;
    WifiMacHelper wifiMac;
    YansWifiPhyHelper wifiPhy;
    // ... 配置Wifi参数 ...

    NetDeviceContainer devices = wifi.Install(wifiPhy, wifiMac, nodes);

    // 4. 安装网络协议栈并设置路由协议为DSDV
    InternetStackHelper stack;
    DsdvHelper dsdv; // 创建DSDV路由助手
    stack.SetRoutingHelper(dsdv); // 关键步骤:设置使用DSDV
    stack.Install(nodes);

    // 5. 分配IP地址 (通常使用 Ipv4AddressHelper)
    Ipv4AddressHelper address;
    address.SetBase("10.1.1.0", "255.255.255.0");
    Ipv4InterfaceContainer interfaces = address.Assign(devices);

    // 6. (可选) 配置DSDV参数 (在安装协议栈后)
    // 获取节点0上的DSDV协议实例
    Ptr<dsdv::RoutingProtocol> dsdvProto = nodes.Get(0)->GetObject<dsdv::RoutingProtocol>();
    // 修改参数,例如将周期性更新间隔设置为15秒
    dsdvProto->SetPeriodicUpdateInterval(Seconds(15));
    // 设置允许的最大跳数 (默认是16)
    dsdvProto->SetMaxQueueLen(64); // 设置包队列最大长度
    // ... 其他可配置参数 ...

    // 7. 配置应用层流量 (UdpEcho, OnOffApplication 等)
    // ... 设置发送方和接收方,安装应用 ...

    // 8. 配置仿真时间、跟踪、PCAP捕获等
    Simulator::Stop(Seconds(100.0));
    // ... 启用Ascii或PCAP跟踪 ...

    // 9. 运行仿真
    Simulator::Run();
    Simulator::Destroy();
    return 0;
}
```

3.2 配置参数:

可以通过获取节点上的 dsdv::RoutingProtocol 对象实例并调用其 Set 方法来配置:

  • SetPeriodicUpdateInterval(Time): 设置周期性广播路由更新的时间间隔.
  • SetSettlingTime(Time): 设置路由信息在广播前的稳定时间。
  • SetMaxQueueLen(uint32_t): 设置包队列的最大长度(防止缓冲区溢出)。
  • SetMaxQueuedPacketsPerDst(uint32_t): 设置每个目的地址允许排队的最大包数。
  • SetEnableBufferFlag(bool): 启用或禁用对中断链路数据包的缓冲(等待新路由)。
  • SetWSTFlag(bool): 启用或禁用加权稳定时间(Weighted Settling Time)计算。
  • SetEnableRAFlag(bool): 启用或禁用路由通告(Route Advertisement)机制。
  • SetMaxQueueTime(Time): 设置队列中包的最大生存时间。

3.3 优缺点 (在NS-3仿真中体现):

优点::

  • 简单: 实现相对简单(相较于按需协议)。
  • 无环路: 序列号机制有效防止路由环路。
  • 低延迟: 路由信息预先存在,数据包发送时几乎没有延迟(查找路由表即可)。
  • 可预测性: 周期性更新使得行为相对可预测。

缺点:

  • 高开销: 即使网络空闲,周期性广播也会消耗带宽和能量,在大规模或高移动性网络中开销巨大。
  • 收敛慢: 拓扑变化需要依赖周期性更新传播,收敛速度可能较慢,尤其在更新间隔较长时
  • 可扩展性差: 每个节点需要存储和维护整个网络的路由信息,不适合大型网络。
  • 对移动性敏感: 在高移动性场景下,路由表可能频繁失效,导致大量更新和丢包。缓冲机制能缓解但无法根除。

3.4. 何时使用:

DSDV 在 NS-3 仿真中通常用于:

  • 研究稳定的、移动性不高的 MANET 场景。
  • 作为基准协议,与 AODV、DSR、OLSR 等按需或混合协议进行性能对比(如比较开销、延迟、投递率)。
  • 理解和演示序列号如何解决距离矢量协议的路由环路问题。
  • 需要低数据包传输延迟的应用场景(前提是拓扑相对稳定)。

网站公告

今日签到

点亮在社区的每一天
去签到