用NS3進(jìn)行虛擬仿真

一.下載虛擬機(jī)

直接下載虛擬機(jī)的安裝包,然后分配內(nèi)存等一系列操作,后注冊(cè)用戶

二.安裝NS3虛擬仿真軟件

1.在網(wǎng)上下ns3軟件的安裝包

(1)第一種方式

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ò)誤如下:


示例2

這種時(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ò)誤歡迎指正~)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容