ns-3学习手记1

( 安装软件一定看官方文档,别自己瞎鼓捣,浪费时间;官方文档在实际安装中出现问题了,再寻求博客等第三方找线索,但也不是盲目的操作。)

ns-3 官方链接:https://www.nsnam.org/wiki/Installation
切记:不要改ubuntu下的下载链接镜像sources.list,可以一步一步执行完成依赖环境的安装
备注:pip无法定位,通过sudo apt install python3-pip安装解决

学习书目参考:《开源网络模拟器ns-3 : 架构与实践》 / 周迪之编著
如有侵权,请联系删除。

1, ns-3概述

1,ns-3(network simulator)是一款C++写开源项目,主要运行平台GUN/Linux,在Windows下也可使用Cygwin或VS运行,但不能使用部分功能如与物理网络交互等
2,ns-3没有图形界面,模拟网络时需要做以下步骤:

(1)下载源代码
(2)编译源代码
(3)编写模拟脚本
(4)运行模拟脚本

3,ns-3支持C++,python
4,计算机网络分为两部分:
(1)结点和连接结点的信道所组成的网络拓扑
(2)运行在结点和信道中的网络协议
5,ns-3模拟的虚拟网络中:结点和信道被抽象成C++类;结点和信道的连接被抽象成不同C++对象之间的关联。
6,在ns-3中可以模拟出:有线网络的点对点协议(PPP)和总线网络,无线网络中的无线局域网(基于802.11系列标准),长期演进技术(LTE)
7,采用了离散事件(Discrete Event)的模拟技术,可逼真的模拟物理世界中的各种协议:应用层中的各种分组产生器、传输层的TCP和UDP、网络的IPv4和IPv6协议、链路层和物理层的PPP,IEEE 802.11a/b/g/n 和LTE协议等
8,辅助功能:trace生成功能,则可利用第三方软件(wireshark、tcpdump)对ns-3产生的数据进行分析。
9,其主要用于模拟网络拓扑和运行其中的网络协议,关注的是协议行为。ns-3不考虑:结点内部的硬件延迟、CPU使用率等
10,waf命令:负责C++源代码编译和脚本运行。
11,ns-3是由不同模块(model)所组成的项目。如:LTE模块负责实现LTE网络协议栈。Internet模块负责实现TCP/IP协议栈;Wi-Fi模块负责实现IEEE802.11系列协议。
12,文档系统

文档类型 具体内容 阅读方式
ns-3 tutorial 基本概念和使用方法 详细阅读
ns-3 manual 深入讲解ns-3的架构、设计原理和ns-3核心模块中的主要技术细节 了解ns-3原理
Model library 分别讲解每个模块的背景知识、设计架构以及使用方法 编写某一模块的脚本或二次开发
Doxygen 一个工具网站:浏览源代码,查询ns-3中的C++类、函数和变量的定义 编写模拟脚本和进行扩展开发时使用
ns-3 wiki 安装指南、代码提交流程、版本发布等辅助信息,其中还包含一些没有整合入主程序的模块和补丁 可查找所需代码避免重复工作

13

2, 编程小技巧

1,在ns-3.28的其他目录中运行waf,备注:waf存在缺陷,只能在ns-3.28目录下执行。
当前用户在“ns-3.28/src/internet/model”目录下查看TCP源代码,想运行“ns-3.28/examples/tcp/tcp-bulk-send.cc”脚本,则需要执行以下代码:

../../.././waf --run tcp-bulk-send

ns-3tutorial使用shell函数来简化这个过程,其中“hg root”表示ns-3.28的绝对路径,可将其添加到linux的“.bashrc”中保存。

$function waff{cd $(hg root)&&./waf$*;}
$waff --run tcp-bulk-send

2,保存waf输出结果
保存信息到指定的文件夹,可以使用如下命令,

//保存std::cout输出至output文件
./waf --run script_name 1> output

//保存NS_LOG输出(即std::clog)至output文件
./waf --run script_name 2> output

3, 脚本

1头文件
(1)Core模块和network模块头文件是所有脚本必须包括的。其分别定义了ns-3的核心功能(如模拟事件,事件调度等)和基本网络组件(如网络节点、分组和地址等)。
(2)Internet和application模块尽管不是必需的,但会经常用到,其中Internet模块定义了TCP/IP协议栈。Application模块定义了应用层的分组转发模型(如贪婪模型,ON/OFF模型等)
2,名字空间
整个ns-3源代码受“ns3”名字空间保护,必须申明:
using namespace ns3;
3,NS_LOG_COMPONET_DEFINE
使用log系统中的宏定义打印辅助信息,
4,main()函数中的准备工作
设置最小模拟时间单元,开启Log组件

