一.下載虛擬機(jī)
直接下載虛擬機(jī)的安裝包,然后分配內(nèi)存等一系列操作,后注冊(cè)用戶
二.安裝NS3虛擬仿真軟件
1.在網(wǎng)上下ns3軟件的安裝包
(1)第一種方式
- 給出ns3官方網(wǎng)址:
https://www.nsnam.org/ - 給出安裝包的網(wǎng)址:
https://www.nsnam.org/release/ns-allinone-3.15.tar.bz2
將下載的軟件壓縮包放入虛擬機(jī)的共享文件夾中
在虛擬機(jī)中打開共享文件夾
圖1 -
將壓縮包復(fù)制到usr目錄下
圖2
(2)第二種方式
- 創(chuàng)建新目錄用于存放ns3安裝包
mkdir ns3
創(chuàng)建一個(gè)名為ns3的目錄 - 進(jìn)入到ns3目錄下
cd /ns3 - 直接從網(wǎng)絡(luò)上下載ns3安裝包并保存在當(dāng)前目錄
wget https://www.nsnam.org/release/ns-allinone-3.15.tar.bz2
2.解壓壓縮包
-
sudo tar -jxvf ns-allinone-3.29.tar.bz2
輸入用戶密碼
圖1
圖2
3.將解壓后的安裝包進(jìn)行更名
-
sudo mv ns-allinone-3.29 ns3
圖3
三.編譯ns3軟件包
1.使用build.py編譯
第一次編譯NS3軟件包,建議用./build.py --enable-examples--enable-tests命令,對(duì)下載的源代碼進(jìn)行整體編譯。
-
進(jìn)入到ns3目錄下
cd ns3
圖3 - 敲入如下命令,編譯腳本開始編譯,初次編譯用時(shí)較長,請(qǐng)耐心等待
-
./build.py --enable-examples --enable-tests
如果敲入這個(gè)代碼出現(xiàn):
圖4
這個(gè)提示,則是因?yàn)槟闾摂M機(jī)里沒有python2
那么就要裝python2 -
python2 的安裝:
1.首先查看一下 /usr/bin/ 文件夾里面有沒有python文件
sudo apt-get install python
遇到[Y/N]的時(shí)候輸入Y就可以
圖片5
2.如果有這個(gè)文件則執(zhí)行下面這句話
sudo apt-get --reinstall install python-minimal
這個(gè)時(shí)候你輸入上面代碼,又可能編譯成功有可能編譯不成功,如果安裝了gcc和g++則會(huì)編譯成功,如果不成功那么則需要安裝gcc和g++。
-
gcc的安裝:
圖6
安裝完以后在進(jìn)入usr/bin中查看是否有g(shù)cc
如果存在gcc則進(jìn)行上一步繼續(xù)輸入: -
./build.py
如果編譯成功則出現(xiàn)如下內(nèi)容:
編譯成功
輸入:
-
./build.py --enable-examples --enable-tests
則出現(xiàn)
圖1 -
編譯完成之后,在當(dāng)前目錄ns3下會(huì)產(chǎn)生一個(gè)名為ns-3.29/的目錄,切換到該目錄下
cd ns-3.29
圖2
2.使用waf編譯
NS3的編譯系統(tǒng)采用了Waf。它是用Python開發(fā)的新一代編譯管理系統(tǒng)。
更多關(guān)于Waf的細(xì)節(jié),可以通過:http://code.google.com/p/waf/ 網(wǎng)址獲取。
使用waf對(duì)NS3源代碼進(jìn)行編譯時(shí),可以分為優(yōu)化編譯和調(diào)試編譯兩種情況。默認(rèn)情況將進(jìn)行調(diào)試編譯。
為了通知waf進(jìn)行優(yōu)化編譯,進(jìn)行如下步驟
-
為防止重復(fù)編譯可能帶來的錯(cuò)誤,第一條命令首先清空以前編譯的內(nèi)容(編譯過的內(nèi)容位于ns-3.29/build/目錄下)
sudo ./waf clean
圖3
該命令不是必須的,但這樣做是一個(gè)好的習(xí)慣。
-
第二條命令,編譯系統(tǒng)開始檢查各種依存關(guān)系,并進(jìn)行編譯。配置NS3,“–build-profile=debug”是讓NS3以debug模式運(yùn)行,可以在運(yùn)行時(shí)查看日志信息,方便調(diào)試
sudo ./waf --build-profile=debug --enable-examples --enable-tests configure
你可以看到類似如下的輸出:
結(jié)果1
結(jié)果2
說明配置成功。
-
然后接著編譯
sudo ./waf
結(jié)果1
結(jié)果2
此外可以通過參數(shù)-o,更改編譯的目標(biāo)目錄,默認(rèn)編譯目錄為build/。可以通過如下命令,更改編譯的目標(biāo)目錄為build/debug/
- ./waf -d debug -o build/debug --enable-examples --enable-testsconfigure
在waf中還有許多其它的配置和編譯選項(xiàng)可用??梢酝ㄟ^以下命令察看更多的選項(xiàng):
- ./waf --help
三.對(duì)編譯的正確性進(jìn)行測(cè)試
-
通過運(yùn)行“./test.py -c core”腳本進(jìn)行ns-3軟件包的正確性測(cè)試
sudo ./test.py -c core
輸入用戶密碼
開始編譯
成功
用戶通??梢赃\(yùn)行此命令來檢查NS3軟件包是否正確編譯了。
四.運(yùn)行第一個(gè)腳本
我們通常使用waf運(yùn)行腳本程序。在正確編譯了NS3軟件包之后,如果要運(yùn)行一個(gè)程序,只需在waf后加入--run選項(xiàng)即可。
那第一個(gè)就運(yùn)行常見的HelloSimulator程序,該程序就相當(dāng)于學(xué)習(xí)一門語言時(shí)的Hello World程序:
-
sudo ./waf --run hello-simulator
結(jié)果
出現(xiàn)HelloSimulator則說明編譯成功。
如果沒有看到輸出“HelloSimulator”,說明你是在優(yōu)化編譯模式下進(jìn)行的編譯,在優(yōu)化編譯模式下,默認(rèn)將關(guān)閉控制臺(tái)輸出??梢酝ㄟ^以下命令: - sudo ./waf clean
- sudo ./waf -d debug --enable-examples --enable-tests configure
在調(diào)試編譯模式下進(jìn)行重新編譯。
五.NS3中的幾個(gè)關(guān)鍵概念:
(以下內(nèi)容部分來自于百度百科)
1.節(jié)點(diǎn)Node
在網(wǎng)絡(luò)術(shù)語中,任何一臺(tái)連接到網(wǎng)絡(luò)的計(jì)算設(shè)備被稱為主機(jī),亦稱為終端。NS3是一個(gè)網(wǎng)絡(luò)模擬器,而非一個(gè)專門的因特網(wǎng)模擬器,為此我們避開術(shù)語“主機(jī)”,因?yàn)檫@個(gè)詞太容易讓人聯(lián)想到因特網(wǎng)和及其相關(guān)協(xié)議。因此,我們選用了一個(gè)來源于圖論,在其他網(wǎng)絡(luò)模擬器中亦廣泛使用的術(shù)語:節(jié)點(diǎn)。
NS3中基本計(jì)算設(shè)備被抽象為節(jié)點(diǎn)。節(jié)點(diǎn)由用C++編寫的Node類來描述。Node類提供了用于管理計(jì)算設(shè)備的各種方法。
可以將節(jié)點(diǎn)設(shè)想為一臺(tái)可以添加各種功能的計(jì)算機(jī)。為了使一臺(tái)計(jì)算機(jī)有效地工作,我們可以給它添加應(yīng)用程序,協(xié)議棧,外設(shè)卡及驅(qū)動(dòng)程序等。NS3采用了與此相同的模型。
2.信道
在NS3中,可以把節(jié)點(diǎn)連接到代表數(shù)據(jù)交換信道的對(duì)象上。在這里,基本的通信子網(wǎng)這一抽象概念被稱為信道,用C++編寫的Channel類來描述。
Channel類提供了管理通信子網(wǎng)對(duì)象和把節(jié)點(diǎn)連接至信道的各種方法。信道類同樣可以由開發(fā)者以面向?qū)ο蟮姆椒ㄗ远x。一個(gè)信道實(shí)例可以模擬一條簡單的線纜(wire),也可以模擬一個(gè)復(fù)雜的巨型以太網(wǎng)交換機(jī),甚至無線網(wǎng)絡(luò)中充滿障礙物的三維空間。
信道模型的實(shí)例包括:CsmaChannel,PointToPointChannel和WifiChannel。舉例來說,CsmaChannel信道模擬了用于一個(gè)可以實(shí)現(xiàn)載波偵聽多路訪問的信道,這個(gè)信道具有和以太網(wǎng)相似的功能。
3.網(wǎng)絡(luò)設(shè)置
在Unix/Linux系統(tǒng)中,外圍硬件被劃為“設(shè)備”。設(shè)備通過驅(qū)動(dòng)程序來控制,而網(wǎng)卡通過網(wǎng)卡驅(qū)動(dòng)程序來控制。在Unix/Linux系統(tǒng)中,網(wǎng)卡被稱為像eth0這樣的名字。
在NS3中,網(wǎng)絡(luò)設(shè)備這一抽象概念相當(dāng)于硬件設(shè)備和軟件驅(qū)動(dòng)的總和。NS3仿真環(huán)境中,網(wǎng)絡(luò)設(shè)備相當(dāng)于安裝在節(jié)點(diǎn)上,使得節(jié)點(diǎn)通過信道和其他節(jié)點(diǎn)通信。像真實(shí)的計(jì)算機(jī)一樣,一個(gè)節(jié)點(diǎn)可以通過多個(gè)網(wǎng)絡(luò)設(shè)備同時(shí)連接到多條信道上。
網(wǎng)絡(luò)設(shè)備由用C++編寫的NetDevice類來描述。NetDevice類提供了管理連接其他節(jié)點(diǎn)和信道對(duì)象的各種方法,并且允許開發(fā)者以面向?qū)ο蟮姆椒▉碜远x。
幾個(gè)特定的網(wǎng)絡(luò)設(shè)備的實(shí)例,它們分別是CsmaNetDevice,PointToPointNetDevice, 和WifiNetDevice。正如以太網(wǎng)卡被設(shè)計(jì)成在以太網(wǎng)中工作一樣,CsmaNetDevice被設(shè)計(jì)成在csma信道中工作,而PointToPointNetDevice在PointToPoint信道中工作,WifiNetNevice在wifi信道中工作。
4.應(yīng)用程序
在NS3中并沒有真正的操作系統(tǒng)的概念,更沒有特權(quán)級(jí)別或者系統(tǒng)調(diào)用的概念。NS3仿真環(huán)境中的應(yīng)用程序在節(jié)點(diǎn)上運(yùn)行來驅(qū)動(dòng)模擬過程。
在NS3中,需要被仿真的用戶程序被抽象為應(yīng)用。用Application類來描述。這個(gè)類提供了管理仿真過程中用戶層應(yīng)用的各種方法。開發(fā)者應(yīng)當(dāng)用面向?qū)ο蟮姆椒ㄗ远x和創(chuàng)建新的應(yīng)用。
在這里我們會(huì)使用Application類的兩個(gè)實(shí)例:UdpEchoClientApplication和UdpEchoServerApplication。這些應(yīng)用程序包含了一個(gè)client應(yīng)用和一個(gè)server應(yīng)用來發(fā)送和回應(yīng)仿真網(wǎng)絡(luò)中的數(shù)據(jù)包。
六.分析例子程序first.cc的源代碼
-cd /usr/ns3/ns-3.29/examples/tutorial/
進(jìn)入上面這個(gè)目錄下會(huì)發(fā)現(xiàn)里面有一個(gè)first.cc文件
這一個(gè)腳本會(huì)在兩個(gè)節(jié)點(diǎn)間創(chuàng)建一個(gè)簡單的點(diǎn)到點(diǎn)的連接,并且在這兩個(gè)節(jié)點(diǎn)之間傳送一個(gè)數(shù)據(jù)包

