1. 程式人生 > >基於Linux環境下的NS3入門第一例子

基於Linux環境下的NS3入門第一例子

安裝完基於Linux環境下的NS3後,可以先嚐試熟悉其模擬流程,下面以NS3自帶example/tutorial/first.cc為第一個例子介紹:

1.首先需要明確NS3模擬環境裡幾個重要概念:

節點,有NodeContainer類描述,它提供了用於管理計算裝置的各種方法;

通道和網路裝置:通道指的是資料流流過打媒介,網路裝置指的是用於上網打硬體及網絡卡驅動程式,網路裝置、通道。在真實的世界中,這些東西大致相當於網絡卡和網線。需要說明的是這兩樣東西緊密的聯絡在一起而不能夠把它們互動地使用(比如乙太網裝置和無線通道就不能一起使用)。在這個指令碼中使用了PointToPointHelper來配置和連線網路裝置PointToPointNetDevice和通道PointToPointChannel物件。

應用程式:用Application類來描述。這個類提供了管理模擬過程中使用者層應用的各種方法。開發者應當用面向物件的方法自定義和建立新的應用。在本教程中,我們會使用Application類的兩個例項:UdpEchoClientApplication和UdpEchoServerApplication。這些應用程式包含了一個client應用和一個server應用來發送和迴應模擬網路中的資料包。

其他打協議棧可由InternetStackHelper類描述,IP地址管理可由Ipv4AddresssHelper類和Ipv4InterfaceContaner類描述

2.編輯指令碼程式,這裡使用的NS3自帶例子,所以可以直接進入ns-3.xx/examples/tutorial目錄會發現first.cc指令碼,可以

vim first.cc
#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;//不用NS3::XX

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

int main (int argc, char *argv[])

{
LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
NodeContainer nodes;
nodes.Create (2);//建立2個node節點

PointToPointHelper pointToPoint;//管理NetDevice類和Channel類
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);//為2個node節點安裝網路裝置及分配節點間通道

InternetStackHelper stack;
stack.Install (nodes);//為2個節點直接加上協議棧如TCP/UDP

 Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");//分配IPV4地址,從10.1.1.0開始
Ipv4InterfaceContainer interfaces = address.Assign (devices);//為兩個裝置分配地址

 UdpEchoServerHelper echoServer (9);//分配伺服器埠為9
ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
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));

Simulator::Run ();//執行
Simulator::Destroy ();

 return 0;

}


3.執行指令碼程式

要執行自己的指令碼,你所需要做的僅僅是把你的指令碼放到scratch目錄下,通過waf,這樣你的指令碼就會被編譯。

cp examples/tutorial/first.cc scratch/myfirst.cc
現在使用waf命令來編譯自己的第一個例項指令碼:
sudo ./waf
現在你能夠執行這個例子(注意如果你在scratch目錄編譯了你的程式,你必須在scratch目錄外執行它):
.sudo /waf --run scratch/myfirst

注意這裡是myfirst而不是myfirst.cc!

最終會看到:

Waf: Entering directory `/home/yan/NS3/ns-allinone-3.25/ns-3.25/build'
Waf: Leaving directory `/home/yan/NS3/ns-allinone-3.25/ns-3.25/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (1.879s)
At time 2s client sent 1024 bytes to 10.1.1.2 port 9
At time 2.00369s server received 1024 bytes from 10.1.1.1 port 49153
At time 2.00369s server sent 1024 bytes to 10.1.1.1 port 49153
At time 2.00737s client received 1024 bytes from 10.1.1.2 port 9

4.分析模擬結果