5,创建网络拓扑
(1)在物理网络中,一个网络拓扑由若干结点和连接这些结点的信道组成。——>Node,Channel以及结点连接信道的网络设备NetDevice类,3个C++类。不同类型的信道对应不同的NetDevice和Channel子类,其中,NetDevice主要负责实现链路层协议,Channel主要负责物理层协议。如下图关系:
ns-3学习手记1_第1张图片

4,环境配置过程中的小问题

1,sphinx安装问题,请移步官方文档,即可快速解决
http://sphinxsearch.com/docs/current.html#installing-debian

2,GSL的安装过程,出现问题,请按照下面的说明进行,直接安装gsl-1.7不会出问题,(本机系统ubuntu16.04)
参考链接:https://coral.ise.lehigh.edu/jild13/2016/07/11/hello/
其中,运行出错,找不到链接库:
./a.out: error while loading shared libraries: libgsl.so.0: cannot open shared object file: No such file or directory

解决方法:
参考:https://blog.csdn.net/deeplan_1994/article/details/83927832
3,安装pip的过程中遇到的问题;
问题结果:

sudo apt-get install cmake libc6-dev libc6-dev-i386 libclang-6.0-dev llvm-6.0-dev automake pip 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package pip

解决办法:
参考链接:https://askubuntu.com/questions/672808/sudo-apt-get-install-python-pip-is-failing?newreg=e1eb9d0ee2504a6490ab81a40676498f

具体代码:

$ sudo apt-get update && sudo apt-get install python3-pip

$ sudo apt-get update && sudo apt-get install python-pip

备注:其他换源在我的几次尝试中是没有解决问题的。

4, netanim后又多了一个(nopython)

解决问题的参考链接:https://blog.csdn.net/megaarthur/article/details/21464681

官方参考:https://www.nsnam.org/wiki/NetAnim_3.104#Debian.2FUbuntu_Linux_distribution:

5, 环境配置好可以安装ns-3.28

环境配置参看官方文档:https://www.nsnam.org/wiki/Installation

具体命令代码如下:

//第一步:下载Python辅助脚本
larry@larry-VirtualBox:~$ hg clone http://code.nsnam.org/ns-3-allinone/
//查看其目录结构:
larry@larry-VirtualBox:~$ ls ns-3-allinone/
build.py  constants.py  dist.py  download.py  README  util.py

//第二步:下载allinone源代码包
larry@larry-VirtualBox:~/ns-3-allinone$ python download.py -n ns-3.28

//备注,不指定版本,是下载ns-3-dev,有一些正在开发的功能


//查看包内结构;
larry@larry-VirtualBox:~/ns-3-allinone$ ls
bake      constants.py   dist.py      netanim  pybindgen  util.py
build.py  constants.pyc  download.py  ns-3.28  README     util.pyc

第三步:编译
larry@larry-VirtualBox:~/ns-3-allinone$ python build.py --enable-examples

//结果显示:
Waf: Leaving directory `/home/larry/ns-3-allinone/ns-3.28/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (18m55.485s)

Modules built:
antenna                   aodv                      applications              
bridge                    buildings                 config-store              
core                      csma                      csma-layout               
dsdv                      dsr                       energy                    
fd-net-device             flow-monitor              internet                  
internet-apps             lr-wpan                   lte                       
mesh                      mobility                  mpi                       
netanim (no Python)       network                   nix-vector-routing        
olsr                      point-to-point            point-to-point-layout     
propagation               sixlowpan                 spectrum                  
stats                     tap-bridge                test (no Python)          
topology-read             traffic-control           uan                       
virtual-net-device        visualizer                wave                      
wifi                      wimax                     

Modules not built (see ns-3 tutorial for explanation):
brite                     click                     openflow 

//第四步:运行
//备注:需要进入ns-3.28目录下进行
larry@larry-VirtualBox:~/ns-3-allinone/ns-3.28$ ./waf --run hello-simulator

//运行的结果:
Waf: Entering directory `/home/larry/ns-3-allinone/ns-3.28/build'
Waf: Leaving directory `/home/larry/ns-3-allinone/ns-3.28/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (2.715s)
Hello Simulator

备注:当改动了现有脚本或者编写了一个新脚本时,则需要对ns-3项目重新编译,直接在ns-3.28目录下,运行“./waf"命令编译即可。
build.by一般只在第一次下载ns-3代码库时使用。

6,运行流程图

Created with Raphaël 2.2.0 下载 首次编译:build.by 进入ns-3目录 是否修改源代码? 1,修改源代码;2,运行配置选项 ./waf configure<参数> 重新编译 ./waf 运行 ./waf --run<脚本名> yes no

你可能感兴趣的:(ns-3,计算机网络,ns-3,linux,ubuntu)