Nix矢量路由是一种模拟专用路由协议,适用于大型网络拓扑.该协议的按需特性以及nix向量的低内存占用量在处理大量节点时提供了内存使用和模拟运行时间方面的改进性能
1.重要知识点
- nix矢量路由使用广度优先搜索和称为nix矢量的有效路由存储数据结构执行按需路由计算
- 执行流程:产生数据包-计算路由-生成nix向量。nix向量存储路径上每个跳的索引,该索引对应于邻居索引.该索引用于确定应使用哪个网络设备和网关。
- 要传输数据包,nix向量必须与数据包一起传输.
在每一跳,当前节点从nix向量中提取适当的邻居索引,并通过相应的网络设备发送数据包.这一直持续到数据包到达目的地。 - 在计算Nix向量期间,Nix向量路由不使用任何路由度量(接口度量)。它仅基于根据BFS计算的最短路径
- 当从源-目的节点出现两条等价的最短路径时,nix选路方式取决于拓扑结构的构建方式,即网络设备添加到节点上以及网络设备添加在与当前节点的网络设备相关联的信道上的顺序
- 当网络拓扑发生变化时,Nix中的路由特定于给定的网络拓扑,并由发送方节点缓存.Nix监视以下事件:接口打开/关闭、路由添加/删除、地址添加/删除,以了解缓存的路由是否有效或是否必须清除。
另外,如果在数据包“运行中”时拓扑发生变化,则关联的NixVector无效,必须由中间节点重建.这是可能的,因为NixVecor带有一个“Epoch”,即一个指示何时创建NixVector的计数器。
如果拓扑结构发生变化,Epoch将被全局更新,并且任何过时的NixVector将被重建 - Nix矢量路由支持IPv4和IPv6协议
- Nix矢量路由执行子网匹配检查,但它不会检查地址是否已正确分配(地址的唯一性)。如果手动分配链路本地地址,则用户必须确保链路本地地址的唯一性
- Nix矢量路由支持到本地主机上的IPv4和IPv6环回地址的路由。
2.扩展:环回路由
环回:自己发自己收
环回接口:为了在不浪费接口资源、任何情况都能查询到设备,我们为该设备设计一个逻辑接口,用于标识和管理网络设备。只要设备运行正常,则该接口永远处于up状态
环回地址:是指环回接口上设置的地址
环回路由:当设备给其自身发送数据时,是把该数据包送到环回接口,完成环回的过程。但是如果目的ip地址不是环回路由的地址,此时利用环回路由来表示该地址就在自身接口上
3.nix-simple.cc代码分析

首先增加和nix的头文件#include "ns3/nix-vector-helper.h"
对命令行进行设置,规定默认使用IPv4协议,若想使用IPv6协议则在终端输入./ns3 run nix-double-wifi --useIPv6
设置log的级别为LOG_LEVEL_INFO
生成4个节点,并且nodes是4个节点的nodeContainer
利用PointToPointHelper设置P2P信道的时延和数据传输速率

为每一对连接的节点设置NetDeviceContainer,并通过Install方法将网络设备安装到对应的节点上

若使用IPv4协议,首先为协议栈设置使用的路由协议nixRouting并将协议栈安装到节点上。用Assign方法为网络设备中的节点分配IP地址,并将IPv4和接口组成一个std::pair存储在Ipv4InterfaceContainer中。其中udpServerAddress存储的是服务器的IP地址,这里我们将节点3设置为服务器

设置trace的输出格式,这里设计了两种输出:打印所有节点的路由表,打印给定源-目的节点的路由表

后面else语句中的内容是关于IPv6的,步骤都是一样的。
接下来设置服务器的端口号为9,用于接收客户端发来的数据包。使用Install方法为客户端安装应用程序并设置程序开始和结束的时间

同理,UdpEchoClientHelper类用于设置客户端连接的服务器的IP地址和端口号并设置客户端的属性:发包数、发包间隔、数据包大小。ApplicationContainer设置节点0为客户端节点,并为客户端节点安装应用程序并设置程序开启和结束的时间

仿真结果

4.nix-vector-routing.cc文件重要代码分析
template <typename T>
bool
NixVectorRouting<T>::BFS (uint32_t numberOfNodes, Ptr<Node> source,
Ptr<Node> dest, std::vector< Ptr<Node> > & parentVector,
Ptr<NetDevice> oif) const
其中的的BFS函数就是文件的核心:采用广度优先算法来查找源-目的节点的路径
广度优先:优先去更广的地方,用队列实现,采用按层遍历的思想
深度优先:优先去更深更远的地方,用递归实现
结合函数的输入分析广度优先关键点:
uint32_t numberOfNodes输入拓扑图中节点的数目Ptr<Node> source指示源节点Ptr<Node> dest指示目的节点std::vector< Ptr<Node> > & parentVector指示当前节点的父节点Ptr<NetDevice> oif指示当前节点的网络设备std::queue< Ptr<Node> > greyNodeList是一个队列,用来存储当前层需要遍历的节点- 主要思想:将源节点放入队列中,通过网络设备的指针找到和当前节点相连的网络设备并将其写入
NetDeviceContainer中。遍历NetDeviceContainer中的条目,若连接该网络设备的节点还没有出现,就将其加入队列中。遍历结束后,将队列首的元素弹出,此时该节点已完成搜索,接下来循环对新的队列首元素进行搜索/