经过这段时间对官方文档的学习和理解,把对helper内容的学习记录下来,方便后续查看,如有错误,欢迎指正。

1、StackHelper 主要用于在请求的节点上安装ndnSIM网络堆栈, 提供一种简单的方法来配置NDN模拟的几个重要参数。(官方解释)

  其实就是给结点装上堆栈

方法:

全部结点一次性安装(比较常用)
ndn::StackHelper ndnHelper;
ndnHelper.InstallAll(); 分别给结点安装,三种方式(通常用不到)
install(const std::string &nodeName) 结点名
install(Ptr< Node > node) 结点
install(const NodeContainer &c) 结点容器 例1,通过结点容器创建的结点,利用get获得:
// Creating nodes
NodeContainer nodes;
nodes.Create(3);
ndn::StackHelper ndnHelper;
ndnHelper.Install(nodes.Get(0));
ndnHelper.Install(nodes.Get(1));
ndnHelper.Install(nodes.Get(2));
例2,在拓扑txt文件中创建的结点,直接寻名获得结点,注意寻名这个方式必须是在txt已经定义好了结点名,如果是例一这种创建结点的方式,是无法通过寻名的

AnnotatedTopologyReader topologyReader("", 25);
topologyReader.SetFileName("../ns-3/src/ndnSIM/examples/topologies/topo-grid-3x3.txt");
topologyReader.Read();

// Install NDN stack on all nodes
ndn::StackHelper ndnHelper;
ndnHelper.Install(Names::Find<Node>("Node0"));
ndnHelper.Install(Names::Find<Node>("Node1"));
ndnHelper.Install(Names::Find<Node>("Node2"));
ndnHelper.Install(Names::Find<Node>("Node3"));

2、FIB Helper,默认情况下,所有节点的FIB为空。您需要手动配置路由,使用全局路由控制器,或者(不建议)启用默认路由。

两种方式:

(1)手动路由

    通过以添加/从FIB表项中删除的下一跳或添加路由手动将FIB(FIB的手动配置)发送特殊兴趣命令给NFD的FIB管理器交互

官方内容:
Ptr<Node> node = ... // some node
std::string prefix = ... // some prefix
Ptr<ndn::Face> face = ... // NDN face that belongs to the node and through which prefix is accessible
int32_t metric = ... // some routing metric
FibHelper::AddRoute(node, prefix, face, metric); 实际应用:
ndn::FibHelper::AddRoute("c1", "/data", "n1", ); // link to n1
其中c1和n1是在拓扑文件中定义的结点名,/data是前缀,

(2)自动最短路径路由

  为了简化大型拓扑中的FIB管理,ndnSIM包含一个全局路由控制器。

  为了利用全局路由控制器,有几个必要步骤:

、在节点上安装特殊接口
NodeContainer nodes;
GlobalRoutingHelper ndnGlobalRoutingHelper;
ndnGlobalRoutingHelper.Install(nodes); 、指定哪个节点导出哪个前缀
Ptr<Node> producer; // producer node that exports prefix
std::string prefix; // exported prefix
ndnGlobalRoutingHelper.AddOrigins(prefix, producer); 3、在每个节点上计算和安装FIB
GlobalRoutingHelper::CalculateRoutes(); 示例见:
https://ndnsim.net/current/examples.html 中9-node grid example

3、StrategyChoiceHelper  转发策略

可以指定单个或全部结点设置转发策略

单个结点
StrategyChoiceHelper::Install(nodes, prefix, strategyName);
全部结点
StrategyChoiceHelper::InstallAll(prefix, strategyName); 示例
ndn::StrategyChoiceHelper::InstallAll("/", "/localhost/nfd/strategy/best-route");

4、Content Store 内容存储

ndnSIM使用NFD的内容存储实现。

(1)可以使用StackHelper :: setCsSize()来控制其最大大小

除非在模拟方案中指定,否则内容存储库的默认最大大小为100个数据包。

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

(2)使用ndnHelper.setPolicy(<replacement-policy>)设置节点的缓存策略;

官网实例,足够理解
要在节点1上设置CS大小100,在节点2上设置大小1000,在所有其他节点上设置大小2000。节点1的LRU替换策略,其余部分的优先级FIFO:
ndnHelper.setCsSize();
ndnHelper.setPolicy("nfd::cs::lru");
ndnHelper.Install(node1); ndnHelper.setCsSize();
ndnHelper.setPolicy("nfd::cs::priority_fifo");
ndnHelper.Install(node2); NodeContainer allOtherNodes;
for (NodeList::Iterator i = NodeList::Begin(); i != NodeList::End(); ++i) {
if (*i != node1 && *i != node2) {
allOtherNodes.Add(*i);
}
}
ndnHelper.Install(allOtherNodes);

