ndnSIM模拟器介绍

ndnSIM是由UCLA的研究人员为NDN协议开发的NS3模块。ndnSIM模拟器可以用来大规模部署命名数据网络NDN。ndnSIM模拟器实现了BestRoute转发策略以及Interest包和Data包的定义,实现了PIT、FIB和CS的数据结构,可以运行支持NDN网络的应用,提供了NDN网络实验的评测工具。

ndnSIM是由UCLA的研究人员为NDN协议开发的NS3模块。虽然PARC研究所开发了一个 NDN 协议的原型实现 CCNx,人们可以使用 CCNx 在真实环境中评估NDN协议的设计和CCNx的性能,然而,人们不能探索不同的网络层设计,也无法大规模部署。因此,为了让人们可以研究 NDN 网络层的各种组件,比如路由协议、转发策略、缓存策略、拥塞控制等,UCLA 的研究人员基于NS3 开发了NDN 协议模拟器。2015年,ndnSIM发布了2.0版本,使得模拟实验能够更加真实地与真实环境相结合

ndnSIM 是作为新的网络层协议模块实现的,它可以运行在任何链路层协议模块之上(point-to-point, CSMA, wireless 等),也可以运行在其他网络层(IPv4,IPv6)和传输层协议(TCP,UDP)之上。这种灵活性使得 ndnSIM 可以模拟多种同质或异质网络(只有 NDN或 IP 之上的 NDN)。 ndnSIM 是模块化设计的,NDN 网络层的每一个实体都使用一个单独的C++类来模拟,比如 PIT、FIB、Content Store、网络和应用接口、Interest 转发策略等。这种模块化的结构使得任意组件都可以被轻易地修改和替换,而不会对其他组件造成太大的影响。此外,该模拟器提供了大量的接口和辅助类来追踪每个组件的行为,同时也追踪 NDN的流量

设计总览

ndnSIM的设计和NS3的设计理念一致,尽可能地将网络中的各个组件抽象化。和现有的 IPv4 和 IPv6 协议栈一样,ndnSIM被实现为一个可以安装在网络节点上的独立协议栈。除了核心协议栈之外,ndnSIM 还包含了几个基本的可以简化模拟过程的流量发生器应用和辅助类,以及用来收集模拟数据的工具。ndnSIM 在NS-3模拟器中的位置如下图所示

ndnSIM模拟器结构

下面是 ndnSIM 中实现的模块,下图显示了他们之间的相互关系。

ndnSIM模拟器使用方法

  • ccnxL3Protocol
    实现了NDN的核心协议:从上层和下层接口接收Interest和Data包,执行Content Store、PIT、FIB 查询,根据 PIT 的状态转发数据包,并用转发策略来处理 Interest。
  • ccnxFace
    该模块抽象出来是为了让应用和其他模拟节点(NetDeviceFace)在通信上保持一致性,该模块还支持连接层拥塞控制功能。
  • ccnxContentStore
    网络中的数据存储,带有替换策略模块。
  • ccnxPit
    等待状态的 Interest 列表,以及相应的进出接口列表。
  • ccnxFib
    转发表,每个前缀一个有序接口列表
  • 可选的 Interest 转发策略
    *NDN参考应用

Interest和Data包的格式和CCNx原型实现中的二进制格式一致,可以重用已有的流量分析工具,并用实际的 NDN 流量数据来进行模拟。

ndnSIM 的设计包含了一些可选的模块,包括

(1)用于数据安全的占位符(当前的代码只给数据包附加了签名但没有计算,在路由器上也没有进行签名验证)
(2)实验性的否定确认机制,以实现快速地反馈数据平面问题
(3)可选的Interest速度限制和接口可用性组件。

核心NDN协议的实现

ndnSIM 中的 CcnxL3Protocol 是一个核心的架构性实体,它和 NS-3 中实现IPv4 和 IPv6 的网络层协议的 Ipv4L3Protocol 类和 Ipv6L3Protocol 类在同一层次中。ccnxL3Protocol 是一个逻辑组件聚合器,用于聚合 Content Store,PIT,FIB,转发策略,以及所有可用的接口(即所有应用程序和其他节点上的通信信道)。它还可以处理所有传入的 Interest 和Data 包。