以下是first.cc文件的源代碼以及詳細(xì)解析:
//emacs模式行
/* -*- Mode:C++; c-file-style:''gnu''; indent-tabs-mode:nil; -*- */
//include文件在build/ns3目錄下
//編譯時(shí)Waf會(huì)根據(jù)配置把在ns3目錄下的公共的頭文件放到build/debug或者build/optimized目錄下
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"
//命名空間
using namespace ns3;
//日志,聲明了一個(gè)叫FirstScriptExample的日志組件,通過引用FirstScriptExample這個(gè)名字的操作,可以實(shí)現(xiàn)打開或者關(guān)閉控制臺(tái)日志的輸出
NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");
//主函數(shù)聲明
int main (int argc, char *argv[])
{
//用來使兩個(gè)日志組件生效的。它們被內(nèi)建在Echo Client 和EchoServer 應(yīng)用中
LogComponentEnable ("UdpEchoClientApplication",LOG_LEVEL_INFO);
LogComponentEnable ("UdpEchoServerApplication",LOG_LEVEL_INFO);
//1.創(chuàng)建節(jié)點(diǎn)
//聲明了一個(gè)名為”nodes”的NodeContainer
NodeContainer nodes;
//調(diào)用了nodes對(duì)象的Create()方法創(chuàng)建了2個(gè)節(jié)點(diǎn)。
nodes.Create (2);
//pointToPointHelper來做關(guān)于創(chuàng)建,配置和安裝設(shè)備的工作。
// 拓?fù)漭o助工具的helper類,使用了PointToPointHelper來配置和連接網(wǎng)絡(luò)設(shè)備PointToPointNetDevice和信道PointToPointChannel對(duì)象。
//在棧中初始化了一個(gè)PointToPointHelper的對(duì)象pointToPoint
PointToPointHelper pointToPoint;
//PointToPointHelper對(duì)象當(dāng)創(chuàng)建一個(gè)PointToPointNetDevice對(duì)象時(shí)使用“5Mbps"來作為數(shù)據(jù)速率。
pointToPoint.SetDeviceAttribute ("DataRate", StringValue("5Mbps"));
//PointToPointHelper使用"2ms"(2毫秒)作為每一個(gè)被創(chuàng)建的點(diǎn)到點(diǎn)信道傳輸延時(shí)值
pointToPoint.SetChannelAttribute ("Delay", StringValue("2ms"));
//2.利用拓?fù)湓O(shè)置鏈路
//使用一個(gè)NetDeviceContainer對(duì)象來存放需要所有被創(chuàng)建的NetDevice對(duì)象
NetDeviceContainer devices;
//PointToPointHelper的Install()方法以一個(gè)NodeContainer對(duì)象作為一個(gè)參數(shù)。
//在Install()方法內(nèi),一個(gè)NetDeviceContainer被創(chuàng)建了。
//對(duì)于在NodeContainer對(duì)象中的每一個(gè)節(jié)點(diǎn)(對(duì)于一個(gè)點(diǎn)到點(diǎn)鏈路必須明確有兩個(gè)節(jié)點(diǎn)),
//都將有一個(gè)PointToPointNetDevice被創(chuàng)建和保存在設(shè)備容器內(nèi),有一個(gè)PointToPointChannel對(duì)象被創(chuàng)建,兩個(gè)PointToPointNetDevices與之連接。
//當(dāng)PointToPointHelper對(duì)象創(chuàng)建時(shí),那些在helper中被預(yù)先設(shè)置的屬性被用來初始化對(duì)象對(duì)應(yīng)的屬性值。
devices = pointToPoint.Install (nodes);
//當(dāng)調(diào)用了pointToPoint.Install(nodes)后,我們會(huì)有兩個(gè)節(jié)點(diǎn),每一個(gè)節(jié)點(diǎn)安裝了點(diǎn)到點(diǎn)網(wǎng)絡(luò)設(shè)備,在它們之間是一個(gè)點(diǎn)到點(diǎn)信道。
//兩個(gè)設(shè)備會(huì)被配置在一個(gè)有2ms傳輸延時(shí)的信道上以5Mbps的速率傳輸數(shù)據(jù)。
//3.安裝協(xié)議棧
InternetStackHelper stack;
//類InternetStackHelper是一個(gè)輔助安裝網(wǎng)絡(luò)協(xié)議棧的helper類。
//其中Install()方法以NodeContainer對(duì)象作為參數(shù),當(dāng)它被執(zhí)行后,它會(huì)為節(jié)點(diǎn)容器中的每一個(gè)節(jié)點(diǎn)安裝一個(gè)網(wǎng)絡(luò)協(xié)議棧(TCP,UDP,IP等)
stack.Install (nodes);
//4.分配IP地址
Ipv4AddressHelper address;
//從10.1.1.0開始以子網(wǎng)掩碼為255.255.255.0分配地址
address.SetBase ("10.1.1.0", "255.255.255.0");
//使用Ipv4Interface對(duì)象將一個(gè)IP地址同一個(gè)網(wǎng)絡(luò)設(shè)備關(guān)聯(lián)起來
Ipv4InterfaceContainer interfaces = address.Assign(devices);
//聲明了UdpEchoServerHelper,用來幫助創(chuàng)建真正應(yīng)用的helper對(duì)象
//我們約定在helper類的對(duì)象中放置必需的屬性,除非我們告知helper對(duì)象服務(wù)器和客戶端所共知的一個(gè)端口號(hào),否則這個(gè)helper對(duì)象是不會(huì)起任何作用的
UdpEchoServerHelper echoServer (9);
//Install()方法的執(zhí)行,才初始化回顯服務(wù)器的應(yīng)用,并將應(yīng)用連接到一個(gè)節(jié)點(diǎn)上去
//這里有一個(gè)C++隱式轉(zhuǎn)換,此轉(zhuǎn)換以nodes.Get(1)的結(jié)果作為輸入,并把它作為一個(gè)NodeContainer的構(gòu)造函數(shù)的參數(shù),最終這個(gè)新構(gòu)造的NodeContainer被送入Install方法中去
//echoServer.Install將會(huì)在管理節(jié)點(diǎn)的NodeContainer容器索引號(hào)為1的機(jī)節(jié)點(diǎn)上安裝一個(gè)UdpEchoServerApplication。安裝會(huì)返回一個(gè)容器,這個(gè)容器中包含了指向所有被helper對(duì)象創(chuàng)建的應(yīng)用指針
//傳遞了double類型對(duì)象1.0到Seconds的一個(gè)方法,通過seconds()方法,把它轉(zhuǎn)換到ns-3的Time對(duì)象
ApplicationContainer serverApps = echoServer.Install (nodes.Get(1));
serverApps.Start (Seconds (1.0));
//使echo服務(wù)應(yīng)用在1s時(shí)開始(生效)并在10s時(shí)停止(失效)
serverApps.Stop (Seconds (10.0));
//創(chuàng)建了一個(gè)UdpEchoClientHelper的對(duì)象,并告訴它設(shè)置客戶端的遠(yuǎn)端地址為服務(wù)器節(jié)點(diǎn)的IP地址。
//我們同樣告訴它準(zhǔn)備發(fā)送數(shù)據(jù)包到端口9
UdpEchoClientHelper echoClient (interfaces.GetAddress (1),9);
//“MaxPackets”屬性告訴客戶端我們所允許它在模擬期間所能發(fā)送的最大數(shù)據(jù)包個(gè)數(shù)。
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
//“Interval”屬性告訴客戶端在兩個(gè)數(shù)據(jù)包之間要等待多長時(shí)間。
echoClient.SetAttribute ("Interval", TimeValue (Seconds(1.0)));
//“PacketSize”屬性告訴客戶端它的數(shù)據(jù)包應(yīng)該承載多少數(shù)據(jù)。
echoClient.SetAttribute ("PacketSize", UintegerValue(1024));
//停止echo服務(wù)端
//正如echo服務(wù)端一樣,我們告訴echo客戶端何時(shí)來開始和停止,
//這里我們使客戶端在模擬器中時(shí)間為2s的時(shí)候開始(即服務(wù)端生效1s后才開始)。
ApplicationContainer clientApps = echoClient.Install (nodes.Get(0));
//5.運(yùn)行模擬器
clientApps.Start (Seconds (2.0));
//實(shí)際上我們是在模擬器中1.0s,2.0s,和10.0s時(shí)預(yù)設(shè)了時(shí)間的發(fā)生
//當(dāng)Simulator::Run被調(diào)用時(shí),系統(tǒng)會(huì)開始遍歷預(yù)設(shè)事件的列表并執(zhí)行。
//首先它會(huì)在1.0s時(shí)運(yùn)行事件,這個(gè)事件會(huì)使echo服務(wù)端應(yīng)用生效(這個(gè)事件會(huì)預(yù)設(shè)更多的其他事件)
//接下來仿真器會(huì)運(yùn)行在t=2.0s時(shí)的事件,即讓echo客戶端應(yīng)用開始
clientApps.Stop (Seconds (10.0));
//當(dāng)這些事件被執(zhí)行后,就沒有將來的事件來執(zhí)行了,函數(shù)Simulator::Run會(huì)返回。整個(gè)模擬過程就結(jié)束了
Simulator::Run ();
//該方法被執(zhí)行后,模擬器中所有創(chuàng)建的對(duì)象將被銷毀。你自己并不需要追蹤任何對(duì)象,你所需要做的僅僅是調(diào)用Simulator::Destroy并且退出
Simulator::Destroy ();
return 0;
}
看完這個(gè)我相信你會(huì)對(duì)編寫網(wǎng)絡(luò)仿真腳本的基本流程有了一定的了解。
-
NS3 仿真基本流程:
(部分來自于百度博客)
1.選擇或開發(fā)相應(yīng)的模塊
根據(jù)實(shí)際仿真對(duì)象和仿真場(chǎng)景選擇相應(yīng)的仿真模塊:如果是有線局域網(wǎng)絡(luò)(CSMA)還是無線局域網(wǎng)絡(luò)(Wi-Fi);節(jié)點(diǎn)是否需要移動(dòng)(mobility);使用何種應(yīng)用程序(application);是否需要能量(energy)管理;使用何種路由協(xié)議(internet、aodv等);是否需要?jiǎng)赢嬔菔镜瓤梢暬缑妫╲isualizer、netanim)等。如果要搭建的網(wǎng)絡(luò)是比較新的網(wǎng)絡(luò),如延遲容忍網(wǎng)絡(luò)(DTN)等,需要開發(fā)設(shè)計(jì)協(xié)議,如路由協(xié)議、移動(dòng)模型、能量管理模型等。
2.編寫網(wǎng)絡(luò)仿真腳本
有了相應(yīng)的模塊,就可以搭建網(wǎng)絡(luò)仿真環(huán)境,ns3仿真腳本支持兩種語言:C++和Python,但是兩種語言的API接口是一樣的,部分API可能還沒有提供Python接口。編寫ns3仿真腳本的大體過程如下:
(1)生成節(jié)點(diǎn):
ns3中節(jié)點(diǎn)相當(dāng)于一個(gè)空的計(jì)算機(jī)外殼,接下來要給這個(gè)計(jì)算機(jī)安裝網(wǎng)絡(luò)所需要的軟硬件,如網(wǎng)卡、應(yīng)用程序、協(xié)議棧等。
(2)安裝網(wǎng)絡(luò)設(shè)備:
不同的網(wǎng)絡(luò)類型有不同的網(wǎng)絡(luò)設(shè)備,從而提供不同的信道、物理層和MAC層,如CSMA、WiFi、WiMAX和point-to-point等。
(3)安裝協(xié)議棧:
ns3網(wǎng)絡(luò)中一般是TCP/IP協(xié)議棧,依據(jù)網(wǎng)絡(luò)選擇具體協(xié)議棧,如是UDP還是TCP,選擇何種不同的路由協(xié)議(OLSR、AODV和Global等)并為其配置相應(yīng)的IP地址,ns3即支持IPv4也支持IPv6。
(4)安裝應(yīng)用層協(xié)議:
依據(jù)選擇的傳輸層協(xié)議選擇相應(yīng)的應(yīng)用層協(xié)議,但有時(shí)需要自己編寫應(yīng)用層產(chǎn)生網(wǎng)絡(luò)數(shù)據(jù)流量的代碼。
(5)其他配置:
如節(jié)點(diǎn)是否移動(dòng),是否需要能量管理等。
(6)啟動(dòng)仿真:
整個(gè)網(wǎng)絡(luò)場(chǎng)景配置完畢,啟動(dòng)仿真。
3.仿真結(jié)果分析
仿真結(jié)果一般有兩種,一種是網(wǎng)絡(luò)場(chǎng)景,如節(jié)點(diǎn)拓?fù)浣Y(jié)構(gòu),移動(dòng)模型等,一般可以通過可視化界面(pyviz或NetAnim)可以直接觀測(cè)到。另一種是網(wǎng)絡(luò)數(shù)據(jù),它除了可以在可視化界面下進(jìn)行簡單統(tǒng)計(jì),也可以通過專門的統(tǒng)計(jì)框架(stats)或者通過ns-3提供的追蹤(tracing)系統(tǒng)收集,統(tǒng)計(jì)和分析相應(yīng)的網(wǎng)絡(luò)數(shù)據(jù),如數(shù)據(jù)分組的延遲、網(wǎng)絡(luò)流量、分組丟失率等。
4.依據(jù)仿真結(jié)果調(diào)整網(wǎng)絡(luò)配置參數(shù)或修改源代碼
有時(shí)實(shí)際結(jié)果與預(yù)期相差較大,這時(shí)就需要分析原因(是網(wǎng)絡(luò)參數(shù)有問題還是協(xié)議本身有問題),然后重新設(shè)計(jì),仿真,直到達(dá)到滿意的結(jié)果。
-
運(yùn)行first.cc腳本程序
要運(yùn)行腳本時(shí),只需將腳本放到scratch目錄下,并運(yùn)行waf,這樣腳本就會(huì)被編譯。
-
sudo cp first.cc /usr/ns3/ns-3.29/scratch/
步驟1
將first.cc文件進(jìn)行更名,更名為myfirst.cc文件
-
sudo mv first.cc myfirst.cc
步驟2
使用waf命令來編譯自己的第一個(gè)實(shí)例腳本:
- cd ..
-
sudo ./waf
示例1
示例2 -
sudo ./waf --run scratch/myfirst
可以看到編譯系統(tǒng)先檢查文件被編譯了,接著運(yùn)行了它。
結(jié)果
上面的四行白色的結(jié)果表示的意思是:
第一行:客戶機(jī)在2秒的時(shí)候向IP為10.1.1.2的節(jié)點(diǎn)的第九號(hào)端口(port)發(fā)送了1024字節(jié)大小的數(shù)據(jù)包。
第二行:10.1.1.2的這個(gè)服務(wù)器在2.00369秒的時(shí)候收到了來自10.1.1.1的端口為49153的1024字節(jié)大小的數(shù)據(jù)包。
第三行:10.1.1.2的服務(wù)器在2.00369秒向10.1.1.1的49153號(hào)端口發(fā)送了1024字節(jié)的一個(gè)數(shù)據(jù)包。
第四行:2.00737秒客戶機(jī)(10.1.1.1)接到了來自10.1.1.2(服務(wù)器)的9號(hào)端口的一個(gè)1024字節(jié)的數(shù)據(jù)包。
七.打開仿真界面
要想使自己寫的程序可視化,一共有兩種方式:
1.Pyiz
(我還沒有試過這種方法所以有部分知識(shí)來自于百度百科,我也不知道好不好使你們可以試試)
PyViz工具使用參考網(wǎng)址:http://www.nsnam.org/wiki/index.php/PyViz
1.安裝依賴包
- sudo apt-get install python-dev python-pygraphviz python-kiwi python-pygoocanvas python-gnome2 python-gnomedesktop python-rsvg
注意: ‘python-gnomedesktop’安裝包問題 將命令python-gnomedesktop換為 python-gnome2-desktop-dev
2.安裝交互python使得GUI上有控制臺(tái)按鈕
- sudo apt-get install ipython
3.PyViz測(cè)試
(1) python腳本
- sudo ./waf --pyrun src/flow-monitor/examples/wifi-olsr-flowmon.py --visualize
(2) C++腳本
對(duì)于src/olsr/examples/simple-point-to-point-olsr.cc腳本,要出現(xiàn)GUI界面,使用下面的命名是無法成功的
- sudo ./waf --run src/olsr/examples/simple-point-to-point-olsr --vis
需要修改wscript文件obj=bld.create_ns3_program('simple-point-to-point-olsr', ['point-to-point', 'internet', 'olsr', 'applications', 'wifi'])
修改成
obj=bld.create_ns3_program('simple-point-to-point-olsr', ['point-to-point', 'internet', 'olsr', 'applications', 'wifi', 'visualizer'])
4.使用方法
以命令行參數(shù)的形式調(diào)用,只要編寫的腳本(形如xxx.cc文件)中加入下面的語句(需加在創(chuàng)建節(jié)點(diǎn)之前):
1)CommandLine cmd;
2)cmd.Parse (argc, argv);
運(yùn)行程序時(shí)加入?yún)?shù) --vis
比如:sudo ./waf --run examples/tutorial/third --vis
5.注意:--vis 選項(xiàng)無效
visualizer模塊依賴PythonBinding,NS3中的PythonBinding由pybindgen完成,但是pybindgen工具在ns-allinone-3.xx目錄下,而不是在ns-3.xx目錄下,如果移動(dòng)了ns-3.xx的目錄,就無法定位pybindgen進(jìn)而完成PythonBinding
解決方法:
重新配置和編譯NS-3,配置行用 --with-pybindgen加上pybindgen所在目錄:
- sudo ./waf -d debug --enable-examples --enable-tests configure --with-pybindgen=~/NS3/ns-allinone-3.29/pybindgen-0.17.0.post49+ng0e4e3bc/
- sudo ./waf
2.NetAnim
(我在安裝這個(gè)軟件的時(shí)候情況比較復(fù)雜,我就以我的例子進(jìn)行講解)
NetAnim工具使用參考網(wǎng)址:http://www.nsnam.org/wiki/index.php/NetAnim
1.安裝依賴包并下載
當(dāng)你已經(jīng)完全按照上述的步驟進(jìn)行完并確保正確以后,在ns3的目錄下會(huì)有一個(gè)netanim-3.108文件夾

