首页 > 编程语言 >NS-3源码学习(一)

NS-3源码学习(一)

时间:2023-11-13 21:01:43浏览次数:59  
标签:ns ns3 device1 device2 学习 源码 NS pointToPoint

NS-3源码学习(一)

NS-3项目的源码包装的非常严密,对于仿真来说仅需要使用helper函数即可完成环境的配置。但是这种封装简直是解析ns-3数据传输的过程的一座大山。想要用传统的单步调试的方案去观察数据的流向更是寄,各种回调函数满天飞。没办法,只能从源码入手,一点点褪下这层helper函数外衣。

写本篇笔记的时候本人仅研究了ns-3中最简单的传输模型:PointToPoint的mac层的传输情况。研究层次如此的浅薄一是因为我是因为要研究802.11协议而去学习ns-3,802.11协议仅涉及mac层和phy层的设计;二是就研究了一天,让我去看更复杂的模型我也看不懂。

环境配置:

本篇笔记使用的ns-3版本号为ns-3.40,系统为安装在vmware虚拟机中的Ubuntu22.04.3LTS,研究的代码为ns-allinone-3.40/ns-3.40/examples/tutorial/first.cc文件,

  1. 将该文件拷贝至ns-allinone-3.40/ns-3.40/scratch/路径下

  2. 打开文件,控制台运行./ns3即可编译/scratch路径下的文件

  3. 使用./ns3 show targets即可查看已经编译成功的文件

  4. 使用./ns3 run <name>即可运行相应的仿真文件

源码解析

当前我们使用的互联网五层模型的结构如下,并与first.cc文件的代码相对应

img

代码中,PointToPointHelper的作用仅有:

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

NetDeviceContainer devices;
devices = pointToPoint.Install(nodes);

也就是调整链路速率,以及构建链路层的网络;剩余代码仅需要对NetDeviceContainer操作即可。

使用F12查看Install方法的内容,可以了解到其流程为:

img

剔除掉PointToPointHelper pointToPoint后代码如下:

ObjectFactory queueFactory;
queueFactory.SetTypeId("ns3::DropTailQueue<Packet>");
ObjectFactory channelFactory;
channelFactory.SetTypeId("ns3::PointToPointChannel");
channelFactory.Set("Delay", StringValue("2ms"));
ObjectFactory deviceFactory;
deviceFactory.SetTypeId("ns3::PointToPointNetDevice");
deviceFactory.Set("DataRate", StringValue("5Mbps"));
Ptr<PointToPointNetDevice> device1 = deviceFactory.Create<PointToPointNetDevice>();
device1->SetAddress(Mac48Address::Allocate());
nodes.Get(0)->AddDevice(device1);
Ptr<Queue<Packet>> queue1 = queueFactory.Create<Queue<Packet>>();
device1->SetQueue(queue1);
Ptr<PointToPointNetDevice> device2 = deviceFactory.Create<PointToPointNetDevice>();
device2->SetAddress(Mac48Address::Allocate());
nodes.Get(1)->AddDevice(device2);
Ptr<Queue<Packet>> queue2 = queueFactory.Create<Queue<Packet>>();
device2->SetQueue(queue2);
Ptr<PointToPointChannel> channel = channelFactory.Create<PointToPointChannel>();
device1->Attach(channel);
device2->Attach(channel);

NetDeviceContainer devices;
devices.Add(device1);
devices.Add(device2);

标签:ns,ns3,device1,device2,学习,源码,NS,pointToPoint
From: https://www.cnblogs.com/polariszg/p/17830148.html

相关文章

  • Error: install profile containers-default-0.50.1: generate default profile into
    Bug#2040082“errorparsingAppArmorversion”:Bugs:golang-github-containers-commonpackage:UbuntuBug#2040082“errorparsingAppArmorversion”:Bugs:golang-github-containers-commonpackage:Ubuntu......
  • OpenSSL学习(Secure Socket Layer)2023/11/13
    示例OpenSSL版本为OpenSSL3.0.215Mar2022(Library:OpenSSL3.0.215Mar2022)别搞错了!搞错容易在sm2签名验签出问题生成自签名证书opensslreq-x509-newkeyrsa:2048-keyoutmykey.pem-outmycert.pem-days365req:表示进行证书请求和生成。-x509:表示生成自......
  • openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过
    openGauss学习笔记-122openGauss数据库管理-设置密态等值查询-密态支持函数/存储过程密态支持函数/存储过程当前版本只支持sql和PL/pgSQL两种语言。由于密态支持存储过程中创建和执行函数/存储过程对用户是无感知的,因此语法和非密态无区别。密态等值查询支持函数存储过程新增系......
  • Linux 源码包安装
    SRPM包,比RPM包多了一个“S”,是“Source”的首字母,所以SRPM可直译为“源代码形式的RPM包”。也就是说,SRPM包中不再是经过编译的二进制文件,都是源代码文件。可以这样理解,SRPM包是软件以源码形式发布后直接封装成RPM包的产物。从表中可以看到,SRPM包的命名与RPM包基本类......
  • DNS——域名解析介绍
    认识DNS我们访问服务器最后都应该是一个IP地址假设我们要访问百度,我们只知道百度的域名时我们可以通过dns服务器进行解析,将www.baidu.com解析成IP地址www.baidu.com..根域.com顶级域.baidu二级域www主机名根域服务器只负责一个域名解析baidu.一级域只解析www.com.......
  • D. Counting Factorizations
    D.CountingFactorizationsTheprimefactorizationofapositiveinteger$m$istheuniquewaytowriteitas$\displaystylem=p_1^{e_1}\cdotp_2^{e_2}\cdot\ldots\cdotp_k^{e_k}$,where$p_1,p_2,\ldots,p_k$areprimenumbers,$p_1<p_2<......
  • 软件设计模式学习每日总结-第一天
    Uml类图1、分三层,从上至下分别为类名,属性,方法。2、类与类之间的关系:关联(聚合,组合)、依赖、继承、实现。3、依赖是最低耦合,继承是最高耦合。  七大原则1、开闭原则:程序代码对扩展开发,对修改关闭。2、里氏代换原则:子类可以扩展父类功能,但是不要修改父类原有的功能。3......
  • P3513 [POI2011] KON-Conspiracy
    题目描述:Byteotia的领土被占领了,国王Byteasar正在打算组织秘密抵抗运动。国王需要选一些人来进行这场运动,而这些人被分为两部分:一部分成为同谋者活动在被占领区域,另一部分是后勤组织在未被占领的领土上运转。但是这里出现了一个问题:后勤组织里的任意两人都必须是熟人,以促进合作......
  • Linux第12章学习笔记
    第十二章学习笔记块设备I/O和缓冲区管理本章讨论了块设备1O和缓冲区管理;解释了块设备I/O的原理和I/O缓冲的优点;论述了Unix的缓冲区管理算法,并指出了其不足之处;还利用信号量设计了新的缓冲区管理算法,以提高I/O缓冲区的缓存效率和性能;表明了简单的PV算法易于实现,缓存效果好,不存在......
  • 学习Android AutoMotive,开启你的车企高薪岗位之路
    前言提到Android车载,各位开发者们应该都不陌生。传统的车载功能单一,无太多娱乐性,而随着智能化时代的发展,车载系统也被赋予了在系统中预装Android应用的能力,基于Android平台的车载信息娱乐系统——AndroidAutomotive应运而生。什么是AndroidAutomotiveAndroidAutomotive是一个......