NS3學習之整體介紹


NS3整體介紹
目錄結構
src目錄是ns-3的源代碼目錄,其目錄結構基本和ns-3模塊相對應

這些模塊目錄的子目錄都是固定的。

bindings/ 綁定python語言的
doc/ 幫助文檔
examples/ 應用該模塊的示例代碼
helper/ 模塊對應的helper類源文件
model/ 模塊代碼的.cc和.h文件
test/ 模塊設計者編寫的模塊測試代碼
wscript
一些常用模塊

模塊 用途
core ns3內核模塊,實現了ns-3的基本機制,智能指針,屬性,回調,隨機變量,日志,追蹤,事件調度等
network 網絡數據分組模塊,一般仿真都會使用
Internet 實現了TCP/IP相關的協議族,IP, ARP, UDP, TCP等
applications 幾種常見的應用層協議
mobility 移動模型模塊,為節點添加移動屬性
status 統計框架模塊,方便對仿真數據的收集、分析和統計
tools 統計工具,作圖工具gunplot
netanim 動畫演示工具
visualizer 可視化界面工具
幾種典型的網絡模塊

模塊 用途
point-to-point 點對點網絡
CSMA 實現基於IEEE802.3的以太網網絡,包括MAC層,物理層和媒體信道
Wi-Fi 實現基於IEEE802.11a/b/g的無線網絡,也可以是有基礎設施的ad hoc網絡
mesh 實現基於IEEE802.11s的無線mesh網絡
wimax 實現基於IEEE802.16標准的無線城域網絡
幾種ad hoc網絡路由協議模塊 :aodv, dsdv, olsr。

這些模塊當中,core,network,internet和status是ns-3的基礎模塊,學習和開發其它模塊首先要掌握這幾個基礎模塊。

ns3 關鍵概念
節點
ns-3中的基本計算設備被抽象為節點。此節點是一個可以添加各種功能的計算機。當然僅僅是個計算機,要想使它工作,還需要添加網卡,協議棧,應用程序。

在ns-3中節點用Node類來描述,下面兩行代碼會創建兩個節點對象,它們在仿真中代表計算機

NodeContainer nodes;
nodes.Create(2);
1
2
應用
計算機軟件中通常分為系統軟件和應用軟件。應用軟件完成用戶工作,系統軟件管理計算機中的內存,CPU,硬盤,網絡等各種資源。在ns-3中並沒有正常的操作系統的概念,但是用應用程序的概念。在ns-3中,需要被仿真的用戶程序被抽象為應用。在C++中用Application類描述。

bulk-send-application
on-off-application
udp-client/server
udp-echo-client/server

1
2
3
4
5
信道
通常把網絡中數據流過的媒介稱作為信道,在ns-3中,節點需要連接到信道上來進行數據交換,在C++中用Channel類來描述,一個信道實例可以模擬一條簡單的線纜,也可以是一個復雜的巨型以太網交換機,甚至是一個無線網絡中充滿障礙物的三維空間。

CsmaChannel
PointToPointChannel
Wi-FiChannel
1
2
3
網絡設備
把計算機連接到網絡上,必須用網線連接到網卡上。現在計算機出廠的時候都已經配置了網卡,所以用戶一般看不到這些模塊。一張網卡只是個外圍設備,設備需要驅動軟件來控制,如果缺少軟件驅動它還是不能工作的。在ns-3中,網絡設備這一抽象概念相當硬件設備和軟件驅動的總和。網絡設備安裝在節點上,然后節點之間通過信道和其他節點通信。這個網絡和信道是相對應的,就像無線網卡不能連接網線,只能在在無線環境中使用。C++中用NetDevice類來描述網絡設備。

CsmaNetDevice
PointToPointNetDevice
Wi-FiNetNevice
1
2
3
搭建網絡仿真場景和搭建真實網絡類似
首先要有網絡節點(Node),節點需要有網絡設備(NetDevice),網絡設備需要通過傳輸媒體(Channel)連接

仿真腳本的編寫
腳本編寫一般都是經過以下步驟

步驟 實例
1. 創建節點 NodeContainer
2. 創建鏈路類型 XxxDeviceHelper
3. 安裝鏈路類型,生成網卡 XxxDeviceContainer=XxxDeviceHelper.install(NodeContainer)
4. 安裝協議棧 XxxStack.install(NodeContainer)
5. 配置IP地址 XxxAddressHelper.setBase(“IP”,“NETMASK”)
6. 生成網絡接口 XxxInterfaceContainer = XxxAddressHelper.Assign(NetDeviceContainer )
7. 安裝應用 ApplicationContainer = XxxHelper.Install(NodeContainer);
8. 開始仿真
結合 tutroial/first.cc 例子講解,first.cc兩個P2P節點,client節點向server節點發送數據,server回顯數據。

