ndnSIM模块——helpers

来源:互联网 发布:俄罗斯网络裸体内衣秀 编辑:程序博客网 时间:2024/05/19 09:11

helpers是ndnSIM模块中非常重要的一部分,特别是在编写仿真场景的时候。

一、NDN栈的helpers
StackHelper用于在需要的节点安装ndnSIM网络栈,同时提供了一种简单的方法配置NDN仿真环境的几个重要参数。

StackHelper ndnHelper;NodeContainer nodes;...ndnHelper.Install(nodes);

二、Routing
所有的转发策略需要知道该向何处转发Interest分组,即需要安排好FIB表。
注:在默认情况下,所有的NDN节点的FIB表都是空的,具体设置FIB表的时候要不就手工配置路由,要不就设置全局路由控制器,要不就启用默认路由(不推荐)。
(1)手工配置路由——FibHelper
FIB helper 与NFD中的FIB管理单元之间的交互,是通过前者向后者发送专门的Interest命令完成的,可以实现向FIB条目中添加/删除下一跳,或向FIB表中手动添加路径。

向FIB表中手动添加一条路径。

Ptr<Node> node = ...     // some nodestd::string prefix = ... // some prefixPtr<ndn::Face> face = ... // NDN face that belongs to the node and through which prefix is accessibleint32_t metric = ...     // some routing metric// Define parameters aboveFibHelper::AddRoute(node, prefix, face, metric);//AddRoute() has few other overloads that can be used

(2)自动配置最短路径——GlobalRoutingHelper
GlobalRoutingHelper 的使用,简化了ndnSIM中建立大规模拓扑时对FIB表的配置工作,与 Ipv4GlobalRoutingHelper 的思想是类似的。
以下是使用全局路由控制器的几个关键步骤:

  • 为节点安装特定的接口
NodeContainer nodes;...GlobalRoutingHelper ndnGlobalRoutingHelper;ndnGlobalRoutingHelper.Install(nodes);
  • 指定内容源,即可以为Data分组分配命名前缀的节点

