NS3笔记

1 Docker环境配置

1.1 Docker安装

俺是macOS,直接参考这个网址

1.2 镜像安装

俺打算安装Ubuntu18.04,镜像版本可以Ubuntu 镜像库

# 拉取镜像
docker pull ubuntu:18.04
# 查看镜像
docker images
# 运行容器
docker run -itd -p 12439:22 --name ubuntu_node_0 ubuntu:18.04 /bin/bash
# 通过 exec 命令进入 ubuntu 容器
docker exec -it 9224231d9e2f /bin/bash

1.3 安装其他软件

请添加图片描述

# 安装vim
apt-get install vim-gtk
# 安装gcc
apt update
apt install build-essential
# ifconfig安装
apt install net-tools
# 安装git
apt install git
# 安装cmake
apt install cmake
# 安装python
apt install python3
# 安装tar
apt install tar

发现gcc版本不太行,搞个高点的版本并更改优先级:

apt install gcc-8 g+±8

# 配置默认gcc/g++ 链接优先级,最后的数字越大优先级越高
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 10
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g+±8 10

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 1
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g+±7 1

请添加图片描述

发现python3默认下载的是python3.6。输入python指令无反应,python3才有。因此我再apt install python,默认下载了python2.7。此时也需要设置python的优先级。

update-alternatives --install /usr/bin/python python /usr/bin/python3.8 10
update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
update-alternatives --config python

请添加图片描述

Build system和bunzip2可能是macOS里的,所以暂时不管啦。

1.4 安装ns3

# Cloning ns-3 from GitLab.com
git clone https://gitlab.com/nsnam/ns-3-dev.git
cd ns-3-dev
git checkout -b ns-3.37-branch ns-3.37
# Building and testing ns-3
./ns3 configure --enable-examples --enable-tests
# Then, use ns3 to build ns-3:
./ns3 build
# Once complete, you can run the unit tests to check your build:
./test.py
# To view possible command-line options, specify the –PrintHelp argument:
./ns3 run ‘first --PrintHelp’

1.5 vscode连接docker

1.5.1 docker启用ssh服务

通过ssh远程上去。
在docker里安装ssh:

apt install openssh-server

在docker容器内,编辑文件/etc/ssh/sshd_config,添加一行PermitRootLogin yes表示ssh允许root登录:

echo “PermitRootLogin yes” >> /etc/ssh/sshd_config
# 或者 vim /etc/ssh/sshd_config 并手敲一行PermitRootLogin yes

随后重启ssh服务:

service ssh restart

1.5.2 docker设置root密码

在docker容器内,初始化root密码,用于下一步的登录:

passwd root

根据提示输入初始密码。

1.5.3 vscode远程连接docker

vscode扩展中找一下Remote SSH。(本机的docker也可以直接Remote Container连接)
然后就按照扩展直接连接(➕号),连接过程中会弹出一个xxx/xxx/.ssh/config配置文件,直接连接的就不用管了,多次SSH连接的按照如下demo配置:

Host ServerA
	HostName localhost
	ProxyJump ServerB
	User root
	Port 22
	
Host ServerB
	HostName 10.0.0.1
	User root
	Port 22
	ForwardAgent yes

1.6 安装dce-quagga-1.11

最新一版的dce-quagga是1.11,在ns-3-users group里有人说是1.12要出来了。
俺在docker ubuntu18.04中安装dce-quagga-1.11时,一直缺少libc-dbg的依赖。
后面尝试在docker ubuntu16.04中安装dce-quagga。刚开始装的是dce-quagga-1.10,所以依赖都没问题,但是最后的build的时候有些module会出问题,原因不详,但在ns-3-users group里有人说(可能是开发者之一),1.10及之前的版本都不再维护了,所以出问题也很正常。最后装dce-quagga-1.11成功。

1.6.1 Ubuntu16.04 安装 Python3.6

docker ubuntu16.04安装啥的参考上面的内容。然后就是安装python了。dce-quagga-1.11使用了bake.py进行构建,其中依赖一个python的第三方依赖包distro。distro在python3.5里会出现问题,所以需要将python先升级到3.6(最高应该是能到3.8)。

安装python3.6可以参考:https://www.php1.cn/detail/Ubuntu16-04LTS_Z_96cc4ad3.html。我是通过源码进行安装的。

wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
tar -xvf Python-3.6.0.tar
cd Python-3.6.0
./configure
make
sudo make install # 这里俺root用户进了个su

可能需要的依赖包:

apt-get install tar -y
apt-get install xz-utils -y

1.6.1 安装dce-quagga-1.11