示例中僅發送了一個數據包。MaxPacket屬性是數據包數量,Interval是發送間隔,PacketSize是數據包大小

main (int argc, char *argv[])
{
CommandLine cmd;
cmd.Parse (argc, argv);

Time::SetResolution (Time::NS);
LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);

//1. 創建節點
NodeContainer nodes;
nodes.Create (2);

//2.為節點創建P2P類型的鏈路,並配置鏈路屬性
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

//3.安裝鏈路,生成網卡
NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);

//4.安裝協議棧
InternetStackHelper stack;
stack.Install (nodes);

//5.為網卡配置IP
Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");
//6.生成網絡接口
Ipv4InterfaceContainer interfaces = address.Assign (devices);

UdpEchoServerHelper echoServer (9);
ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));

//7.配置應用
UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));

//8.開始仿真
Simulator::Run ();
Simulator::Destroy ();
return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
ns3拓撲構造
構建拓撲一般是使用以下步驟

先構建節點,網絡類型。節點使用網絡連接起來生產網卡
給網卡綁定IP地址,生成網絡接口(之后可以在接口上做業務)
使用拓撲幫助

Device = Helper.Install(Node);
/* 生成網卡
Device是網卡
Helper是網絡類型,
Node是要來連接的節點
*/

Interface = Address.Assign(Device);
/*
綁定IP
Interface是網絡接口接口,供后續Application使用
Address是網絡地址,是一個網段
Device是網卡
*/

Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
/*
用拓撲幫助類構建路由
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
點對點網絡示例

NodeContainer c;
c.create(2);

NodeContainer n0n1 = NodeContainer(c.Get(0), c.Get(1));

PointToPointHelper p2p;
p2p.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
p2p.SetChannelAttribute ("Delay", StringValue ("2ms"));
NetDeviceContainer d0d1 = p2p.Install (n0n1);

Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");
xxx = address.Assign (d0d1);
// 為d0d1里的兩個節點分配ip, 10.1.1.1 -------10.1.1.2

Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
以太網總線網絡

NodeContainer c;
c.create(4);

CsmaHelper n0n1n2n3 = NodeContainer(c.Get(0), c.Get(1), c.Get(2), c.Get(3));
//CsmaHelper n0n1n2n3 = NodeContianer(c);
csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));
csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560)));
NetDeviceContainer d0d1d2d3 = csma.Install (n0n1n2n3);

Ipv4AddressHelper address;
address.SetBase ("10.1.2.0", "255.255.255.0");
xxx = address.Assign (d0d1d2d3);
// 為d0d1d2d3中的節點分別分配ip
// 10.1.2.1----10.1.2.2----10.1.2.3----10.1.2.4
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
無線網拓撲

NodeContainer c;
c.create(3);

// 讓第一個節點做AP節點,其他的連接這個AP
NodeContainer ApNode = c.Get(0);

// 其他的做無線設備,連接AP節點
NodeContainer StaNode = NodeContainer(c.Get(1), c.Get(2));

WifiHelper wifi;
wifi.SetRemoteStationManager ("ns3::AarfWifiManager");

WifiMacHelper mac;
Ssid ssid = Ssid ("ns-3-ssid");


//設置AP節點網絡
mac.SetType ("ns3::ApWifiMac",
"Ssid", SsidValue (ssid));
NetDeviceContainer apDevices = wifi.Install (phy, mac, wifiApNode);

//設置無線設備網絡
mac.SetType ("ns3::StaWifiMac",
"Ssid", SsidValue (ssid),
"ActiveProbing", BooleanValue (false));
NetDeviceContainer staDevices = wifi.Install (phy, mac, wifiStaNodes);

Ipv4AddressHelper address;
address.SetBase ("10.1.2.0", "255.255.255.0");
address.Assign (staDevices);
address.Assign (apDevices);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
應用
所有應用程序要分別用apps.Start(), apps.Stop()設置應用的啟動停止時間,注意服務器程序要比客戶端早啟動

UdpClient,UdpServer
Udp應用,顧名思義,構建一個udp應用,客戶端往服務器端發數據。可以設置數據包的大小,數量,發送間隔

在一個節點上安裝udpserver

NodeContainer c;
c.create(2);
...
...
uint16_t port = 4000;
UdpServerHelper server (port);
ApplicationContainer apps = server.Install (c.Get (1));
apps.Start (Seconds (1.0));
apps.Stop (Seconds (10.0));
1
2
3
4
5
6
7
8
9
在一個節點上安裝udpclient

UdpClientHelper client (serverAddress, port);//綁定服務器地址,地址用interface.GetAddress方法獲取
client.SetAttribute ("MaxPackets", UintegerValue (320));//發送多少個包
client.SetAttribute ("Interval", TimeValue (0.05));//發送間隔
client.SetAttribute ("PacketSize", UintegerValue (1024));//包大小
apps = client.Install (n.Get (0));//安裝到哪個節點
apps.Start (Seconds (2.0));
apps.Stop (Seconds (10.0));
1
2
3
4
5
6
7
OnOffApplication
OnOff應用是個開關應用,開的時候產生流量,關的時候不產生流量。

BulkSendApplication
PacketSink
移動模型
MobilityHelper 類用來設置節點移動模型
SetPositionAllocator

MobilityHelper mobility
mobility.SetPositionAllocator()//設置節點初始位置
mobility.SetMobilityModel() //設置節點運動方式
1
2
3
初始位置-網格布局
mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
"MinX", DoubleValue (-100.0),
"MinY", DoubleValue (-100.0),
"DeltaX", DoubleValue (5.0),
"DeltaY", DoubleValue (20.0),
"GridWidth", UintegerValue (20),
"LayoutType", StringValue ("RowFirst"));
1
2
3
4
5
6
7
GridPositionAllocator的屬性以及默認值

“GridWidth”, “一行最多有幾個節點”,UintegerValue (10),
“MinX”, “網格布局起始處在x軸上的坐標.”,DoubleValue (1.0)
“MinY”, “網格布局起始處在y軸上的坐標.”,DoubleValue (0.0)
“DeltaX”, “x軸上節點間的距離.”,DoubleValue (1.0)
“DeltaY”, “y軸上節點間的距離”, DoubleValue (1.0)
“LayoutType”, “布局類型.”,EnumValue (ROW_FIRST)
如果有100個節點,GirdWidth值為10,則一行10個,共10行,Girdwidth為20,則一行20個,共5行

初始位置-隨機布局
在一個圓內隨機布局

mobility.SetPositionAllocator ("ns3::RandomDiscPositionAllocator",
"X", StringValue ("100.0"),
"Y", StringValue ("100.0"),
"Rho", StringValue ("ns3::UniformRandomVariable[Min=0|Max=30]"));
1
2
3
4
RandomDiscPositionAllocator屬性以及默認值

“Theta”,“隨機角度.”, StringValue (“ns3::UniformRandomVariable[Min=0.0|Max=6.2830]”),
“Rho”,“隨機半徑”, StringValue (“ns3::UniformRandomVariable[Min=0.0|Max=200.0]”),
“X”,“圓心x軸坐標”, DoubleValue (0.0),
“Y”,“圓心y軸坐標”, DoubleValue (0.0)
ns3::UniformRandomVariable[Min=0.0|Max=6.2830] 一個隨機的值,0.0~6.2830

運動模型-固定不動
mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
1
運動模型-隨機運動
在一個2d場景隨機運動,方向和速度都是隨機的

mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel",
"Mode", StringValue ("Time"),
"Time", StringValue ("2s"),
"Speed", StringValue ("ns3::ConstantRandomVariable[Constant=1.0]"),
"Bounds", StringValue ("0|200|0|200"));
1
2
3
4
5
RandomWalk2dMobilityModel模型的屬性以及默認值

“Bounds”,“運動的范圍”, RectangleValue (Rectangle (0.0, 100.0, 0.0, 100.0))
“Time”,“走多久換一次方向”,TimeValue (Seconds (1.0))
“Distance”,"走多遠換一次方向"DoubleValue (1.0),
“Mode”,“Time or Distance”,EnumValue (RandomWalk2dMobilityModel::MODE_DISTANCE)
“Direction”,"隨機方向 (radians)."StringValue (“ns3::UniformRandomVariable[Min=0.0|Max=6.283184]”)
“Speed”“隨機速度 (m/s).”,StringValue (“ns3::UniformRandomVariable[Min=2.0|Max=4.0]”)
Mode 是選擇根據運動時間來變方向還是根據運動距離來變方向

自定義運動
MobilityModel::SetPosition 方法用來控制模型的移動,

//在5秒后node節點會沿x軸,y軸,z軸方向分別移動1米,
Ptr<MobilityModel> mob = node->GetObject<MobilityModel> ();
Simulator::Schedule (Seconds (5.0), &MobilityModel::SetPosition, mob, Vector (1, 1, 1));
————————————————
版權聲明:本文為CSDN博主「特立獨行的一只miao」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_41816035/article/details/88071765


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM