UNIVERSITY OF CAGLIARI NS-3 Network Simulator NS

13/03/2017
NS-3
UNIVERSITY OF CAGLIARI
•
•
•
•
•
•
•
DIEE - Department of Electrical and Electronic Engineering
NS-3 Network Simulator
Dott. Ing. Mauro Fadda
Dott. Ing. Mauro Fadda
MCLab
1
Introduzione
Concetti Principali
Direct Code Execution
Struttura di uno Script NS-3
Simulazione
Gnuplot
NetAnim
Dott. Ing. Mauro Fadda
Introduzione
MCLab
2
Introduzione
Il simulatore NS-3 è un simulatore di rete modulare ad eventi discreti opensource concepito principalmente per la ricerca e l'uso didattico
Modellizza il funzionamento delle principali reti di dati a pacchetto e consente
la simulazione per valutarne utilizzo e performance
NS-3 è stato progettato come un insieme di librerie interne che possono essere
combinate tra loro e altre librerie esterne al software che possono essere
facilmente integrate.
Lo scripting in NS-3 è fatto in C ++ e Python -> la maggior parte delle API sono
disponibili in Python ma i modelli sono scritti in C ++
Particolarmente efficace per studi difficilmente eseguibili con i sistemi reali (ad
esempio per studiare il comportamento del sistema in un ambiente altamente)
e per analisi in ambiente riproducibili
Dott. Ing. Mauro Fadda
MCLab
3
Dott. Ing. Mauro Fadda
MCLab
4
13/03/2017
Introduzione
Concetti Principali
Caratteristiche principali:
Live visualizer
Sviluppato attivamente
“logging facility” per il debug
“tracing facility” per la stampa dei risultati
Può essere utilizzato connesso ad una rete reale
Direct Code Execution (DCE)
Ogni entità è implementata in un singolo modello -> ogni modulo ha i suoi
“attributi”
Le funzionalità dei singoli modelli sono fornite da diverse funzioni membro
scritte in C++
Per ogni modello sono disponibili API di aiuto per facilitare la programmazione
o il semplice utilizzo
È facile estendere i modelli per aggiungere nuove caratteristiche e funzionalità
così come è facile aggiungere un nuovo modulo
Dott. Ing. Mauro Fadda
MCLab
5
Dott. Ing. Mauro Fadda
Concetti Principali
MCLab
6
Concetti Principali
In NS-3 il dispositivo di elaborazione (computing device) di base è
chiamato nodo e tale astrazione è rappresentata in C++ dalla classe Node
In ns-3 l'idea di base di un programma utente che genera qualche attività da
simulare è l'applicazione e tale astrazione è rappresentata in C++ dalla classe
Application
La classe Node fornisce i metodi per la gestione delle rappresentazioni di
dispositivi di elaborazione nelle simulazioni
La classe Application fornisce metodi per la gestione delle rappresentazioni
della versione di applicazioni a livello utente (user-level-application) nelle
simulazioni
Si può vedere un nodo come un computer a cui è possibile aggiungere
funzionalità -> applicazioni, stack protocollari e schede periferiche con
relativi driver associati per consentire al computer di funzionare come si
desidera
Solitamente vengono utilizzate specializzazioni della classe applicazione
chiamate UdpEchoClientApplication e UdpEchoServerApplication ->
compongono un set di applicazioni client/server utilizzato per generare e gestire
pacchetti di rete simulati
Dott. Ing. Mauro Fadda
Dott. Ing. Mauro Fadda
MCLab
7
MCLab
8
13/03/2017
Concetti Principali
Concetti Principali
In NS-3 un nodo si collega a un oggetto che rappresenta un canale di
comunicazione -> la base di astrazione è chiamato canale ed è rappresentato in
C++ dalla classe Channel
In NS-3 l'astrazione del dispositivo di rete comprende sia il driver del software
che l'hardware simulato
La classe Channel fornisce metodi per la gestione di sottoreti di comunicazione
e il loro collegamento ai nodi
Un dispositivo di rete è “installato” in un nodo per consentire al nodo stesso di
comunicare con altri nodi tramite canali -> proprio come in un vero computer,
un nodo può essere collegato a più di un canale attraverso molteplici
NetDevices
I canali possono anche essere personalizzati dagli sviluppatori in modo objectoriented -> è possibile modellare qualcosa di semplice come un filo piuttosto
che uno switch Ethernet o un particolare spazio tridimensionale pieno di
ostruzioni (ad esempio nel caso di reti wireless)
La classe in C++ è NetDevice e fornisce metodi per la gestione delle connessioni
al nodo e al canale
Sono presenti ad esempio CsmaChannel, PointToPointChannel e WifiChannel
Anche in questo caso sono presenti
PointToPointNetDevice, e WifiNetDevice
Dott. Ing. Mauro Fadda
MCLab
9
Dott. Ing. Mauro Fadda
Concetti Principali
Dal momento che il collegamento tra NetDevices e nodi, NetDevices e canali,
assegnazione degli indirizzi IP, ecc., sono attività comuni in NS-3, vengono
fornite dalle cosiddette “helper topology” per rendere queste operazioni il più
semplici possibile
Ad esempio, essa può effettuare molte operazioni di base come creare un
netdevice, aggiungere un indirizzo MAC, installare tale dispositivo su un nodo,
configurare uno stack protocollare del nodo, o collegare il NetDevices a un
canale
MCLab
esempio
CsmaNetDevice,
10
MCLab
Concetti Principali
In una rete simulata di grandi dimensioni è necessario organizzare molte
connessioni tra Nodi, NetDevices e Canali
Dott. Ing. Mauro Fadda
ad
11
Application
Application
Application
Application
Sockets-like
API
Protocol
stack
Protocol
stack
Packet(s)
Node
NetDevice
NetDevice
Node
Channel
NetDevice
NetDevice
Channel
Dott. Ing. Mauro Fadda
MCLab
12
13/03/2017
Concetti Principali
bridge
mesh
Direct Code Execution
aodv
visualyzer
dsdv
config-store
olsr
flow
monitor
click
netanim
nix-vectorrouting
stats
openflow
topology
read
applications
csma
emu
spectrum
Internet
(IP v4 – v6)
energy
tap-bridge
mpi
p2p
uan
LTE
virtual net
device
network
wimax
wifi
core
Dott. Ing. Mauro Fadda
Implementazione realistica in topologie controllate o ambiente wireless
Disponibilità del modello
Debug di un intera rete all'interno di un unico processo
Limitazioni
mobility
propagation
MCLab
Virtualizzazione leggera di kernel e di processi applicazione, interconnessi da
reti simulate
Benefici
Non scalabile come una semplice simulazione
Tracing più limitato
Configurazioni diverse
13
Dott. Ing. Mauro Fadda
Direct Code Execution
Il tempo di simulazione si muove discretamente da evento ad evento
Gli eventi pianificati (schedule events) si verificano durante la simulazione uno
specifico numero di volte
Le chiamate di sistema vengono catturate e trattate direttamente dal DCE
Il programmatore di simulazione decide lo specifico evento da eseguire
Le chiamate dei protocolli di rete vengono catturate e reindirizzate
Per eseguire il suo lavoro il framework DCE re-implementa il loader Linux e
parte delle librerie libc e libpthread
MCLab
14
Struttura di uno Script NS-3
IL framework DCE/ns-3 richiede la virtualizzazione di una serie di servizi -> più
istanze isolate dello stesso protocollo sulla stessa macchina
Dott. Ing. Mauro Fadda
MCLab
15
Il simulatore esegue gli eventi singolarmente
La simulazione può terminare in un momento specifico o quando gli eventi
schedulati sono terminati
Dott. Ing. Mauro Fadda
MCLab
16
13/03/2017
Struttura di uno Script NS-3
Struttura di uno Script NS-3
Per effettuare una simulazione bisogna prima scrivere uno script di
simulazione in C++
La libreria NS-3 andrà indicizzata per rendere la simulazione executable
Le API vengono utilizzate per eseguire determinate simulazioni
La build di sistema WAF viene utilizzata per costruire la simulazione
Dott. Ing. Mauro Fadda
MCLab
17
1. Impostare gli argomenti della riga di comando
2. Impostare i valori degli attributi di default e casuali
3. Creare i nodi
4. Configurare il livello fisico e MAC
5. Attivare PCAP (packet capture) tracing
6. Impostare il livello di rete, il routing e gli indirizzi
7. Configurare e installare le applicazioni
8. Impostare posizioni iniziali dei nodi ed eventuale mobilità
9. Connettere trace sources e sinks
10. Programmare eventi definiti dall'utente e avviare la simulazione
Dott. Ing. Mauro Fadda
Struttura di uno Script NS-3
MCLab
18
Struttura di uno Script NS-3
Il codice inizia con una serie di include statements
La successiva riga dello script è del tipo
#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“
NS_LOG_COMPONENT_DEFINE ("ScriptExample");
Questa riga dichiara una componente di registrazione chiamata “ScriptExample”
che consente di attivare e disattivare console di registrazione dei messaggi
riferiti a questo nome
La linea successivat dello script .cc è una dichiarazione namespace
using namespace ns3;
Il progetto NS-3 è dunque implementato in un namespace C++ chiamato ns3 ->
raggruppa tutte le relative dichiarazioni
Dopo questa dichiarazione sarà sufficiente digitare NS3:: seguito dall’elemento che si
desidera utilizzare
Dott. Ing. Mauro Fadda
MCLab
19
Dott. Ing. Mauro Fadda
MCLab
20
13/03/2017
Struttura di uno Script NS-3
Struttura di uno Script NS-3
Le righe successive dello script sono
Andranno configurati gli argomenti per poter avviare lo script da riga di
comando -> ./waf --run ”ScriptExample--spacing=100”
int main (int argc, char * argv [])
{
Questa è solo la dichiarazione della funzione principale dello script -> proprio come in
qualsiasi programma C++ è necessario definire una funzione principale che sarà la
prima ad essere eseguita
La riga successiva imposta la risoluzione temporale di un nanosecondo che risulta
essere il valore di default
Time :: SetResolution (Time :: NS);
La risoluzione è il valore più piccolo che può essere rappresentato (così come la
più piccola differenza rappresentabile tra due valori temporali) -> se non si
imposta la risoluzione in modo esplicito verrà impostata a un nanosecondo
Dott. Ing. Mauro Fadda
MCLab
21
uint32_t rows =4, cols = 4, nodeSpacing = 90, duration = 900, seed = 1;
std::string phyMode("DsssRate11Mbps");
CommandLine cmd;
cmd.AddValue (”phymode", ”Physical transmission mode", phyMode);
cmd.AddValue ("rows", "Rows of nodes", rows);
cmd.AddValue ("cols", "Columns of nodes", cols);
cmd.AddValue ("spacing", "Spacing between neighbouring nodes", nodeSpacing);
cmd.AddValue ("duration", "Duration of simulation", duration);
cmd.AddValue (”seed", ”Random seed for simulation", seed);
cmd.Parse (argc,argv);
uint32_t numNodes = rows * cols;
…
Dott. Ing. Mauro Fadda
Struttura di uno Script NS-3
22
Struttura di uno Script NS-3
Successivamente vengono settati gli attributi di default e casuali
Config::SetDefault("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("2200"));
Config::SetDefault("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("2200"));
Config::SetDefault("ns3::WifiRemoteStationManager::NonUnicastMode", StringValue (phyMode));
Config::SetDefault("ns3::ConstantRateWifiManager::DataMode", StringValue(phyMode));
Config::SetDefault("ns3::ConstantRateWifiManager::ControlMode", StringValue(phyMode));
Config::SetDefault("ns3::YansWifiPhy::RxGain", DoubleValue(-10)); Config::SetDefault("ns3::YansWifiPhy::TxGain",
DoubleValue(1));
A questo punto andranno creati i nodi ma va fatta una premessa -> la maggior
parte dei componenti definiti in NS-3 è gestita per mezzo di contenitori
(containers)
le simulazioni spesso consistono di molti componenti dello stesso tipo
vengono utilizzati ad esempio da classi helper per installare le componenti
necessarie (dispositivi, stacks, applicazioni, mobilità, ecc.)
ogni singolo nodo all’interno del contenitore è accessibile utilizzando il metodo
Get()-> method
NodeContainer nodes;
nodes.Create (numNodes);
…
Ptr first = nodes.Get(0)
// Set seed for pseudorandom number generator
SeedManager::SetSeed (seed);
Dott. Ing. Mauro Fadda
MCLab
MCLab
23
Dott. Ing. Mauro Fadda
MCLab
24
13/03/2017
Struttura di uno Script NS-3
Struttura di uno Script NS-3
Una volta definiti, i nodi risultano vuoti quindi vanno definiti protocolli,
applicazioni, antenna, NIC ecc.
Allo stesso modo vengono utilizzati gli helpers per configurare il canale
Gli helpers rendono lo scripting molto più semplice. Di seguito è possibile
vedere un esempio di come viene definito il livello fisico
YansWifiChannelHelper wifiChannel ;
wifiChannel.SetPropagationDelay("ns3::ConstantSpeedPropagationDelayModel");
wifiChannel.AddPropagationLoss ("ns3::FriisPropagationLossModel");
wifiPhy.SetChannel (wifiChannel.Create ());
YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
wifiPhy.Set ("RxGain", DoubleValue (-10) );
wifiPhy.SetPcapDataLinkType(YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
Per la scelta del canale è possibile utilizzare diverse leggi di propagazione come
ad esempio ns3::TwoRayGroundPropagationLossModel
Dott. Ing. Mauro Fadda
MCLab
25
Dott. Ing. Mauro Fadda
Struttura di uno Script NS-3
1.
2.
3.
4.
5.
NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue(phyMode));
wifiMac.SetType ("ns3::AdhocWifiMac");
In questo esempio è stato utilizzato
un modello MAC di tipo Non-QoS
rate costante in trasmissione e ritrasmissione
data mode settato ”DsssRate11Mbps”
MCLab
26
Struttura di uno Script NS-3
Allo stesso modo vengono utilizzati gli helpers per configurare il livello MAC
Dott. Ing. Mauro Fadda
MCLab
Vengono installati i singoli dispositivi
Impostata l’interfaccia wireless in modalità ad-hoc
Selezionato lo standard (ad esempio 802.11b)
Installato il livello MAC layer per tutti i nodi del contenitore nodes
Connessi i nodi al canale
NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue(phyMode));
wifiMac.SetType ("ns3::AdhocWifiMac");
WifiHelper wifi; wifi.SetStandard (WIFI_PHY_STANDARD_80211b);
NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, nodes);
27
Dott. Ing. Mauro Fadda
MCLab
28
13/03/2017
Struttura di uno Script NS-3
Struttura di uno Script NS-3
Dopo aver impostato il livello MAC viene abilitato il tracing (enable tracing) che
genera un file per ogni interfaccia del singolo nodo nella directory corrente
Visto che stiamo considerando una rete WiFi andrà selezionato un algoritmo di
routing -> attualmente NS-3 supporta OLSR, AODV e DSDV
wifiPhy.EnablePcap ("MANET", devices);
Successivamente vengono installati tutti i protocolli di livello rete (IP, TCP, UDP,
ARP e ICM) e assegnati gli indirizzi IP ai singoli nodi
Essendo il prefisso impostato come ”MANET” i nomi dei file risulteranno
MANET-X-Y.pcap dove X è il node e Y il dispositivo -> questi file possono essere
visualizzati con il comando
OlsrHelper olsr;
InternetStackHelper internet;
internet.SetRoutingHelper (olsr);
internet.Install (nodes);
Ipv4AddressHelper address;
address.SetBase ("10.0.0.0", "255.255.255.0");
Ipv4InterfaceContainer interfaces = address.Assign (devices);
tcpdump –r MANET-X-Y.pcap
Dott. Ing. Mauro Fadda
MCLab
29
Dott. Ing. Mauro Fadda
Struttura di uno Script NS-3
// Server/Receiver
UdpServerHelper server (4000);
ApplicationContainer apps = server.Install (nodes.Get(1));
apps.Start (Seconds (1.0)); apps.Stop (Seconds (10.0));
I nodi hanno a disposizione metodi per gestire puntatori a dispositivi,
applicazioni, stack protocollari, mobilità e modelli energetici
Ptr app = node->GetApplication(0);
Ptr nic = node->GetDevice(0);
Ptr ip = nodes.Get(0)->GetObject();
Ipv4Address addr = ip->GetAddress(1,0).GetLocal();
// Client/Sender
UdpClientHelper client (interfaces.GetAddress (1), 4000);
client.SetAttribute ("MaxPackets", UintegerValue (320));
client.SetAttribute ("Interval", TimeValue (Seconds(0.05)));
client.SetAttribute ("PacketSize", UintegerValue (1024));
apps = client.Install (nodes.Get (0));
apps.Start (Seconds (2.0)); apps.Stop (Seconds (9.0));
MCLab
30
Struttura di uno Script NS-3
Impostazione degli attributi, istante di inizio e fine dell’applicazione secondo la
durata della simulazione
Dott. Ing. Mauro Fadda
MCLab
Sono a disposizione diverse alternative per la mobilità:
Random mobility- random waypoint- random walk
Definita dall’utente: velocità, posizione e accelerazione costanti
31
Dott. Ing. Mauro Fadda
MCLab
32
13/03/2017
Simulazione
Simulazione
Per poter lanciare le simulazioni è necessario che lo script sia salvato dentro la
cartella scratch
La cartella scratch si trova
dentro la cartella della
versione di NS-3 che si sta
usando
Questo è un esempio di
file .cc contenente la
simulazione
Dott. Ing. Mauro Fadda
MCLab
33
Per lanciare il proprio script è sufficiente digitare sul terminale il path e poi il
comando ./waf –run scratch/nomedelloscript
I risultati ottenuti possono essere:
Visualizzati sulla shell
Salvati su file
Dott. Ing. Mauro Fadda
Simulazione
MCLab
34
Gnuplot
Gnuplot è un programma che permette di realizzare e visualizzare i grafici
Una volta lanciato lo script è possibile elaborare i risultati ottenuti attraverso
una serie di programmi esterni:
Gnuplot per la visualizzazione dei grafici (http://www.gnuplot.info)
NetAnim per la visualizzazione della rete e l’animazione della simulazione
(https://www.nsnam.org/wiki/NetAnim)
Utilizzando dei semplici comandi è possibile realizzare diversi tipi di grafici e
impostarne le proprietà
$ gnuplot
È sufficiente digitare nella shell il commando gnuplot per lanciare il
programma
Dott. Ing. Mauro Fadda
MCLab
35
Dott. Ing. Mauro Fadda
MCLab
36
13/03/2017
Gnuplot
Gnuplot
Qualche piccolo esempio di comandi:
gnuplot> set terminal png size 640,480
Serve per settare lo sfondo del grafico
gnuplot> set output "nomeDelGraficoInOutput.png"
Serve per impostare il nome dell’output
gnuplot> plot "inputFileData.dat" using 1:2 title 'Congestion Window' with
linespoints
Impostiamo il file che contiene in nostri dati dicendogli di utilizzare le
prime due colonne dei dati contenuti del file, il titolo del grafico e il tipo
di grafico che si desidera realizzare
Qualche esempio di grafici realizzati con Gnuplot
Grafico 2D
Dott. Ing. Mauro Fadda
MCLab
37
Dott. Ing. Mauro Fadda
NetAnim
Si basa su QT toolkit e utilizza file xml creati durante la simulazione
NetAnim presenta una finestra grazie alla quale è possibile visualizzare la
simulazione e vederne l’animazione
Tempo di simulazione
Velocità di
simulazione
L’utilizzo di NetAnim si divide in due sole fasi:
1. Generare il file xml durante la simulazione inserendo la libreria
ns3::AnimationInterface all’interno del codice c++ della simulazione vera e
propria
2. Caricare il file xml con NetAnim
MCLab
38
MCLab
NetAnim
NetAnim è un programma per la visualizzazione delle reti simulate e delle
rispettive animazioni
Dott. Ing. Mauro Fadda
Grafico 3D
39
Scenario
della
simulazione
Nodi
Dott. Ing. Mauro Fadda
MCLab
40
13/03/2017
NetAnim
NetAnim
NetAnim presenta una finestra grazie alla quale è possibile visualizzare la
simulazione e vederne l’animazione
Proprietà dello
scenario
Ricarica
file xml
Facendo doppio clic sul nodo è possibile visualizzane e modificarne alcune
proprietà e visualizzarne la posizione al passare del tempo di simulazione
il
Proprietà del nodo
Passo di simulazione
Posizione del nodo al
passare del tempo
Timeline dei
pacchetti
Dott. Ing. Mauro Fadda
MCLab
41
UNIVERSITY OF CAGLIARI
DIEE - Department of Electrical and Electronic Engineering
Grazie per l’attenzione
Il tutorial e la documentazione di
NS3 si possono trovare sul sito:
www.nsnam.org/
Dott. Ing. Mauro Fadda
MCLab
43
Dott. Ing. Mauro Fadda
MCLab
42