官方给了一个“年久失修”的wiki参考 DCE Quagga support:https://www.nsnam.org/docs/dce/manual-quagga/html/getting-started.html

下载bake之前,wiki推荐我们:(有些需要开sudo,因为俺docker直接root权限,所以就没管。)

# Quagga support on DCE requires several packages: autoconf, automake, flex, git-core, wget, g++, libc-dbg, bison, indent, pkgconfig, libssl-dev, libsysfs-dev, gawk
# You need to install the prerequisite packages in advance.

apt-get install autoconf -y
apt-get install automake -y
apt-get install flex -y
apt-get install git-core -y
apt-get install wget -y
apt-get install g++ -y
apt-get install libc-dbg -y
apt-get install bison -y
apt-get install indent -y
apt-get install pkg-config
apt-get install libssl-dev -y
apt-get install libsysfs-dev -y
apt-get install gawk -y

根据wiki,use bake as an installation tool as follows:

mkdir workspace
cd workspace
git clone https://gitlab.com/nsnam/bake.git
export BAKE_HOME=`pwd`/bake
export PATH=$PATH:$BAKE_HOME
export PYTHONPATH=$PYTHONPATH:$BAKE_HOME
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$BAKE_HOME

then build ns-3-dce with quagga:

mkdir dce
cd dce
bake.py configure -e dce-ns3-1.11 -e dce-quagga-1.11
bake.py download
bake.py build

在配置完configure之后,可以通过:

bake.py show

看看构建dce-quagga-1.11还需要哪些依赖包:(这里列的是可能需要的部分,配置过程中记录的,不一定全,不过俺觉得应该没啥问题)

apt-get install python3-gi-cairo -y
apt-get install gir1.2-gtk-3.0 -y
apt-get install libc6-dbg -y
apt-get install libpcap-dev -y
apt-get install mercurial -y
apt-get install python3-gi -y
apt-get install python3-pygraphviz -y
# apt-get install qt5-dev-tools libqt5-dev -y 有问题,换成下面那个依赖
apt-get install qt5-default -y
pip3 install pygraphviz
apt-get install gir1.2-goocanvas-2.0 python-gi python-gi-cairo python-pygraphviz python3-gi python3-gi-cairo python3-pygraphviz gir1.2-gtk-3.0 ipython ipython3
apt-get install libclang-dev -y
apt-get install cmake -y
apt-get install libexpat1-dev -y
apt-get install llvm-dev -y
apt-get install python-pygoocanvas -y
apt-get install python-dev -y
apt-get install python-pygccxml -y

bake.py show没问题之后就可以来时download了。这时候download失败还有可能是网络原因,多试几次就可以了。

build时,非必要的module构建失败可能没关系。

请添加图片描述

em,但后来怕在搞其他玩意的时候出问题,我还是尝试把它解决了。
根据提示,verbose mode:

bake.py build -v
# bake.py build --help 查查看参数

给了这些信息:

>>Building pybindgen-0.22.0 - /usr/local/bin/python3 --version dir=None
>mkdir -p /root/workspace/dce2/build/lib
/usr/local/bin/python3 /root/workspace/dce2/source/pybindgen/setup.py build --build-base=/root/workspace/dce2/source/pybindgen/objdir dir=/root/workspace/dce2/source/pybindgen

直接运行一下:

/usr/local/bin/python3 /root/workspace/dce2/source/pybindgen/setup.py build --build-base=/root/workspace/dce2/source/pybindgen/objdir dir=/root/workspace/dce2/source/pybindgen

em,发现是setup.py中一个绝对路径和相对路径的问题,很容易就解决了。
然后再次运行,发现有个python依赖包缺失,pip3 install再补上去就好了。

再次build。完成。Everything is OK!
在这里插入图片描述

最后就是Then you can try some unit tests of ns-3-dce-quagga as follows:

cd source/ns-3-dce
./test.py -s dce-quagga

请添加图片描述

1.6.3 查看dce-quagga-1.11示例

查一下wiki中示例的位置:

find . -name “dce-quagga-ospfd.*”
# ./myscripts/ns-3-dce-quagga/example/

请添加图片描述

1.7 docker镜像打包

参考:
Docker commit 命令
Docker save 命令
Docker 命令

2 ns3基本概念

2.1 Key Abstractions

2.1.1 Node

在ns-3中,基本的计算设备抽象被称为节点。这个抽象概念在C++中由Node类表示。节点类提供了管理模拟中计算设备的表示方法。

2.1.2 Application

通常情况下,计算机软件被分为两大类。系统软件根据一些计算模型组织各种计算机资源,如内存、处理器周期、磁盘、网络等。用户通常会运行一个应用程序,获取并使用由系统软件控制的资源来完成一些目标。

