NDN helper 学习记录
经过这段时间对官方文档的学习和理解,把对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 学习记录的更多相关文章
- leveldb 学习记录(三) MemTable 与 Immutable Memtable
前文: leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice 存储格式: leveldb数据在内存中以 Memtable存储(核心结构是skiplist 已介绍 ...
- Spring 学习记录6 BeanFactory(2)
主题 除了Spring 学习记录5 BeanFactory 里写的几个接口外,BeanFactory的实现类还实现了一些其他接口,这篇文章主要介绍这些接口和实现类. 结构 DefaultListabl ...
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
- UWP学习记录12-应用到应用的通信
UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...
- UWP学习记录11-设计和UI
UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...
- UWP学习记录10-设计和UI之控件和模式7
UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...
- UWP学习记录9-设计和UI之控件和模式6
UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...
随机推荐
- 喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了
折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...
- 世界地图展开图,来自 Simon's World Map
Simon's World Map 软件下载地址:https://www.dit-dit-dit.com/Blog/PostId/42/simons-world-map
- Linux 笔记 - 第十四章 LAMP 之(一) 环境搭建
博客地址:http://www.moonxy.com 一.前言 LAMP 是 Linux Apache MySQL PHP 的简写,即把 Apache.MySQL 以及 PHP 安装在 Linux 系 ...
- Spring boot 自定义banner的在线制作
目前工作不是很忙,利用闲暇的时间,在给自己不断地充电,提升自己的技术实力. 目前在做一个基于Spring Boot2.x+webmagic+quartz的爬虫项目[hotDog]https://git ...
- Python集训营45天—Day07 (面向对象编程进阶)
目录 1. @property装饰器 2. 魔法方法 3. 类属性和实例属性 4.静态方法和类方法 5. 单继承和多继承 6. 多态 7. del 方法 序言:上个章节我们了解了面向对象的基础知识,这 ...
- java数据结构——数组(Array)
数据结构+算法是我们学习道路上的重中之重,让我们一起进步,一起感受代码之美! /** * 让我们从最基本的数据结构——数组开始吧 * 增.删.改.查.插.显示 */ public class Seql ...
- 远古框架-SSH maven配置 (包含gson)
Spring3.2.17+Struts2.3.15+Hibernate3.6.10 <?xml version="1.0" encoding="UTF-8" ...
- SPN扫描
0x01介绍 Kerberos是一种支持票证身份验证的安全协议.如果客户端计算机身份验证请求包含有效的用户凭据和服务主体名称 (SPN),则 Kerberos 身份验证服务器将授予一个票证以响应该请求 ...
- gcc编译命令总结
一步到位编译:gcc hello.c -o hello 预处理 -E (.i) 编译 -S (.s) 汇编-c (.o) 连接-o 预处理 gcc -E hello.c -o hello.i -E:仅 ...
- mybatis list条件判断
<if test="userIds != null and userIds.size > 0"> AND user_id in <foreach colle ...