(利用GlobalRoutingHelper::AddOrigins()

Ptr<Node> producer; // producer node that exports prefixstd::string prefix; // exported prefix...ndnGlobalRoutingHelper.AddOrigins(prefix, producer);
  • 调用函数计算并为每一个节点的FIB表填充条目

(利用GlobalRoutingHelper::CalculateRoutes()

GlobalRoutingHelper::CalculateRoutes();//计算并得出每一个节点的最短路径树,并将路径加入所有的命名前缀中

三、转发策略
ndnSIM2.0与NFD在转发策略的命名空间上的操作非常相似,都允许不同的命名空间与不同的转发策略相对应(即命名空间的设置可以与转发策略命名是无关的)。默认情况下,转发策略的配置定义如下:
转发策略的配置定义

转发策略的设置可以通过 Strategy Choice helper 进行。Strategy Choice helper 与NFD的转发策略选择管理单元之间的信息交互,是通过发送特定的Interest命令进行的,操作可以实现为单个、多个以及网络拓扑上的所有节点,为所需的转发策略指定命名前缀。
操作方法是:

StrategyChoiceHelper::Install(nodes, prefix, strategyName);//单个或者多个节点
StrategyChoiceHelper::InstallAll(prefix, strategyName);//所有的节点

四、内容存储
ndnSIM利用了NFD的内容存储模块,存储的最大容量可以通过StackHelper::setCsSize() 指定。

ndnHelper.setCsSize(<max-size-in-packets>);//以Data分组的数量定义内容存储的大小,默认的容量上限是100个Data分组...ndnHelper.Install(nodes);

NFD的内容存储充分考虑并利用了Interest分组选择器,但是当与缓存替代策略相比较时却显得不够灵活。增加NFD中内容存储单元的灵活性是当前正在进行的开发工作(查了一下应该是完成了,已经为CS开发了LRU策略,PS. http://ndnsim.net/2.0/helpers.html)。当时,为了提高CS的灵活性,ndnSIM1.0版本暂时性地加入了新的内容,尤其是添加了几种不同的缓存替代策略,但是与原来NFD中的CS单元相比,对Interest分组选择器的支持却下降了。如果仿真场景对于分组选择器的处理要求比较高的话,最好不要使用ndnSIM1.0的操作方式。
调用ndnSIM1.0版本设置CS的方法SetOldContentStore()

ndnHelper.SetOldContentStore("<content store implementation>",                            ["<optional parameter>", "<optional parameter's value>" [, ...]]);...ndnHelper.Install (nodes);

注:具体仿真的时候,可以在已安装了的内容存储单元中,通过 <content store implementation> 选择自己想要的,或者安装自己设计的内容存储单元。

  • PS.NFD 的 内容存储单元 介绍

当前NFD模块的CS单元采用跳跃链表(Skip List)作为其底层的数据结构。跳跃链表是一种随机化的数据结构,效率可以比拟二叉查找树,而且更简单,占用的空间更少。(具体可以参照维基百科,https://en.wikipedia.org/wiki/Skip_list)
CS中存储内容的删除基于具有优先级的FIFO策略,最先被移除的CS存储内容是不经请求到来的Data分组,这些Data分组是随机存储在CS中的,而不是响应了相应Interest分组回传的内容。然后,超时没有更新的Data分组将会被移除。最后,剩下的其他Data分组,在CS缓存容量达到上限时,将会按照基本的FIFO原则依次被移除。
NFD的CS操作方法(网站上只给出了对CS**容量**的操作方法):
(1)可以使用 StackHelper::setCsSize() 方法设置NFD的CS容量:

ndnHelper.setCsSize(<max-size-in-packets>);...ndnHelper.Install(nodes);

(2)在所有的 节点上禁用NFD的CS:
(设置CS的最小容量,为1,注:如果将容量设置为0,将会认为使用了旧版本CS)

ndnHelper.setCsSize(1);...ndnHelper.Install(nodes);

(3)设置:节点1CS容量100,节点2容量1000,其他所有节点容量2000:

/***********NODE1**************/ndnHelper.setCsSize(100);ndnHelper.Install(node1);/***********NODE2*************/ndnHelper.setCsSize(1000);ndnHelper.Install(node2);/********OTHER NODES**********/NodeContainer allOtherNodes;for (NodeList::Iterator i = NodeList::Begin(); i != NodeList::End(); ++i) {  if (*i != node1 && *i != node2) {    allOtherNodes.Add(*i);  }}ndnHelper.setCsSize(2000);//这是我自己加的 = =ndnHelper.Install(allOtherNodes);

每一条CS条目包括:
(1)Data分组
(2)标志,标识Data分组是否是响应Interest分组而来的
(3)时间戳,标识Data分组是否已经久不更新而过期

CS中有两种容器Container,其一是跳跃列表Container,其二是多重索引Container(multi-index container)。多重索引Container的存在目的是支持具有优先级的FIFO缓存替代策略,container中按特定顺序保存着指向Data分组的指针Pointer。而跳跃列表Container中保存的是CS条目的索引。
依靠多重索引Container可以实现对Data分组的多种操作,包括非请求的Data分组的移除,Data分组的添加以及CS容量到达上限时对相应分组的移除等。(Cs::CleanupIndex Cs::insert Cs::evictItem

最后,关于旧版本的CS,可用CS模型详见网站吧,PS. http://ndnsim.net/2.0/cs.html#content-store 最下面

五、应用助手
应用助手简化了创建、配置和安装ndnSIM应用程序的操作。
(应用程序 应该 相当于内容源)
(1)创建特定应用类的助手

// Create helper for the consumer generating Interests with constant rateAppHelper consumerHelper("ns3::ndn::ConsumerCbr");

(2)指定应用程序所产生内容的命名前缀AppHelper::SetPrefix()

consumerHelper.SetPrefix(prefix);

(3)指定特定应用程序的属性AppHelper::SetAttribute()

// Set frequency parameterconsumerHelper.SetAttribute("Frequency", StringValue ("10")); // 10 interests a second

(4)为节点安装应用程序

NodeContainer nodes;...consumerHelper.Install(nodes)

六、链路控制助手
在一些仿真场景下,需要模拟NDN节点之间的链路故障,但是NS-3没有方法让原本正常的节点之间出现故障。不过,NS-3提供了另外一个思路,允许建立一个故障的模型模拟链路中包丢失的场景,在节点之间的链路上合理地使用故障模型,可以实现对链路故障的仿真和评估。
ndn::LinkControlHelper 方法可以实现链路的故障和故障恢复

#include "ns3/ndnSIM/helper/ndn-link-control-helper.hpp"...Simulator::Schedule(Seconds(10.0), ndn::LinkControlHelper::FailLink, node1, node2);Simulator::Schedule(Seconds(15.0), ndn::LinkControlHelper::UpLink, node1, node2);

例:
Simple scenario with link failures
http://ndnsim.net/2.0/examples.html#simple-scenario-with-link-failures


注:以上内容翻译总结自 http://ndnsim.net/2.0/helpers.html

2 0