缓存策略调用官网给的算法有两种方式:

  一种是新版的setPolicy,有两种算法:LRU,FIFO

  一种是旧版的SetOldContentStore,有多种算法,具体参考官网给出。

5、AppHelper 用来创建应用程序,也就是我们我们所说的消费者和生产者

1、为特定的应用程序类创建helper:
// Create helper for the consumer generating Interests with constant rate
AppHelper consumerHelper("ns3::ndn::ConsumerCbr"); 2、使用AppHelper :: SetPrefix()分配在其上运行应用程序的前缀(使用此名称生成兴趣或为此名称满足兴趣):
consumerHelper.SetPrefix(prefix); 3、使用AppHelper :: SetAttribute()分配应用程序特定的属性:
// Set frequency parameter
consumerHelper.SetAttribute("Frequency", StringValue ("")); // 10 interests a second 4、在一个或多个节点上安装应用程序:
NodeContainer nodes;
...
consumerHelper.Install(nodes)
这里只是一个简单的官方示例,具体的内容我会在后面的博客中提到

6、LinkControlHelper 某些情况要求NDN节点之间的某些链接在某些时间失败。NS-3不提供实际“断开”节点之间链接的功能。但是,它提供了建立损耗模型以模拟通道中数据包丢失的便利。在点对点链路的两侧使用正确设置的损耗模型,可以模拟链路断开。

允许调度链接故障和故障恢复

#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);

NDN helper 学习记录的更多相关文章

  1. leveldb 学习记录(三) MemTable 与 Immutable Memtable

    前文: leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice 存储格式: leveldb数据在内存中以 Memtable存储(核心结构是skiplist 已介绍 ...

  2. Spring 学习记录6 BeanFactory(2)

    主题 除了Spring 学习记录5 BeanFactory 里写的几个接口外,BeanFactory的实现类还实现了一些其他接口,这篇文章主要介绍这些接口和实现类. 结构 DefaultListabl ...

  3. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  4. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  5. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  6. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  7. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  8. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

  9. UWP学习记录9-设计和UI之控件和模式6

    UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...

随机推荐

  1. Redis 的底层数据结构(字典)

    字典相对于数组,链表来说,是一种较高层次的数据结构,像我们的汉语字典一样,可以通过拼音或偏旁唯一确定一个汉字,在程序里我们管每一个映射关系叫做一个键值对,很多个键值对放在一起就构成了我们的字典结构. ...

  2. 论文阅读 | DeepDrawing: A Deep Learning Approach to Graph Drawing

    作者:Yong Wang, Zhihua Jin, Qianwen Wang, Weiwei Cui, Tengfei Ma and Huamin Qu 本文发表于VIS2019, 来自于香港科技大学 ...

  3. elasticsearch Discovery 发现模块学习

    发现模块和集群的形成 目标 发现节点 Master选举 组成集群,在Master信息发生变化时及时更新. 故障检测 细分为几个子模块 Discovery发现模块 Discover是在集群Master节 ...

  4. 跟我学SpringCloud | 第十八篇:微服务 Docker 化之基础环境

    1. 容器化 Docker 的横空出世,给了容器技术带来了质的飞跃,Docker 标准化了服务的基础设施,统一了应用的打包分发,部署以及操作系统相关类库等,解决了测试生产部署时环境差异的问题.对于运维 ...

  5. maven的mirror和repository加载顺序

    一.概述 maven的settings.xml文件里面有proxy.server.repository.mirror的配置,在配置仓库地址的时候容易混淆 proxy是服务器不能直接访问外网时需要设置的 ...

  6. [Leetcode][动态规划] 第935题 骑士拨号器

    一.题目描述 国际象棋中的骑士可以按下图所示进行移动:                           我们将 “骑士” 放在电话拨号盘的任意数字键(如上图所示)上,接下来,骑士将会跳 N-1 步 ...

  7. Spring框架学习笔记(2)——面向切面编程AOP

    介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...

  8. SQL Server 内存优化表的索引设计

    测试的版本:SQL Server 2017 内存优化表上可以创建哈希索引(Hash Index)和内存优化非聚集(NONCLUSTERED)索引,这两种类型的索引也是内存优化的,称作内存优化索引,和基 ...

  9. 导出wordpress数据库Fatal error: Cannot 'break' 2 levels

    今天我打算备份一下我在Linux下用宝塔面板搭建的phpmyadmin导出wordpress数据库.选择数据库后给我一个Fatal error: Cannot 'break' 2 levels in ...

  10. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(协程池版)

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from gevent import monkey monkey.patch_all() from gevent.pool i ...