本文参考实验室的师兄们留下的文档,详细介绍如何在兴趣包与数据包内添加字段以实现自定义的缓存与转发策略。
版本信息如下:
操作系统:Ubuntu 16.04
ndnSIM:ndnSIM-2.1
ns-3-dev:ns-3.23-dev-ndnSIM-2.1
在兴趣包中添加字段
我们以在兴趣包中添加跳数字段Hops和途径端口字段Faces为例:Hops是整型,初始值为0,每经过一个路由节点,该字段的值加1;Faces是字符串,用以记录兴趣包途径路由节点的入端口号(此处应该是一个数组,但是目前ndnSIM不支持数组的编码与解码,因此用带有空格的字符串代替,比如:“251 252 252”)。
此部分需要修改三个文件:tlv.hpp、interest.hpp与interest.cpp。
修改tlv.hpp
路径:ndnSIM/ndn-cxx/src/encoding/tlv.hpp
1. 对新字段Hops与Faces设置编码
选择一个与其他编码不同的数字即可,此处选择Hops选择33,Faces选择34。
修改interest.hpp
路径:ndnSIM/ndn-cxx/src/interest.hpp
1. 在Interest类中添加私有属性
private:
int m_hops;
std::string m_faces;
此处跳数字段是整型int
,途径端口属性为字符串std::string
。
2. 在Interest类中分别添加公有set与get方法
public:
const int&
getHops() const{
return m_hops;
}
Interest&
setHops(const int& h){
m_hops = h;
m_wire.reset();
return *this;
}
const std::string&
getFaces() const{
return m_faces;
}
Interest&
setFaces(const std::string& f){
m_faces = f;
m_wire.reset();
return *this;
}
修改interest.cpp
路径:ndnSIM/ndn-cxx/src/interest.cpp
1. 在wireEncode方法中添加编码代码
totalLength += prependNonNegativeIntegerBlock(encoder, tlv::Hops, getHops());
totalLength += prependStringBlock(encoder, tlv::Faces, getFaces());
2. 在wireDecode方法中添加解码代码
val = m_wire.find(tlv::Hops);
if (val != m_wire.elements_end()) {
m_hops = readNonNegativeInteger(*val);
}
val = m_wire.find(tlv::Faces);
if (val != m_wire.elements_end()) {
m_faces = readString(*val);
}
在数据包中添加字段
数据包中添加字段的方式与兴趣包中添加字段的方式相同,需要修改的三个文件是:tlv.hpp、data.hpp与data.cpp。
测试
测试代码
为了体现添加效果,首先在原有的示例代码ndn-simple.cpp(路径:ndnSIM/examples/ndn-simple.cpp)中新增一个节点(3个变为4个),拓扑结构为节点0、1、2、3串联,节点0上安装用户(Consumer),节点3上安装服务器(Provider)。
然后修改ndn-consumer.cpp(路径:ndnSIM/apps/ndn-consumer.cpp),在SendPacket方法中初始化新增的Hops和Faces字段。
最后修改forwarder.cpp(路径:ndnSIM/NFD/daemon/fw/forwarder.cpp),在onIncomingInterest方法中添加对Hops和Faces字段的操作,即兴趣包每经过一个路由节点,其Hops字段加1,Faces字段的尾部添加当前节点的入端口号。为了方便观察,将以上操作后Hops和Faces字段的值用cout
打印出来。
测试效果
在终端里运行ndn-simple.cpp,可以看到如下打印信息:
可以看出Hops和Faces字段已添加成功,Hops每经过一个节点都会加1,而Faces每经过一个节点都会多一个当前节点的入端口号。