一、简单场景
仿真拓扑结构如图:三个节点之间用点对点网络相连,其中一个是ndn生产者,另一个是ndn消费者。
发送者参考应用程序使用ConsumerCbr产生以每秒10个兴趣包的速率发送生产者的兴趣包。
生产者使用Producer类,将用虚拟的有效负载数据满足所有到达的兴趣包
每个节点的转发信息库都使用默认路由填充,并且使用原有ndnsim中的内容存储结构。
// ndn-simple.cpp #include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/point-to-point-module.h" #include "ns3/ndnSIM-module.h" namespace ns3 { int main(int argc, char* argv[]) { // 设置点对点连接及信道的默认参数 Config::SetDefault("ns3::PointToPointNetDevice::DataRate", StringValue("1Mbps"));//设置数据速率 Config::SetDefault("ns3::PointToPointChannel::Delay", StringValue("10ms"));//设置时延 Config::SetDefault("ns3::DropTailQueue::MaxPackets", StringValue("20"));// // 阅读可选的命令行参数(e.g., 可视化操作 ./waf --run=<> --visualize CommandLine cmd; cmd.Parse(argc, argv); // 创建节点 NodeContainer nodes; nodes.Create(3); // 使用两条链路连接节点 PointToPointHelper p2p; p2p.Install(nodes.Get(0), nodes.Get(1)); p2p.Install(nodes.Get(1), nodes.Get(2)); // 在所有的节点上安装NDN stack ndn::StackHelper ndnHelper; ndnHelper.SetDefaultRoutes(true); ndnHelper.InstallAll(); // 选择转发策略 ndn::StrategyChoiceHelper::InstallAll("/prefix", "/localhost/nfd/strategy/multicast"); //安装应用程序 // Consumer ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr"); // 消费者将请求/前缀/ 0 /前缀/ 1,… consumerHelper.SetPrefix("/prefix"); consumerHelper.SetAttribute("Frequency", StringValue("10")); // 10 interests a second consumerHelper.Install(nodes.Get(0)); // first node // Producer ndn::AppHelper producerHelper("ns3::ndn::Producer"); // 生产者将根据开始前缀回复所有的请求 producerHelper.SetPrefix("/prefix"); producerHelper.SetAttribute("PayloadSize", StringValue("1024")); producerHelper.Install(nodes.Get(2)); // last node Simulator::Stop(Seconds(20.0)); Simulator::Run(); Simulator::Destroy(); return 0; } } // namespace ns3 int main(int argc, char* argv[]) { return ns3::main(argc, argv); } 如果该代码被放在scratch/ndn-simple.cpp中,cpp和NS-3是在调试模式下进行编译,您可以使用以下命令(在优化模式没有将打印)运行和看到你的进步的模拟: NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-simple如果没有将代码放到scratch文件夹中,则可以直接./waf configure --enable-examples运行例子
二、九节点网格实例
这个场景(ndn-grid.cpp)模拟网格拓扑结构,构造使用PointToPointLayout NS-3模块。
FIB使用 GlobalRoutingHelper(见ndnSIM助手)填充。所有节点使用NFD的内容库结构。
发送者参考应用程序使用ConsumerCbr产生以每秒100个兴趣包的速率发送生产者的兴趣包。
生产者使用Producer类,将用虚拟的有效负载数据满足所有到达的兴趣包
// ndn-grid.cpp #include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/point-to-point-module.h" #include "ns3/point-to-point-layout-module.h" #include "ns3/ndnSIM-module.h" namespace ns3 { int main(int argc, char* argv[]) { // Setting default parameters for PointToPoint links and channels Config::SetDefault("ns3::PointToPointNetDevice::DataRate", StringValue("1Mbps")); Config::SetDefault("ns3::PointToPointChannel::Delay", StringValue("10ms")); Config::SetDefault("ns3::DropTailQueue::MaxPackets", StringValue("10")); // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize CommandLine cmd; cmd.Parse(argc, argv); // Creating 3x3 topology PointToPointHelper p2p; PointToPointGridHelper grid(3, 3, p2p); grid.BoundingBox(100, 100, 200, 200); // Install NDN stack on all nodes ndn::StackHelper ndnHelper; ndnHelper.InstallAll(); // Set BestRoute strategy ndn::StrategyChoiceHelper::InstallAll("/", "/localhost/nfd/strategy/best-route"); // Installing global routing interface on all nodes ndn::GlobalRoutingHelper ndnGlobalRoutingHelper; ndnGlobalRoutingHelper.InstallAll(); // Getting containers for the consumer/producer Ptr<Node> producer = grid.GetNode(2, 2); NodeContainer consumerNodes; consumerNodes.Add(grid.GetNode(0, 0)); // Install NDN applications std::string prefix = "/prefix"; ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr"); consumerHelper.SetPrefix(prefix); consumerHelper.SetAttribute("Frequency", StringValue("100")); // 100 interests a second consumerHelper.Install(consumerNodes); ndn::AppHelper producerHelper("ns3::ndn::Producer"); producerHelper.SetPrefix(prefix); producerHelper.SetAttribute("PayloadSize", StringValue("1024")); producerHelper.Install(producer); // Add /prefix origins to ndn::GlobalRouter ndnGlobalRoutingHelper.AddOrigins(prefix, producer); // Calculate and install FIBs ndn::GlobalRoutingHelper::CalculateRoutes(); Simulator::Stop(Seconds(20.0)); Simulator::Run(); Simulator::Destroy(); return 0; } } // namespace ns3 int main(int argc, char* argv[]) { return ns3::main(argc, argv); } 三、使用拓扑插件9-node网格的例子
在9-node网格示例中,不是直接定义拓扑一样简单的场景或使用专门的助手,ndnSIM提供实验TopologyReader类的扩展版本:AnnotatedTopologyReader RocketfuelWeightsReader。
虽然RocketfuelWeightsReader是专业版旨在用于Rocketfuel拓扑和链接权重文件(稍后将提供例子),AnnotatedTopologyReader是更通常的类,它使用简单的user-readable格式。
AnnotatedTopologyReader预计以下格式:
# topo-grid-3x3.txt # any empty lines and lines starting with '#' symbol is ignored # # The file should contain exactly two sections: router and link, each starting with the corresponding keyword # # router section defines topology nodes and their relative positions (e.g., to use in visualizer) router # each line in this section represents one router and should have the following data # node comment yPos xPos Node0 NA 3 1 Node1 NA 3 2 Node2 NA 3 3 Node3 NA 2 1 Node4 NA 2 2 Node5 NA 2 3 Node6 NA 1 1 Node7 NA 1 2 Node8 NA 1 3 # Note that `node` can be any string. It is possible to access to the node by name using Names::Find, see examples. # link section defines point-to-point links between nodes and characteristics of these links link # Each line should be in the following format (only first two are required, the rest can be omitted) # srcNode dstNode bandwidth metric delay queue # bandwidth: link bandwidth # metric: routing metric # delay: link delay # queue: MaxPackets for transmission queue on the link (both directions) Node0 Node1 1Mbps 1 10ms 10 Node0 Node3 1Mbps 1 10ms 10 Node1 Node2 1Mbps 1 10ms 10 Node1 Node4 1Mbps 1 10ms 10 Node2 Node5 1Mbps 1 10ms 10 Node3 Node4 1Mbps 1 10ms 10 Node3 Node6 1Mbps 1 10ms 10 Node4 Node5 1Mbps 1 10ms 10 Node4 Node7 1Mbps 1 10ms 10 Node5 Node8 1Mbps 1 10ms 10 Node6 Node7 1Mbps 1 10ms 10 Node7 Node8 1Mbps 1 10ms 10
(ndn-grid-topo-plugin.cpp)使用AnnotatedTopologyReader 9-node实现了这个网格示例重复的场景
// ndn-grid-topo-plugin.cpp #include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/ndnSIM-module.h" namespace ns3 { int main(int argc, char* argv[]) { CommandLine cmd; cmd.Parse(argc, argv); AnnotatedTopologyReader topologyReader("", 25); topologyReader.SetFileName("src/ndnSIM/examples/topologies/topo-grid-3x3.txt"); topologyReader.Read(); // Install NDN stack on all nodes ndn::StackHelper ndnHelper; ndnHelper.InstallAll(); // Set BestRoute strategy ndn::StrategyChoiceHelper::InstallAll("/", "/localhost/nfd/strategy/best-route"); // Installing global routing interface on all nodes ndn::GlobalRoutingHelper ndnGlobalRoutingHelper; ndnGlobalRoutingHelper.InstallAll(); // Getting containers for the consumer/producer Ptr<Node> producer = Names::Find<Node>("Node8"); NodeContainer consumerNodes; consumerNodes.Add(Names::Find<Node>("Node0")); // Install NDN applications std::string prefix = "/prefix"; ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr"); consumerHelper.SetPrefix(prefix); consumerHelper.SetAttribute("Frequency", StringValue("100")); // 100 interests a second consumerHelper.Install(consumerNodes); ndn::AppHelper producerHelper("ns3::ndn::Producer"); producerHelper.SetPrefix(prefix); producerHelper.SetAttribute("PayloadSize", StringValue("1024")); producerHelper.Install(producer); // Add /prefix origins to ndn::GlobalRouter ndnGlobalRoutingHelper.AddOrigins(prefix, producer); // Calculate and install FIBs ndn::GlobalRoutingHelper::CalculateRoutes(); Simulator::Stop(Seconds(20.0)); Simulator::Run(); Simulator::Destroy(); return 0; } } // namespace ns3 int main(int argc, char* argv[]) { return ns3::main(argc, argv); } 如您所见,场景代码变得更加紧凑和可读性更好。AnnotatedTopologyReader拓扑节点提供两种方法来访问。首先,您可以使用方法AnnotatedTopologyReader:GetNodes()返回NodeContainer。另外,节点可以访问使用名字的名字::找到(“nodename”)调用,在上面的例子中。为此,ndnsim:AnnotatedTopologyReader自动注册所有创建的节点拓扑文件中指定的名称。
关于名字类的更多信息,请参阅NS-3文档。如果拓扑文件放置到src / ndnSIM / /拓扑/ topo-grid-3x3例子。txt和代码放入scratch/ ndn-grid-topo-plugin。cpp,您可以运行和看到你的进步的模拟使用以下命令(在优化模式没有将打印):
NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-grid-topo-plugin