首页 > 其他分享 >ns-3_ Day1

ns-3_ Day1

时间:2022-12-18 16:11:56浏览次数:35  
标签:ns p2pNodes CSMA module Day1 include nCsma ns3

一些概念

在Day0中,通过ns-3提供的 first.cc 我们了解了几个仿真过程中涉及的概念。ns-3的主体概念有下列5个:

  1. node 在网络模拟中,实际上就是“terminal/host”的概念。
  2. application 需要被仿真的用户程序,这也是开发的主要部分。
  3. channel 网络中数据流流过的媒介,连接各个节点。
  4. net_device node需要安装net_device才能参与网络连接
  5. topology_helper 建立每种网络的拓扑结构时有对应的helper辅助

除此之外,对于一个仿真系统来说,数据的收集和统计也是核心的功能,对此ns-3有以下系统:

  • Logging 在 fitst.cc 中可以看到几处 LogComponent 的设置,设置后会在运行时给出log信息,帮助调试脚本和分析网络运行。
  • 命令行 在 first.cc 中还可以看到 CommandLine,通过这个类可以解析命令行参数。
  • Tracing 收集过程数据主要依靠的就是Tracing系统,这个机制嵌入到topology_helper中,直接使用即可
    • ASCII Tracing 产生ASCII格式的文档
    • PCAP Tracing 产生 .pcap 后缀的文件,可以被诸如 Wireshark 的软件解析。

另一个仿真脚本

下面是一个比 Day0 中复杂一些的脚本,位于:

examples/tutorial/second.cc

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/csma-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"
#include "ns3/ipv4-global-routing-helper.h"

using namespace ns3;

NS_LOG_COMPONENT_DEFINE ("SecondScriptExample");

int 
main (int argc, char *argv[])
{
	// 决定是否开启2个UdpApplication的Logging组件
  bool verbose = true;
	// LAN中还有3个node
  uint32_t nCsma = 3;

  CommandLine cmd (__FILE__);
  cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);
  cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose);

  cmd.Parse (argc,argv);

  if (verbose)
    {
      LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
      LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
    }

  nCsma = nCsma == 0 ? 1 : nCsma;

	// 先创建网络结构中的P2P部分
  NodeContainer p2pNodes;
  p2pNodes.Create (2);
	// 再创建网络结构中的CSMA部分
  NodeContainer csmaNodes;
  csmaNodes.Add (p2pNodes.Get (1));
  csmaNodes.Create (nCsma);

  PointToPointHelper pointToPoint;
  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

  NetDeviceContainer p2pDevices;
  p2pDevices = pointToPoint.Install (p2pNodes);

  CsmaHelper csma;
  csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));
  csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560)));

  NetDeviceContainer csmaDevices;
  csmaDevices = csma.Install (csmaNodes);

  InternetStackHelper stack;
  stack.Install (p2pNodes.Get (0));
  stack.Install (csmaNodes);

  Ipv4AddressHelper address;
  address.SetBase ("10.1.1.0", "255.255.255.0");
  Ipv4InterfaceContainer p2pInterfaces;
  p2pInterfaces = address.Assign (p2pDevices);

  address.SetBase ("10.1.2.0", "255.255.255.0");
  Ipv4InterfaceContainer csmaInterfaces;
  csmaInterfaces = address.Assign (csmaDevices);
	
	// 至此网络结构搭建完成,开始安装应用

  UdpEchoServerHelper echoServer (9);
	// 把server应用安装在CSMA网段的“最后”一个节点上
  ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (nCsma));
  serverApps.Start (Seconds (1.0));
  serverApps.Stop (Seconds (10.0));

  UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);
  echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
  echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
  echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

	// 最后的c-s过程发生在P2P网段和CSMA网段的2个node上
  ApplicationContainer clientApps = echoClient.Install (p2pNodes.Get (0));
  clientApps.Start (Seconds (2.0));
  clientApps.Stop (Seconds (10.0));

	// 全局路由管理器根据节点产生的链路报告为每个节点建立路由表
  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

	// 开启pcap tracing
  pointToPoint.EnablePcapAll ("second");
  csma.EnablePcap ("second", csmaDevices.Get (1), true);

  Simulator::Run ();
  Simulator::Destroy ();
  return 0;
}

这个脚本的工作流程大致如下:

       10.1.1.0
 n0 -------------- n1   n2   n3   n4
    point-to-point  |    |    |    |
                    ================
                      LAN 10.1.2.0
  1. n0发出packet,经 10.1.1.0 网段送达n1
  2. packet在n1的CSMA接口发出,这里需要ARP协议找到n4的MAC地址
  3. n1会在CSMA上广播寻找指定IP地址的设备,n4作出正面应答
  4. 同理,n4要想回发echo packet时(它知道n0不在CSMA上,因为初始化了全局路由),也先广播获知n1的MAC,先从CSMA发给n1再从P2P网络发送给n0。

标签:ns,p2pNodes,CSMA,module,Day1,include,nCsma,ns3
From: https://www.cnblogs.com/leewaytang/p/16990496.html

相关文章

  • 计组学习06——RISC-V Functions
    有点发烧,唔,不过还是坚持学下来了,新冠让人静心.计组学习——RISC-VFunctionsLoadingSignExtension假如内存里的字节是这样:0b11111110(-2)当我们使用loadbyte指令......
  • docker部署jenkins
    docker部署jenkins1、拉取镜像dockerpulljenkins/jenkins:jdk112、启动容器dockerrun--namejenkins-p8120:8080jenkins/jenkins:jdk113、一直下一步安装即......
  • Python-批量计算城市热岛强度(Urban Heat Island Intensity, UHII)
    数据准备城市热岛强度(UrbanHeatIslandIntensity,UHII)表示热岛效应的发生程度,在本文中将UHII定义为建成区块平均地表温度与其缓冲区平均地表温度的差值.计算公式......
  • Windows给pip换源极大提高pip install速度
    1.打开appdata文件夹,在资源管理器的地址栏输入%appdata%后回车,  或者win+r打开命令运行,然后输入%appdata%也可以到该文件目录2.新建文件夹和文件新建一个名为pip的......
  • Linux syscall setns
    setns调用可以用来加入现有进程的namespace函数原型#define_GNU_SOURCE/*Seefeature_test_macros(7)*/#include<sched.h>intsetns(intfd,intnstype)......
  • 【机器学习】李宏毅——Transformer
    Transformer具体就是属于Sequence-to-Sequence的模型,而且输出的向量的长度并不能够确定,应用场景如语音辨识、机器翻译,甚至是语音翻译等等,在文字上的话例如聊天机器人、文章......
  • CSharp: Chain of Responsibility Pattern in donet core 6
     usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceGeovin.Du.DuChainOfResponsib......
  • day1 Markdown
    day1Markdown学习标题:一级标题='#'+'空格'+标题名字二级标题='##'+'空格'+标题名字三级、四级依次类推字体(改变字体的大小和形状)粗体"**"+"内容"+“**"(前后两......
  • [攻防世界][江苏工匠杯]unseping
    打开靶机对应的url上来就是代码审计<?phphighlight_file(__FILE__);classease{private$method;private$args;function__construct($method,......
  • 1. ansible学习总结: 基础模块
    copy模块:#传输文件到目标机 ansible-i/kingdee/ansible/hostall-mcopy-a'src=/tmp/aaaa.tgzdest=/tmp/aaaa.tgz'cron模块: #创建任务 ansible-i/kingdee/ans......