但網(wǎng)上的部分教程會(huì)讓你進(jìn)入這個(gè)文件夾下再繼續(xù)操作命令,可是當(dāng)我進(jìn)入這個(gè)文件夾下操作命令的時(shí)候就會(huì)出現(xiàn)錯(cuò)誤,錯(cuò)誤如下:

這種時(shí)候有可能是因?yàn)槟銢]有安裝依賴包(最好在根目錄下安裝比較好)則輸入以下命令來安裝依賴包:
-
sudo apt-get install mercurial
安裝mercurial
步驟1 -
sudo apt-get install qt4-dev-tools
NetAnim是基于Qt4圖形庫的,所以要先安裝Qt4。Ubuntu系統(tǒng)安裝Qt4
步驟2 -
sudo make clean
執(zhí)行這個(gè)命令時(shí),網(wǎng)上的部分教程會(huì)讓你進(jìn)入到netanim-3.108文件夾下執(zhí)行,但是我的就出現(xiàn)了問題,問題如下:
問題1
這個(gè)時(shí)候不要慌(雖然我是慌了一個(gè)晚上)
這個(gè)問題為什么會(huì)產(chǎn)生我其實(shí)還是不太懂,但是對(duì)于這個(gè)問題的解決,我認(rèn)為有兩種辦法,
你可以重新安裝上面兩個(gè)插件或者不進(jìn)入netanim-3.108這個(gè)目錄,直接在usr/ns3/ns-3.29/這個(gè)目錄下執(zhí)行sudo make clean,我就說在這個(gè)目錄下執(zhí)行成功的,成功界面如下:
成功提示
然后在執(zhí)行下面的命令: -
sudo qmake NetAnim.pro
在輸入這個(gè)命令的時(shí)候,系統(tǒng)也給我報(bào)錯(cuò)了,于是我又安裝了一個(gè)系統(tǒng)提示的插件
步驟3
也許你們直接就執(zhí)行成功就不需要安裝這個(gè)插件了
(插件命令 : sudo apt install qtchooser)
執(zhí)行成功的界面:
成功界面
然后繼續(xù)執(zhí)行下面命令: -
sudo make
步驟4
這個(gè)時(shí)候NetAnirm以及安裝好了,檢查它是否安裝完成:
-
cd /usr/ns3/ns-3.29/netanim-3.108/
進(jìn)入到這個(gè)目錄下查找一個(gè)名字叫NetAnirm的綠色字體的文件,如果有恭喜你這個(gè)軟件安裝成功了。
示例1
示例2
以上你安裝完了NetAnirm軟件,那么下面使用它。
2.使用方法
- 生成XML文件
- 在NetAnim軟件中打開XML文件
1.在/usr/ns3/ns-3.29/scratch/目錄下 - cd /usr/ns3/ns-3.29/scratch/
2.編輯myfirst.cc文件 - sudo vi myfirst.cc
按i進(jìn)行編輯文件
首先在myfirst.cc里面,加上頭文件:
#include "ns3/netanim-module.h"
run前面加上三句代碼:
AnimationInterface anim("myfirst.xml");
anim.SetConstantPosition(nodes.Get(0), 1.0, 2.0);
anim.SetConstantPosition(nodes.Get(1), 2.0, 3.0);
Simulator::Run();
Simulator::Destroy();
return 0
按Esc保存,wq!退出
第二三行是描繪兩個(gè)節(jié)點(diǎn)的坐標(biāo),也可以不要這兩行
這樣再運(yùn)行一下myfirst.cc文件:
- cd ..
-
sudo ./waf
步驟1 -
sudo ./waf --run scratch/myfirst
步驟2 -
ls
查看此目錄文件下是否生成一個(gè)名字為myfirst.xml的文件,如果有那么生成xml文件成功。
步驟3 -
cd /usr/ns3/netanim-3.108/
進(jìn)入到這個(gè)目錄下,重新啟動(dòng)NetAnim軟件
步驟4 -
sudo ./NetAnim
步驟5
出現(xiàn)仿真界面:
步驟1
點(diǎn)擊這個(gè)文件夾圖案:
步驟2
找到剛剛生成的myfirst.xml文件并Open:
步驟3
出現(xiàn)這個(gè)界面,那么就說明你已經(jīng)成功了!
界面
(此文章僅作為個(gè)人學(xué)習(xí)筆記使用,如有錯(cuò)誤歡迎指正~)










































