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