在ns-3中,没有操作系统的概念,更没有权限级别或系统调用的概念。然而,我们确实有一个应用程序的概念。就像软件应用程序在计算机上运行以执行 "真实世界 "中的任务一样,ns-3应用程序在ns-3节点上运行以实现模拟仿真。

在ns-3中,应用程序是产生一些要模拟的活动的用户程序的基本抽象。这个抽象概念在C++中由Application类表示。应用程序类提供了管理我们的用户级应用程序在模拟中的表现的方法。开发人员要在面向对象的编程意义上对Application类进行开发,创建新的应用程序。

2.1.3 Channel

在现实世界中,人们可以将一台计算机连接到一个网络。通常,这些网络中数据流动的媒介被称为通道。当你把你的以太网电缆连接到墙上的插头时,你就是把你的计算机连接到一个以太网通信通道。在ns-3的模拟世界中,人们将一个节点连接到一个代表通信通道的对象上。在这里,基本的通信子网络抽象被称为通道,在C++中用类Channel来表示。

Channel类提供了管理通信子网对象和将节点连接到它们的方法。通道也可以由开发者在面向对象的编程意义上进行特殊化。一个通道的特殊化可以模拟像电线一样简单的东西。Channel的特殊化也可以模拟像大型以太网交换机那样复杂的东西,或者在无线网络中充满障碍物的三维空间。

2.1.4 Net Device

过去的情况是,如果你想把一台计算机连接到网络上,你必须购买一种特定的网线和一种硬件设备,称为(用PC术语)外设卡,需要安装在你的计算机上。如果外设卡实现了一些网络功能,它们就被称为网络接口卡,或NIC。今天,大多数计算机都内置了网络接口硬件,用户不需要看到这些构件。

如果没有控制硬件的软件驱动程序,网卡将无法工作。在Unix(或Linux)中,一个外围硬件被归类为一个设备。设备使用设备驱动程序进行控制,而网络设备(NIC)则使用网络设备驱动程序进行控制,统称为net设备。在Unix和Linux中,你用诸如eth0这样的名字来指代这些net设备。

在ns-3中,网络设备的抽象涵盖了软件驱动和模拟的硬件。网络设备被 "安装 "在一个节点上,以使该节点能够通过通道与模拟中的其他节点通信。就像在真实的计算机中,一个节点可以通过多个网络设备连接到一个以上的通道。

网络设备的抽象在C++中由NetDevice类表示。NetDevice类提供了管理与Node和Channel对象的连接的方法;并且可以由开发者在面向对象的编程意义上进行专业化。

2.1.5 Topology Helpers

在真实的网络中,你会发现主机有附加(或内置)的网卡。在ns-3中,我们会说你会发现有连接NetDevices的节点。在一个大型的模拟网络中,你将需要在节点、NetDevice和通道之间安排许多连接。

由于将NetDevices连接到Nodes,将NetDevices连接到Channels,分配IP地址等等,都是ns-3中常见的任务,我们提供了所谓的拓扑帮助器,使其尽可能的简单。例如,创建一个NetDevice,添加一个MAC地址,在一个节点上安装该网络设备,配置节点的协议栈,然后将NetDevice连接到通道上,可能需要许多不同的ns-3核心操作。甚至需要更多的操作来将多个设备连接到多点通道上,然后将各个网络连接到一起,形成国际网络。我们提供了拓扑帮助对象,将这些不同的操作结合到一个易于使用的模型中,以方便您的使用。

2.2 A First ns-3 Script

请添加图片描述
换到examples/tutorial目录。你应该看到一个名为first.cc的文件位于那里。这是一个脚本,它将在两个节点之间创建一个简单的点对点链接,并在节点之间回传一个数据包。让我们逐行看一下这个脚本,在你喜欢的编辑器中打开first.cc。

2.2.1 Boilerplate

ns-3模拟器使用的是GNU通用公共许可证第二版。你会在ns-3发行版中的每个文件的头部看到相应的GNU法律条文。通常你会看到在GPL文本的上方有一个参与ns-3项目的机构的版权声明,在下方有一个作者。

/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation;
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

2.2.2 Module Includes

#include "ns3/applications-module.h"
#include "ns3/core-module.h"
#include "ns3/internet-module.h"
#include "ns3/network-module.h"
#include "ns3/point-to-point-module.h"

