一、目錄結構
首先,我們進入剛剛安裝的ns-allinone-3.27,進入目錄ns-3.27。我們看一下ns-3的目錄結構。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICNwIzMxkDNwIDOwMDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
我們首先介紹幾個常用的目錄檔案,後續會補充其他目錄檔案的介紹。
waf:基于python開發的編譯工具,不管是ns3系統本身自帶的和我們自己寫的仿真代碼都是都是由waf負責編譯的。
scratch:存放使用者腳本檔案,是ns-3預設的腳本存放目錄。我們可以把要運作的腳本檔案或者例子放到這個目錄下,使用waf運作腳本檔案時可以不用加目錄scratch,當腳本檔案在其他目錄時需要在檔案名稱前加目錄名稱才能正常編譯運作。
examples:裡邊包含關于如何使用ns-3的例子,包含許多子產品的使用,如能量,路由,無線網絡等,如果你和我一樣是一個ns-3初學者的話,隻是想利用ns-3現有子產品編寫腳本檔案進行網絡仿真,比如使用正常協定棧中的協定配置一個有線或者無線區域網路絡等,那麼使用examples目錄下的示例對我們很有幫助。examples目錄下的檔案都是我們一些常用到的例子:
build:這個目錄是ns-3的編譯目錄,包含檔案編譯時使用的共享庫和頭檔案(build/ns3)。
這裡對這個build目錄補充一下,build是我們利用waf工具編譯腳本一定會進入的路徑。以aodv.cc腳本(我随便找的,無所謂)的編譯說明一下這個過程(其他任何腳本的編譯都是這個過程):
aodv.cc腳本裡的部分代碼如下:
#include "ns3/aodv-module.h"
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/mobility-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/wifi-module.h"
#include "ns3/v4ping-helper.h"
#include <iostream>
#include <cmath>
#include "ns3/netanim-module.h"
using namespace ns3;
class AodvExample
{
public:
AodvExample ();
bool Configure (int argc, char **argv);
void Run ();
void Report (std::ostream & os);
private:
uint32_t size;
double step;
double totalTime;
bool pcap;
bool printRoutes; NodeContainer nodes;
NetDeviceContainer devices;
Ipv4InterfaceContainer interfaces;
private:
void CreateNodes ();
void CreateDevices ();
void InstallInternetStack ();
void InstallApplications ();
};
我們不關心裡邊的内容,主要關注開頭的頭檔案部分。我剛開始也納悶,這麼多檔案,waf是怎麼找到的,别忘了,build這個目錄是ns-3的編譯目錄,包含檔案編譯時使用的共享庫和頭檔案,是以我們去這個目錄的ns3目錄檢視,内容如下:
在裡邊可以很輕松的找到aodv.cc腳本中的頭檔案,至于以<>括起來的頭檔案,比如<iostream>和<cmath>,這些是C語言裡的标準庫,具體可以百度。
說這些主要是讓我們弄明白waf編譯的過程,首先進入build目錄,然後再離開build目錄。下面的截圖很好的說明了這一點:
src: ns-3的源代碼目錄,目錄結構基本和我們編譯過的子產品相對應。
這裡我們要強調一下,src目錄下的每一個檔案基本就是對應一個子產品,是以我們在研究某一子產品時src目錄下對應子產品的檔案資訊對我們至關重要。比如我們要研究wifi這一子產品,那麼我們進入wifi這個檔案夾,檢視裡邊的内容。其他所有的子產品裡的結構基本是一模一樣的。
wscript:wscript檔案結構是固定的,用來注冊子產品中包含的源碼和使用其他子產品情況。
model: model目錄包含子產品代碼的.cc和.h檔案。這裡邊的腳本一般不用我們修改,這個一般通過help類加到節點上,比如一個gpsr子產品裡的model裡邊的腳本使用help類加到某個節點上,用來研究gpsr協定。
如果你是一個ns-3的進階應用者的話,ns-3現有子產品不能滿足你的需求,比如新開發一個路由協定或者設計一個新的能量模型或者移動模型,那現有子產品中的model目錄下的内容很有參考價值。
helper: helper目錄存放的是子產品對應的helper類代碼的源檔案。主要幫助使用者建立節點,給節點添加協定棧,網絡裝置等等。
test: test目錄包含的是子產品設計者編寫的子產品測試代碼。
examples:examples目錄存放的是應用該子產品的執行個體代碼。這裡的代碼我們可以參考并且修改,用來測試或仿真某一個協定,并且收集協定的傳輸延遲,投遞率等。
doc:doc是幫助文檔。
bindings:bindings目錄是子產品用來綁定Python語言的。
二、子產品說明
1.常用子產品
Core:ns-3的核心子產品,實作了ns-3的基本機制,如智能指針(Ptr)、屬性(attribute)、回調(callback)、随機變量(random ariable)、日志(logging)、追蹤(tracing)和事件排程(event scheduler)等内容。
Network: 網絡資料分組(packet)的子產品,一般仿真會用到。
Internet: 實作了關于TCP/IPv4和IPv6的相關協定族,包括IPv4、IPv6、ARP、UPP、TCP、鄰居發現和其他相關協定,目前大多數網絡都是基于Internet協定棧的。
Applications: 集中常用的應用層協定
Mobility: 移動模型子產品
Topolopy-read: 讀取指定軌迹檔案資料,按照指定格式生成相應的網絡拓撲。網絡協定時能量不得不考慮。
Status: 統計架構子產品,友善ns-3仿真的資料收集、統計和分析。
Tools: 統計工具,包括統計作圖工具gnuplot的接口和使用。
Visualizer: 可視化界面工具PyViz
Netanim: 動畫示範工具Netnim
Propagation: 傳播模型子產品
Flow-monitor: 流量監控子產品。
2.幾種典型的網絡子產品
Point-to-point: 實作點對點通信的網絡
CSMA: 實作了基于IEEE802.3的以太網絡,包括MAC層、實體層和媒體信道。
Wifi: 如何實作基于IEEE 802.11 a/b/g的無線網絡,可以是有基礎設施的也可以是ad hoc網絡。
Mesh: 實作基于IEEE 802.11s的無線mesh網絡。
Wimax: 實作了基于IEEE802.16标準的無線城域網絡。
LTE: (long term evolution,長期演進)是第三代合作夥伴計劃(3GPP,3rd generation partnership project )主導的通用移動通信系統(UMTS,universal mobile telecommunications system)技術的長期演進。
UAN: ns-3的水聲通信網絡(UAN,underwater acoustic network)子產品,能仿真水下網絡場景。實作了信道、實體層和MAC層。
3.對新技術
Click: ns-3中內建的可程式設計子產品化的軟體路由(the click modular router)。
Openflow: 在ns-3中仿真OpenFlow交換機。
MPI: 并行分布式離散事件仿真,ns-3實作了标準的資訊傳遞接口(MPI,message passing interface)。
Emu:ns-3可以內建到實驗床和虛拟機環境下。
參考部落格:http://www.cnblogs.com/tempal/p/3798917.html