ns3学习记录(二):核心概念&可视化依赖安装&first.cc

参考博客

ns-3脚本初识——点对点有线网络:first脚本
【ns-3】打开PyViz可视化工具

一、 ns3抽象概念

1 节点 Node

在ns-3中,基本的计算设备抽象被称为节点,可以看做是可以添加各种功能的计算机,由 C++中的 Node 类来描述。Node类提供了用于管理仿真器中网络组件表示的各种方法。

2 应用程序 Application

运行在Node内部的应用软件

3 信道 Channel – to 通信子网

把节点连接到代表数据交换信道的对象上,在 C++中用 Channel 类来描述。Channel 类提供了管理通信子网对象和把节点连接至它们的各种方法。信道类同样可以由开发者以面向对象的方法自定义。一个信道实例可以模拟一条简单的线缆(wire),也可以模拟一个复杂的巨型以太网交换机,甚至无线网络中充满障碍物的三维空间。

4 网络设备 Net Device

安装在Node中,相当与网卡+软件驱动,NS3中,NetDevice相当于安装在节点上,使得节点通过信道和其他节点通信。像真实的计算机一样,一个节点可以通过多个网络设备同时连接到多条信道上。由 C++中的 NetDevice 类来描述。 NetDevice 类提供了管理连接其他节点和信道对象的各种方法,并且允许开发者以面向对象的方法来自定义。这几个例子中主要使用是 CsmaNetDevice、PointToPointNetDevice, 和 WifiNetDevice。CsmaNetDevice 在 csma 信道中工作,而PointToPointNetDevice 在 PointToPoint 信道中工作,WifiNetNevice 在 wifi 信道中工作。

5 拓扑辅助类(helper) Topology

简化网络拓扑配置
NetDevice 与 Node 之间的连接、NetDevice 与 Channel 之间的连接、分配 IP 地址等等都是 ns-3 中 常见的任务,提供拓扑助手(Topology Helper)将这些不同的操作组成一个易于使用的模型。

二、 第一个ns脚本(5.2 A First ns-3 Script [tutorial])

1 结果分析

1.1 注意:./waf不可用

在ns-3.36之后已经没有waf文件,通过ns3文件进行取代,因此在ns-3.36后期版本均通过./ns3进行交互即可。

1.2 脚本运行及结果

ns-3.39目录下打开终端输入,运行结果如下

	./ns3 run first

./ns3交互

输出信息显示了UdpEcho应用的行为:2s时,Node0(client;10.1.1.1)发送了一个大小为1024B的数据包给Node1(sever;10.1.1.2)。经过0.00369s,Node1成功接收到数据包后返回一个同样大小的数据包。再经过相同的时间,Node0接收到该返回数据包。

为什么是0.00369s? 这是分组从Node0到Node1的传输延迟(分组从节点发至信道的用时)和传播延迟(分组在信道中的用时)的总和。 该脚本中配置的PPP信道的传播延迟为0.002s。传输速率为5Mbps,Node0的传输延迟为(结果保留5位小数):传输延迟=分组大小/传输速率=(1054×8)/(5×10^6)=0.0016864s≈0.00169s。
其中,1054是1024B负载,20B IPv4分组头,8B UDP分组头和2B PPP分组头大小的总和。因此,单向延迟是0.00369s。
1054可以在下文可视化结果中看到

1.3 可视化工具安装

之前的编译过程中,PyViz可视化工具并未被打开,如下图所示:

在这里插入图片描述
除必需的库之外,一般还需要安装一些可选的库,以支持ns-3的部分拓展功能和特性:

1.3.1 Python可视化器和绑定

(ns-3.37及更新版本):cppyy Python模块和Pyviz依赖

[cppyy Python模块]

python3 -m pip install --user cppyy

[Pyviz依赖]

sudo apt install gir1.2-goocanvas-2.0 python3-gi python3-gi-cairo python3-pygraphviz gir1.2-gtk-3.0 ipython3
1.3.2 修改配置选项,打开python绑定配置

使用./ns3 configure命名配置,添加”–enable-python-bindings“选项,打开python绑定配置,如:

./ns3 configure --build-profile=debug --enable-examples --enable-tests --enable-python-bindings

运行上述命令后,可以发现python绑定和PyViz可视化工具均已打开
在这里插入图片描述

1.3.3 重新编译ns3
./ns3

在这里插入图片描述

等待漫长的编译过程结束,如果没有报错的话,我们就可以愉快地使用PyViz可视化工具啦!

以官方样例first.cc为例,只需要运行命令之后加上”–vis“选项即可:

./ns3 run first --vis
1.3.4 可视化结果

在这里插入图片描述
zoom调整窗口大小,speed修改仿真进行的速度,snapshot用来抓屏,simulate按钮开始和结束仿真。鼠标放在节点上可以显示节点的网络设备等信息。单击Simulate仿真按钮开始仿真,在仿真过程中出现的绿色代表通信状态。
在这里插入图片描述
在这里插入图片描述

1.3.5 其他依赖库
  1. Python(开发)的额外最低需要:对于使用ns-3-allinone仓库(从Git克隆),需要获取额外的包并成功安装pybindgen和netanim
sudo apt install python3-setuptools git
  1. Netanim:Netanim需要qt5开发工具
sudo apt install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools
  1. 支持基于MPI的分布式模拟:
sudo apt install openmpi-bin openmpi-common openmpi-doc libopenmpi-dev
  1. 支持bake构建工具:
sudo apt install mercurial unzip
  1. 调试:
sudo apt install gdb valgrind 
  1. 支持utils/check-style-clang-format.py代码风格检查程序(从ns-3.37开始):
sudo apt install clang-format
  1. Doxygen和相关的内联文档:
sudo apt install doxygen graphviz imagemagick
sudo apt install texlive texlive-extra-utils texlive-latex-extra texlive-font-utils dvipng latexmk
  1. ns-3手册和教程是用Sphinx写的,图片一般也是以dia的格式:
sudo apt install python3-sphinx dia
  1. GNU Scientific Library (GSL)(为支持更准确的802.11b WiFi错误模型):
sudo apt install gsl-bin libgsl-dev libgslcblas0
  1. 读取pcap数据包trace:
sudo apt install tcpdump
  1. 支持统计框架的数据库:
sudo apt install sqlite sqlite3 libsqlite3-dev
  1. 基于Xml的配置存储版本(需要libxml2 >= version 2.7):
sudo apt install libxml2 libxml2-dev
  1. 基于GTK的配置系统:
sudo apt install libgtk-3-dev
  1. 使用虚拟机和ns-3进行实验:
sudo apt install vtun lxc uml-utilities
  1. 支持openflow模块和Boost开发库:
sudo apt install libxml2 libxml2-dev libboost-all-dev

2 代码详细分析

  • 主目录下【ns-版本号】文件夹称为工作区(workspace)
  • 脚本first.cc位于ns-3.39/example/tutorial

1 first.cc实现的功能

在两个节点之间创建一个简单的点对点链接,并在节点之间回送(echo)单个数据包。

2 first.cc代码结构:

2.1 Copyright
2.2 Module Includes
	#include "ns3/applications-module.h"    //applications模块
	#include "ns3/core-module.h"            //core模块
	#include "ns3/internet-module.h"        //internet模块
	#include "ns3/network-module.h"         //network模块
	#include "ns3/point-to-point-module.h"  //p2p模块

Core模块和network模块头文件是所有脚本必须包括的,它们分别定义了ns-3的核心功能(如模拟事件,事件调度等)和基本网络组件(如网络节点,分组和地址等)。

Internet和applications模块也是大部分脚本会用到的模块,internet模块定义了TCP/IP协议栈,applications模块定义了应用层的分组收发模型。

每个ns-3的include文件都放在build目录下的ns3文件夹中。

在这里插入图片描述

2.3 NS3 namespace

命名空间

2.4 Logging

工作日志

2.5 Main Function

在ns-3中,节点和信道被分别抽象为Node,Channel以及节点中链接信道的网络设备NetDevice类这3个C++类。不同类型的信道对应不同的NetDevice和Channel子类。

例如,对于first脚本中的点对点(PPP)信道来说,对应的网络设备类是PointToPointNetDevice,信道类是PointToPointChannel。

一般来说,NetDevice主要负责实现链路层协议,Channel主要负责实现物理层协议。

2.5.1 网络拓扑的创建
创建网络节点 NodeContainer
	NodeContainer nodes;
    nodes.Create(2);

创建ns-3节点对象,这些对象表示模拟中的计算机

配置信道属性 PointToPointHelper
	PointToPointHelper pointToPoint;
	pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
	pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

初始化对象并配置参数

创建信道并连接节点与信道 NetDeviceContainer
	NetDeviceContainer devices;
	devices = pointToPoint.Install (nodes);

执行这两句代码,前面创建的两个Node将分别包含一个NetDevice,同时产生了Node之间的点到点信道,每个设备都被配置为速率5M,2ms延迟。

2.5.2 安装TCP/IP协议族 InternetStackHelper
	InternetStackHelper stack;
	stack.Install(nodes);

网络协议栈的拓扑生成器类,执行后,它会为每一个节点容器中的节点安装一个网络协议栈TCP/IP协议栈。

2.5.3 为节点的网络设备分配IP地址 Ipv4AddressHelper
	Ipv4AddressHelper address;
	address.SetBase("10.1.1.0", "255.255.255.0");

设置 IP 地址和子网掩码

2.5.4 安装应用层 Applications
udpEchoSeverHelper(服务器节点)

该first模拟脚本选择的是ns-3中一种叫做UdpEcho的应用程序:

	UdpEchoServerHelper echoServer (9);
	
	ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
	serverApps.Start (Seconds (1.0));
	serverApps.Stop (Seconds (10.0));

设置端口号为9.

echoServer.Install 在管理节点的 NodeContainer 容器中索引为 1 的节点上安装一个 UdpEchoServerApplication,作为服务器节点。

应用对象需要一个时间参数来“开始”产生数据通信,并且可能在一个可选的时间点“停止”。这些时间点是用ApplicationContainer 的方法 Start 和 Stop 来设置的。

udpEchoClientHelper(客户端节点)
	UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
	
	echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
	echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.)));
	echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
	
	ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
	clientApps.Start (Seconds (2.0));
	clientApps.Stop (Seconds (10.0));

把RemoteAdress和RemotePort属性传递给生成器(实际上是作为生成器构造函数的两个必须传递的参数)。

RemoteAdress、RemotePort为Sever端的IP地址和端口号(端口号为9)。

配置其他参数:数据包数量、时间间隔、数据包大小。

客户端启动时间比服务器端晚1s。

2.5.5 开始及结束仿真 Simulator
    Simulator::Run();
    Simulator::Destroy(); 

运行和清除语句。

当事件队列中没有其他事件,或找到特殊的停止事件时,模拟将自动停止。停止事件将通过Simulator::Stop(stopTime)函数创建。Simulator::Stop(stopTime)的调用要在Simulator::Run之前。

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值