( 安裝軟體一定看官方文檔,别自己瞎鼓搗,浪費時間;官方文檔在實際安裝中出現問題了,再尋求部落格等第三方找線索,但也不是盲目的操作。)
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主要負責實體層協定。如下圖關系:
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輔助腳本
[email protected]:~$ hg clone http://code.nsnam.org/ns-3-allinone/
//檢視其目錄結構:
[email protected]:~$ ls ns-3-allinone/
build.py constants.py dist.py download.py README util.py
//第二步:下載下傳allinone源代碼包
[email protected]:~/ns-3-allinone$ python download.py -n ns-3.28
//備注,不指定版本,是下載下傳ns-3-dev,有一些正在開發的功能
//檢視包内結構;
[email protected]:~/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
第三步:編譯
[email protected]:~/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目錄下進行
[email protected]:~/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代碼庫時使用。