ccnxL3Protocol 类定义了 API用来完成 NDN 协议栈的以下几种操作:

  • AddFace/RemoveFace:注册一个新的接口到 NDN协议或删除现有的接口;
  • GetForwardingStrategy/SetForwardingStrategy:获取当前或注册一个新的转发策略给 NDN协议栈使用;
  • 提供网络层统计数据收集接口,包括 Interest 包(InInterests,DropInterests),Data 包(OutData,InData,DropData),以及可选的Interest NACK(OutNacks,InNacks,DropNacks),以达到测量的目的;
  • 提供配置可选组件的功能(对 NACK 的支持以及缓存听说过但没有被请求的数据)

接口抽象

为了提供最大的灵活性和可扩展性的目标,ndnSIM 的层间交互被抽象出来使得 ndnSIM 的设计独立于底层传输。换言之,核心协议实现(NDN Level 3 Protocol,ccnxL3Protocol)、网络、应用之间的所有通信都是通过接口抽象(ccnxFace)来完成的。而 ccnxFace可以通过多种形式实现:用于节点间直接通过链路层通信的链路层接口(ccnxNetDeviceFace)、用于节点间覆盖通信的网络层接口(ccnxIpv4Face 和 ccnxIpv6Face)和传输层接口(ccnxTcpFace 和ccnxUdpFace),以及用于节点内通信的应用层接口(ccnxAppFace)。

接口(Face)中定义了如下的方法:

  • SendImpl:该方法用于将数据包从 NDN协议传递给底层的协议。
  • RegisterProtocolHandler:该方法用于将底层的数据包转发给上层的 NDN
    协议栈。
  • SetMetric/ GetMetric:设置和获取用于路由计算的指标。
  • IsUp/SetUp:检查接口是否开启;启用接口。

Content Store

ndnSIM 将 Content Store 设计成接口的形式,这样 ndnSIM 开发人员或者其他研究者可以方便地添加新的 Content Store实现,新实现中可以采用不同的索引和查询方法、不同的块大小、不同的替换策略等。 目前的 Content Store是用Trie树来实现 Data 查询,替换策略采用 LRU。目前Content Store支持的方法有添加、查询 Data,尚不支持显式地删除 Data包。

PIT

PIT(ccnxPit)维护每个被转发的 Interest 的状态,以便收到相应的响应 Data时正确地转发回去。每个 PIT项包括了以下内容:

  • 所转发 Interest 的name
  • 所有同名 Interest 的来源接口列表,也就是传入该 Interest 的接口列表;外加相关信息,比如 Interest 传入的时间。
  • 所有同名 Interest 的传出接口列表,以及相关信息,比如 Interest 传出时间,重传次数等。
  • 该PIT项过期时间,它等于所有同名 Interest 中最长的存活时间。

PIT提供了两种索引,一种用名字 hash 实现名字快速查询,另一种是根据过期时间建立的索引,使用它可以方便地删除超时的 Interest。

FIB

FIB(ccnxFib)记录了每个名字前缀的转发接口,以供转发策略在决定如何转发 Interest 时使用。FIB 是用一个哈希表实现的,其中每一项包含一个名字前缀,以及相应的转发接口列表。转发接口列表的排列顺序综合考虑了接口(Face)的路由指标,以及数据平面的反馈。根据数据平面的反馈,ndnSIM 采用绿、黄、红三种颜色来标记每个 Face的状态:绿色表示该 Face 可以正常工作;黄色表示该接口的状态未知,可能是新添加的或者已经长时间没使用过;红色表示该接口不能正常工作。开始,所有的接口都被设定为黄色。后续通过 Data 包和 Nack Interest 的回复响应,设置接口的颜色。

FIB 的传播

ndnSIM 目前提供两种方式来传播 FIB。第一种是手动添加,第二种是使用全局路由控制器来自动计算。使用第一种方式,人们可以完全控制每个 FIB 中的内容,比较适合小规模的模拟,但对于大规模的模拟来说不太现实。第二种方式需要借助一个全局的路由控制器,它可以获取所有安装了 NDN协议栈的节点中的FIB 信息,然后用图算法计算每两个节点之间的最优路径。这种方式不仅在模拟开始之前可以传播 FIB,在模拟过程中也可以更新 FIB。