为了帮助我们的高级脚本用户处理系统中存在的大量include文件,我们根据相对较大的模块来分组include。我们提供了一个单一的包含文件,它将递归地加载每个模块中使用的所有包含文件。与其准确地查找你所需要的头文件,并可能需要正确地获取一些依赖关系,我们给你提供了在大颗粒度上加载一组文件的能力。这不是最有效的方法,但它肯定使编写脚本更容易。

在构建过程中,每个ns-3的包含文件都被放置在一个叫做ns3的目录下(在构建目录下),以帮助避免包含文件名称的冲突。ns3/core-module.h文件对应于你在下载的发行版中src/core目录下找到的ns-3模块。如果你列出这个目录,你会发现有大量的头文件。当你进行构建时,NS3将把公共头文件放在适当的构建/调试或构建/优化目录下的NS3目录中,这取决于你的配置。CMake也会自动生成一个模块包含文件来加载所有的公共头文件。

遵循本教程,你将已经从顶层目录中运行了以下命令:

./ns3 configure -d debug --enable-examples --enable-tests

以配置该项目来执行包括实例和测试的调试构建。还将调用:

./ns3 build

来构建该项目。因此,现在如果你在 …/…/build/include/ns3目录下,你会发现上面显示的四个模块include文件(在许多其他头文件中)。你可以看一下这些文件的内容,发现它们确实包括了各自模块中所有的公共include文件。

2.2.3 Ns3 Namespace

using namespace ns3;

ns-3项目是在一个名为ns3的C++命名空间中实现的。这将所有与 ns-3 相关的声明分组在全局命名空间之外的范围内,我们希望这将有助于与其他代码的整合。C++ using 语句将 ns-3 命名空间引入到当前(全局)的声明区域。这是一种花哨的说法,在这个声明之后,你将不必在所有的ns-3代码前输入ns3:: 范围解析操作符,以便使用它。如果你不熟悉命名空间,请查阅C++教程,将这里的ns3命名空间和用法与你在讨论cout和streams时经常看到的std命名空间和using namespace std;语句的实例进行比较。

2.2.4 Logging

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

我们将用这个声明作为一个方便的地方来谈论我们的Doxygen文档系统。如果你看一下NS-3项目的网站,你会在导航栏中发现一个 "Documentation"的链接。如果你选择这个链接,你会被带到我们的文档页面。有一个 "Latest release "的链接,将带你到ns-3最新稳定版本的文档。如果你选择 "API Documentation"链接,你将被带到ns-3的API文档页面。

页面左侧是文档结构。一个好的起点是ns-3导航树中的NS-3 Modules。如果你展开模块,你会看到NS-3模块文档的列表。这里的模块概念直接与上面讨论的模块包含文件相联系。ns-3日志子系统在Using the Logging Module一节中讨论,我们将在本教程的后面讨论它,但是你可以通过查看Core module,然后展开Debugging tools book,然后选择Logging page来了解上面的声明。单击 “Logging”。

你现在应该看到的是Logging模块的Doxygen文档。在页面顶部的宏列表中,你会看到NS_LOG_COMPONENT_DEFINE的条目。在进入之前,最好先找一下日志模块的 “详细描述”,以了解整体操作。你可以向下滚动或选择协作图下的 "更多… "链接来做这个。

一旦你对所发生的事情有了大致的了解,就去看看具体的NS_LOG_COMPONENT_DEFINE文档。我不会在这里重复文档,但总结一下,这一行声明了一个名为FirstScriptExample的日志组件,允许你通过引用名称来启用和禁用控制台消息记录。

2.2.5 Main Function

设置时间分辨率为1纳秒,这恰好是默认值。

Time::SetResolution (Time::NS);

分辨率是可以表示的最小的时间值(以及两个时间值之间可表示的最小差异)。你可以精确地改变分辨率一次。实现这种灵活性的机制有点耗费内存,所以一旦明确设置了分辨率,我们就会释放内存,防止进一步更新。(如果你没有明确设置分辨率,它将默认为1纳秒,当模拟开始时,内存将被释放)。

脚本的下两行用于启用Echo客户端和Echo服务器应用程序中内置的两个日志组件。

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);

如果你已经阅读了Logging component documentation,你会看到在每个组件上都有许多级别的日志粗略性/细节,你可以启用。这两行代码在INFO级别为echo客户端和服务器启用调试日志。这将导致应用程序在模拟过程中发送和接收数据包时打印出信息。

现在我们将直接进入创建拓扑结构和运行模拟的业务。我们使用拓扑帮助对象来使这项工作尽可能的简单。

后面的内容也都类似,就是查文档,看文档。。。

3 dce-quagga-dev示例

3.1 dce-quagga-bgpd

em,先丢一些参考:
Quagga bgpd build error

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值