Tutorial di simulatore di rete ns-3. Capitulu 4

Tutorial di simulatore di rete ns-3. Capitulu 4
capitulu 1,2
capitulu 3

4 Panoramica di u cuncettu
4.1 Astrazioni chjave
4.1.1 Node
4.1.2 Applicazione
4.1.3 Canale
4.1.4 Dispositivu Net
4.1.5 Assistenti topologichi
4.2 Primu script ns-3
4.2.1 Codice Boilerplate
4.2.2 Plug-ins
4.2.3 ns3 namespace
4.2.4 Logging
4.2.5 Funzione principale
4.2.6 Utilizà l'assistenti di topulugia
4.2.7 Using Application
4.2.8 Simulatore
4.2.9 Custruì u vostru script
4.3 ns-3 codice surghjente

Capitulu 4

Panoramica di u cuncettu

A prima cosa chì avemu bisognu di fà prima di cumincià à amparà o scrive u codice ns-3 hè di spiegà uni pochi di cuncetti basi è astrazioni in u sistema. A maiò parte di questu pò parè evidenti à alcuni, ma ricumandemu di piglià u tempu per leghje sta sezione per assicurà chì partenu nantu à una basa solida.

4.1 Astrazioni chjave

In questa rùbbrica, guardemu certi termini chì sò cumunimenti usati in u web ma anu un significatu specificu in ns-3.

4.1.1 Node

In l'argo di Internet, un dispositivu di l'informatica chì cunnetta à una reta hè chjamatu un òspite o qualchì volta un sistema finale. Perchè ns-3 hè un simulatore di rete è micca un simulatore di Internet, ùn avemu micca usatu deliberatamente u terminu host, postu chì questu hè strettamente ligatu à Internet è i so protokolli. Invece, usemu un termu più generale, utilizatu ancu da altri simulatori, chì hè urigginatu in a teoria di graffi: node (node).

In ns-3, l'astrazione sottostante di un dispositivu informaticu hè chjamatu node. Questa astrazione hè rapprisintata in C++ da a classe Node. Classe NodeNode (node) furnisce i metudi per manipulà e rapprisintazioni di i dispositi di l'informatica in simulazioni.

Duvete capisce Nodu cum'è un urdinatore à quale aghjunghje funziunalità. Puderete aghjunghje cose cum'è applicazioni, stacks di protokollu è carte periferiche cù drivers chì permettenu à l'urdinatore di fà un travagliu utile. Avemu aduprà u listessu mudellu basi in ns-3.

4.1.2 Applicazione

In generale, u software di l'informatica hè divisu in duie classi larghe. U software di u sistema urganizeghja diverse risorse di l'urdinatore cum'è memoria, cicli di prucessori, discu, rete, etc., secondu un mudellu di computing. U software di u sistema di solitu ùn aduprate micca queste risorse per eseguisce attività chì benefiziu direttamente l'utilizatore. Un utilizatore tipicamente esegue una applicazione per ottene un scopu specificu, chì ottene è usa risorse cuntrullate da u software di u sistema.

Spessu a linea di separazione trà u sistema è u software di l'applicazione hè tracciata à i cambiamenti di livellu di privilegiu chì si trovanu in trappule di u sistema operatore. ns-3 ùn hà micca un veru cuncettu di un sistema operatore è per quessa ùn hè micca cuncettu di livelli di privilegiu o chjama di sistema. Avemu, però, avemu una idea per una app. Cum'è in l'applicazioni software di u "mondu reale" eseguite nantu à l'urdinatori per eseguisce i travaglii, l'applicazioni ns-3 funzionanu nantu à i nodi ns-3 per cuntrullà simulazioni in u mondu simulatu.

In ns-3, l'astrazione basica per un prugramma di l'utilizatori chì genera una certa attività per u mudellu hè una applicazione. Questa astrazione hè rapprisintata in C++ da a classa Applicazione. A classa Applicazione furnisce metudi per manipulà e viste di a nostra versione di l'applicazioni à livellu di l'utilizatori in simulazioni. I sviluppatori sò spezializati in a classa Applicazione in un sensu di prugrammazione orientata à l'ughjettu per creà novi applicazioni. In questu tutoriale, useremu specializazioni di a classa Applicazione chjamata UdpEchoClientApplication и UdpEchoServerApplication. Cum'è puderebbe aspittà, queste applicazioni custituiscenu un inseme d'applicazioni cliente / servitore aduprate per generà è eco di pacchetti di rete.

4.1.3 Canale

In u mondu reale, pudete cunnette un computer à una reta. Spessu i media nantu à quali dati sò trasmessi in queste rete sò chjamati canali. Quandu si inserisce un cable Ethernet in una presa di muru, cunnessi u vostru urdinatore à un ligame Ethernet. In u mondu simulatu ns-3, un node hè cunnessu à un oggettu chì rapprisenta un canale di cumunicazione. Quì, l'astrazione basica di a subnetwork di cumunicazione hè chjamata canale è hè rapprisintata in C ++ da a classa Channel.

Class ChannelChannel furnisce metudi per gestisce l'interazzione di l'uggetti di subnet è cunnetta i nodi à elli. I canali ponu ancu esse specializati da i sviluppatori in un sensu di prugrammazione orientata à l'ughjettu. A specializazione di u canali pò mudificà qualcosa simplice cum'è un filu. Un canali dedicatu pò ancu mudificà e cose cumplessi cum'è un grande switch Ethernet o un spaziu tridimensionale pienu di ostaculi in u casu di e rete wireless.

Useremu versioni specializate di u canali in stu tutorialu chjamatu CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel и WifiChannelWifiChannel. CsmaChannel, per esempiu, mudele una versione di una subnet di cumunicazione chì implementa un ambiente di cumunicazione d'accessu multiplu à u trasportatore. Questu ci dà una funziunalità simile à Ethernet.

4.1.4 Dispositivu Net

Era chì si vulete cunnette un computer à una reta, avete da cumprà un cable di rete specificu è un dispositivu hardware chjamatu (in a terminologia di PC) una carta perifèrica chì deve esse installata in l'urdinatore. Se una carta periferica implementava alcune funzioni di rete, sò stati chjamati carte d'interfaccia di rete o carte di rete. Oghje, a maiò parte di l'urdinatori venenu cù hardware di interfaccia di rete integrata è ùn sò micca vistu da l'utilizatori cum'è dispositi separati.

Una carta di rete ùn funziona micca senza un driver di software chì cuntrolla u so hardware. In Unix (o Linux), un pezzu di apparecchiatura periferica hè classificatu cum'è un dispositivu. I dispositi sò cuntrullati cù driver di dispositivi, è i dispositi di rete (NIC) sò cuntrullati cù driver di dispositivi di rete (i driver di u dispositivu di rete) è sò cullettivamente chjamati dispositivi di rete (dispusitivi net). In Unix è Linux Vi riferite à i dispusitivi di rete cù nomi cum'è et0.

In ns-3, l'astrazione di u dispositivu di a rete copre u driver di u software è u hardware chì hè modellatu. In a simulazione, un dispositivu di rete hè "installatu" in un node per permettenu di cumunicà cù altri nodi per i canali. Cum'è un veru computer, un node pò esse cunnessu à parechji canali attraversu parechji dispositi NetDevices.

L'astrazione di a rete di un dispositivu hè rapprisintata in C++ da a classa NetDevice. Classe NetDevice furnisce metudi per gestisce e cunnessione à l'uggetti Node è Channel; è pò esse specializatu da i sviluppatori in u sensu di prugrammazione orientata à l'ughjettu. In questu tutoriale avemu aduprà parechje versioni specializate di NetDevice chjamatu CsmaNetDevice, PointToPointNetDevice и Dispositivu WifiNet. Cum'è un adattatore di rete Ethernet hè pensatu per travaglià cù una rete Ethernet, CsmaNetDevice cuncepitu per travaglià cù CsmaChannel, PointToPointNetDevice cuncepitu per travaglià cù PointToPointChannele Dispositivu WifiNet - cuncepitu per travaglià cun WifiChannel.

4.1.5 Assistenti topologichi

In una reta reale, truverete l'urdinatori ospiti cù carte di rete aghjunte (o integrate). In ns-3 diceremu chì vi vede nodi cù NetDevices attaccati. In una grande reta simulata, vi tuccherà à urganizà ligami trà parechji uggetti Nodu, NetDevice и Channel.

Dapoi a cunnessione NetDevices à i nodi, NetDevices à ligami, assignendu indirizzi IP, etc. in ns-3 sò un compitu cumunu, per fà questu u più faciule pussibule, furnimu i cosiddetti helpers di topologia. Per esempiu, per creà un NetDevice, avete bisognu di fà parechje operazioni di kernel ns-3, aghjunghje un indirizzu MAC, installate u dispositivu di rete in Node, cunfigurà a pila di protokollu di u node, è dopu cunnette u NetDevice à u Canale. Ancu più travagliu serà necessariu per cunnette parechji dispositi à ligami multipuntu è dopu cunnette e rete individuali in una rete Internetworks. Furnemu l'uggetti di l'aiutu di a topologia chì combina queste parechje operazioni in un mudellu faciule d'utilizà per a vostra comodità.

4.2 Primu script ns-3

Se avete installatu u sistema cum'è suggeritu sopra, avete a liberazione ns-3 in un repertoriu chjamatu repos in u vostru cartulare di casa. Andà à u cartulare etichettatura

Se ùn avete micca un tali repertoriu, significa chì ùn avete micca specificatu u cartulare di output quandu custruisce a versione di liberazione di ns-3, custruisce cusì:
$ ./waf configure -build-profile=release -out=custruisce/rilascia,
$ ./waf build

ci duvete vede una struttura di repertoriu simile à a seguente:

AUTHORS       examples      scratch       utils       waf.bat*
bindings      LICENSE       src           utils.py    waf-tools
build         ns3           test.py*      utils.pyc   wscript
CHANGES.html  README        testpy-output VERSION     wutils.py
doc           RELEASE_NOTES testpy.supp   waf*        wutils.pyc

Andà à u cartulare esempi/tutorial. Duvete vede un schedariu situatu quì chjamatu prima.cc. Questu hè un script chì hà da creà una semplice cunnessione puntu à puntu trà dui nodi è trasmette un pacchettu trà i nodi. Fighjemu stu script linea per linea; per fà questu, apre first.cc in u vostru editore preferitu.

4.2.1 Codice Boilerplate
A prima linea in u schedariu hè a linea di modu di editore emacs. Dice à emacs nantu à e cunvenzioni di furmatu (stile di codificazione) chì usemu in u nostru codice fonte.

/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */

Questu hè sempre un tema abbastanza cuntruversu, cusì avemu bisognu di stabilisce u recordu per sguassà subitu. U prughjettu ns-3, cum'è a maiò parte di i grandi prughjetti, hà aduttatu un stile di codificazione chì tuttu u codice cuntribuitu deve cunfurmà. Se vulete cuntribuisce u vostru còdice à u prugettu, eventualmente avete da cunfurmà à u standard di codificazione ns-3, cum'è discrittu in u schedariu. doc/codingstd.txt o mostratu nantu à a pagina web di u prughjettu: https://www.nsnam.org/develop/contributing-code/coding-style/.

Ricumandemu chì avete abituatu à l'aspettu è u sensu di u codice ns-3 è applicà stu standard ogni volta chì travagliate cù u nostru codice. L'intera squadra di sviluppu è i cuntributori accunsenu à questu dopu qualchì grumbling. A linea di modu emacs sopra facilita a formate currettamente sè vo aduprate l'editor emacs.

U simulatore ns-3 hè licenziatu cù l'usu Licenza Pùbblica Generale GNU. Vederete l'intestazione legale GNU adatta in ogni schedariu di distribuzione ns-3. Spessu vi vede un avvisu di copyright per una di l'istituzioni participanti in u prughjettu ns-3 sopra u testu GPL è l'autore, mostratu quì sottu.

/* 
* This program is free software; you can redistribute it and/or modify 
* it under the terms of the GNU General Public License version 2 as 
* published by the Free Software Foundation; 
*
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
* GNU General Public License for more details. 
* 
* You should have received a copy of the GNU General Public License 
* along with this program; if not, write to the Free Software 
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
*/

4.2.2 Plug-ins

U codice stessu principia cù una seria di dichjarazioni d'inclusione (include).

#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"

Per aiutà i nostri utenti di scripting d'altu livellu à fà fronte à u gran numaru di fugliali di l'intestazione prisenti in u sistema, i raggruppemu secondu u so usu in grandi moduli. Furnemu un unicu fugliale di intestazione chì caricarà in modu recursivo tutti i fugliali d'intestazione utilizati in un modulu datu. Invece di avè da cercà esattamente ciò chì intestazione avete bisognu è possibbilmente uttene a lista curretta di dipendenze, vi demu a capacità di scaricà un gruppu di schedari in granularità. Ùn hè micca l'approcciu più efficau, ma certamente rende assai più faciule di scrittura di scrittura.

Ogni ns-3 include i schedari sò posti in un repertoriu chjamatu ns3 (custruite subdirectory) per evità cunflitti di nomi di file durante u prucessu di creazione. File ns3/core-module.h currisponde à u modulu ns-3, chì truverete in u cartulare src/core in a versione chì avete installatu. In u listinu di stu cartulare truverete un gran numaru di fugliali di header. Quandu fate l'assemblea, Waf mette i fugliali di header publichi in u cartulare ns3 in un subdirectory custruisce / debug

Se ùn avete micca un tali repertoriu, significa chì ùn avete micca specificatu u cartulare di output quandu custruisce a versione di liberazione di ns-3, custruisce cusì:
$ ./waf configure --build-profile=debug --out=custruisce/debug
$ ./waf build
o
$ ./waf configure --build-profile=optimized --out=build/optimized
$ ./waf build

o custruisce / ottimisatu, secondu a vostra cunfigurazione. Waf generarà ancu automaticamente un modulu include file per carricà tutti i fugliali di header publichi. Siccomu di sicuru seguite sta guida religiosamente, avete digià fattu

$ ./waf -d debug --enable-examples --enable-tests configure

per cunfigurà u prugettu per eseguisce custruzzioni di debug chì includenu esempi è testi. Avete ancu fattu

$ ./waf

per assemblà u prugettu. Allora avà quandu cercate in u cartulare ../../build/debug/ns3, allora ci truverete, frà altri, i schedarii di l'intestazione di i quattru moduli mostrati sopra. Pudete vede u cuntenutu di questi schedari è truvate chì includenu tutti i schedarii publichi utilizati da i moduli currispondenti.

4.2.3 ns3 namespace

Next line in script prima.cc hè una dichjarazione di u spaziu di nomi.

using namespace ns3;

U prughjettu ns-3 hè implementatu in un spaziu di nomi C++ chjamatu ns3. Questu raggruppa tutte e dichjarazioni relative à ns-3 in un scopu fora di u spaziu di nomi glubale, chì sperendu aiutà à l'integrazione cù l'altru codice. Utilizà l'operatore C++ introduce u namespace ns-3 in a regione dichjarazione attuale (globale). Questa hè una manera fantastica di dì chì dopu à sta dichjarazione, ùn avete micca bisognu di scrive l'operatore di permessu ns3::scope prima di tuttu u vostru codice ns-3 per aduprà. Se ùn site micca familiarizatu cù i spazii di nomi, riferite à quasi tutti i libri di testu C++ è paragunate u spaziu di nomi ns3 utilizendu u spaziu di nomi std è a dichjarazione. using namespace std; in esempi di travaglià cù l'operatore di output cout e ruscelli.

4.2.4 Logging

A prossima linea di u script hè:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Avemu aduprà sta dichjarazione cum'è un locu cunvene per discutiri u nostru sistema di documentazione Dossigenu. Se guardate u situ web di u prughjettu ns-3, truverete un ligame di Documentazione in a barra di navigazione. Se cliccate nant'à stu ligame sarete purtatu à a nostra pagina di documentazione. Ci hè un ligame "Latest Release" chì vi purterà à a ducumentazione per l'ultima versione stabile di ns-3. Se selezziunate u ligame "Documentazione API", sarete purtatu à a pagina di documentazione API ns-3.

À u latu manca di a pagina truverete una rappresentazione gràfica di a struttura di documentazione. Un bonu postu per cumincià hè u Moduli ns-3 "libru" in l'arburu di navigazione ns-3. S'è tù rivela moduli, vi vede una lista di documentazione di moduli ns-3. Comu discutitu sopra, u cuncettu di un modulu quì hè direttamente ligatu à i schedari inclusi in u modulu sopra. U sottosistema di log ns-3 hè discututu in a sezione Utilizà u Modulu di Logging, cusì ci vulteremu più tardi in stu tutoriale, ma pudete amparà nantu à a dichjarazione sopra fighjendu u modulu Coree poi apre u libru Strumenti di debuggingè dopu selezziunate a pagina Logging. Cliccate nant'à Logging.

Avà duvete riviseghjà a documentazione Dossigenu per u modulu Logging. In a lista di macros in cima di a pagina, vi vede una entrata per NS_LOG_COMPONENT_DEFINE. Prima di cliccà nantu à u ligame, assicuratevi di guardà a "Descrizzione dettagliata" di u modulu di registrazione per capisce cumu funziona in generale. Per fà questu, pudete scroll down o selezziunate "More..." sottu à u graficu.

Quandu avete una idea generale di ciò chì succede, vai avanti è fighjate à a documentazione per u NS_LOG_COMPONENT_DEFINE specificu. Ùn dupliceraghju micca a documentazione quì, ma per riassume, sta linea dichjara un cumpunente di registrazione chjamatu FirstScriptExample, chì permette di attivà o disattivà u logu di cunsola di messagi per riferimentu à un nome.

4.2.5 Funzione principale

In e seguenti linee di u script vi vede,

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

Questu hè solu una dichjarazione di a funzione principale di u vostru prugramma (script). Cum'è cù qualsiasi prugramma C++, avete bisognu di definisce una funzione principale, questu hè eseguitu prima. Ùn ci hè nunda di speciale quì. U vostru script ns-3 hè solu un prugramma C++. A seguente linea stabilisce a risoluzione di u tempu à 1 nanosecondu, chì hè u predeterminatu:

Time::SetResolution (Time::NS);

A risuluzione di u tempu, o simpricimenti a risuluzione, hè u valore di u tempu più chjucu chì pò esse usatu (a più chjuca differenza rapprisentabile trà duie volte). Pudete cambià a risoluzione esattamente una volta. U mecanismu chì furnisce questa flessibilità cunsuma memoria, cusì una volta chì a risoluzione hè esplicitamente stabilita, liberemu a memoria, impediscendu più aghjurnamenti. (Se ùn avete micca stabilitu a risuluzione esplicitamente, serà predeterminata à un nanosegundu è a memoria serà liberata quandu a simulazione principia.)

I seguenti dui linii di script sò usati per attivà dui cumpunenti di logging chì sò integrati in applicazioni EchoClient и EchoServer:

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO); LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);

Se leghjite a documentazione per u cumpunente Logging, vi vede chì ci sò parechji livelli di logging / granularità chì pudete attivà nantu à ogni cumpunente. Queste duie linee di codice permettenu u logu di debug à u livellu INFO per i clienti è i servitori di eco. À questu livellu, l'applicazione stamperà i missaghji mentre manda è riceve pacchetti durante a simulazione.

Avà andemu à l'affari di creà a topologia è eseguisce a simulazione. Utilizemu l'uggetti di l'aiutu di a topologia per fà stu travagliu u più faciule pussibule.

4.2.6 Utilizà l'assistenti di topulugia

E duie prossime linee di codice in u nostru script creanu in realtà l'uggetti Node ns-3 chì rapprisentanu l'urdinatori in a simulazione.

NodeContainer nodes;
nodes.Create (2);

Prima di cuntinuà, truvemu a documentazione per a classe NodeContainer. Un altru modu per ghjunghje à a documentazione per una classe determinata hè attraversu a tabulazione Corsi nantu à e pagine Dossigenu. Sè avete digià Doxygen apertu, basta à scorri finu à a cima di a pagina è selezziunate a tabulazione Classi. Duvete vede un novu settore di tabulazioni, una di quale hè una lista di classi. Sottu sta tabulazione vi vede una lista di tutte e classi ns-3. Scroll down to ns3::NodeContainer. Quandu truvate una classa, selezziunate per andà in a documentazione per a classe.

Comu ricurdamu, una di e nostre astrazioni chjave hè u node. Rapprisenta l'urdinatore à quale avemu da aghjunghje cose cum'è stacks di protokolli, applicazioni è carte periferiche. Assistant topulugia NodeContainer furnisce un modu convenientu per creà, gestisce è accede à qualsiasi oggetti Nodu, chì avemu creatu per eseguisce a simulazione. A prima linea sopra solu dichjarà NodeContainer, chì chjamemu nodi. A seconda linea chjama u metudu Crea nantu à l'ughjettu di i nodi è dumanda à u cuntinuu per creà dui nodi. Cum'è descrittu in Dossigenu, u containeru dumanda à u sistema ns-3 per creà dui ogetti Nodu è guarda puntatori à questi ogetti internamente.

I nodi creati in u script ùn facenu nunda. U prossimu passu in a custruzzione di a topologia hè di cunnette i nostri nodi à a reta. A forma più simplice di rete chì sustenemu hè una cunnessione puntu à puntu trà dui nodi. Ora avemu da creà una tale cunnessione.

PointToPointHelper

Creemu una cunnessione puntu à puntu utilizendu un mudellu familiar, utilizendu un oggettu d'aiutu di topologia per fà u travagliu di livellu bassu necessariu per a cunnessione. Ricurdativi chì i nostri dui astrazioni chjave NetDevice и Channel. In u mondu reale, sti termini currispondenu à pocu pressu à e carte periferiche è i cavi di rete. Di genere, sti dui cose sò strettamente ligati l'un à l'altru, è nimu pò cuntà di spartera, per esempiu, i dispositi. Ethernet nantu à un canale wireless. I nostri assistenti di topulugia seguitanu sta relazione stretta è per quessa utilizate un oggettu unicu in questu scenariu PointToPointHelper per stallà è cunnette l'uggetti ns-3 PointToPointNetDevice и PointToPointChannel. I seguenti trè linii in u script:

PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); 
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

prima linea,

PointToPointHelper pointToPoint;

crea una istanza di un oggettu nantu à a pila PointToPointHelper. Da un puntu di vista di u livellu più altu a linea seguente,

pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));

dice à l'ughjettu PointToPointHelper aduprate u valore "5 Mbit/s" (cinque megabits per seconda) cum'è "DataRate».

Da un puntu di vista più specificu, a stringa "DataRate" currisponde à ciò chì chjamemu un attributu PointToPointNetDevice. S'è vo guardate Dossigenu per a classe ns3::PointToPointNetDevice è in a documentazione per u metudu GetTypeId truverete una lista di attributi definiti per u dispusitivu. Frà elli serà l'attributu "DataRate" A maiò parte di l'uggetti ns-3 visibili per l'utilizatori anu liste simili di attributi. Avemu aduprà stu miccanisimu per fà fà facilmente a simulazione senza recompilazione, cum'è vi vede in a sezione dopu.

Simile à "DataRate" in PointToPointNetDevice, truverete l'attributu "Delay" assuciatu cù u PointToPointChannel. A linea finale

pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

dice PointToPointHelper Aduprate u valore "2 ms" (dui millisecondi) cum'è u valore di ritardu di propagazione per u ligame puntu à puntu chì crea in seguitu.

NetDeviceContainer

À u mumentu avemu in u script NodeContainer, chì cuntene dui nodi. Avemu PointToPointHelper, chì hè preparatu per creà oggetti PointToPointNetDevices è cunnessu cù un oggettu PointToPointChannel. Cum'è avemu usatu l'ughjettu di l'aiutu di a topologia NodeContainer per creà nodi, dumandemu PointToPointHelper realizà u travagliu per noi in relazione à a creazione, a cunfigurazione è a stallazione di i nostri dispositi. Avemu bisognu di una lista di tutti l'uggetti creati NetDevice, cusì avemu aduprà NetDeviceContainer per almacenà u listessu modu chì avemu usatu NodeContainer per almacenà i nodi chì avemu creatu. E duie seguenti linee di codice,

NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);

cunfigurazione cumpleta di u dispusitivu è u canali. A prima linea dichjara u cuntinuu di u dispusitivu citatu sopra, è a seconda face u travagliu principale. Metudu stallà ughjettu PointToPointHelper piglia NodeContainer cum'è un paràmetru. Dentru NetDeviceContainer per ogni nodu situatu in NodeContainer hè creatu (per a cumunicazione puntu à puntu ci deve esse esattamente dui) PointToPointNetDevice hè creatu è salvatu in u containeru di u dispusitivu. PointToPointChannel hè creatu è dui sò attaccati à questu PointToPointNetDevices. Dopu à creà l'uggetti, l'attributi guardati in PointToPointHelper, sò usati per inizializà l'attributi currispundenti in l'uggetti creati.

Dopu avè fattu una chjama pointToPoint.Install (nodi) averemu dui nodi, ognunu cù un dispositivu di rete puntu à puntu installatu è un ligame puntu à puntu trà elli. I dui dispositi seranu cunfigurati per trasmette dati à una velocità di cinque megabits per seconda cù un ritardu di trasmissione di dui millisecondi nantu à u canali.

InternetStackHelper

Avemu avà nodi è dispusitivi cunfigurati, ma i nostri nodi ùn anu micca stack di protokollu installati. I prossime dui linii di codice vi curanu di questu.

InternetStackHelper stack;
stack.Install (nodes);

InternetStackHelper - hè un aiutu di topulugia per stacks Internet, simile à PointToPointHelper per i dispositi di rete di puntu à puntu. Metudu stallà piglia NodeContainer cum'è paràmetru. Quandu eseguitu, installerà a pila Internet (TCP, UDP, IP, etc.) in ogni node di cuntainer.

IPv4 AddressHelper

Allora avemu bisognu di associà i nostri dispusitivi cù l'indirizzi IP. Furnemu un assistente di topulugia per gestisce l'allocazione di l'indirizzu IP. L'unica API visibile per l'utilizatore hè di stabilisce l'indirizzu IP di basa è a maschera di rete da utilizà quandu faci a distribuzione di l'indirizzu propiu (questu hè fattu à un livellu più bassu in l'aiutu). E duie prossime linee di codice in u nostru script di esempiu prima.cc,

Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");

dichjarà l'ughjettu di l'aiutu di l'indirizzu è dite chì deve cumincià à assignà l'indirizzi IP da a rete 10.1.1.0, utilizendu a maschera di bit 255.255.255.0 per determinà. Per automaticamente, l'indirizzi attribuiti cumincianu à unu è cresce monotonicamente, cusì u primu indirizzu attribuitu da sta basa serà 10.1.1.1, dopu 10.1.1.2, etc. In realità, à un livellu bassu, u sistema ns-3 si ricorda di tutti l'indirizzi IP attribuiti è genera un errore fatale se crea accidentalmente una situazione induve u stessu indirizzu hè generatu duie volte (per via, questu errore hè difficiule di debug).

A seguente linea di codice,

Ipv4InterfaceContainer interfaces = address.Assign (devices);

esegue l'assignazione di l'indirizzu propiu. In ns-3 stabilimu una associazione trà un indirizzu IP è un dispositivu chì usa l'ughjettu Interfaccia IPv4. Cum'è qualchì volta avemu bisognu di una lista di i dispositi di rete creati da l'assistente per un usu dopu, avemu bisognu di una lista di l'uggetti. Interfaccia IPv4. IPv4 InterfaceContainer furnisce sta funziunalità.

Avemu custruitu una reta di puntu à puntu, cù stacks installati è indirizzi IP assignati. Avà avemu bisognu di applicazioni in ogni node per generà trafficu.

4.2.7 Using Application

Un altru di l'astrazioni principali di u sistema ns-3 hè Candidatura (applicazione). In questu scenariu usemu duie specializazione di classi di basa Candidatura ns-3 chjamatu UdpEchoServerApplication и UdpEchoClientApplication. Cum'è in i casi precedenti, usemu l'uggetti ausiliari per cunfigurà è gestisce l'uggetti di basa. Quì avemu aduprà UdpEchoServerHelper и UdpEchoClientHelper ogetti per fà a nostra vita più faciule.

UdpEchoServerHelper

I seguenti linii di codice in u nostru script d'esempiu first.cc sò usati per cunfigurà una applicazione di u servitore di eco UDP in unu di i nodi chì avemu creatu prima.

UdpEchoServerHelper echoServer (9);

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

A prima linea di codice in u snippet sopra crea UdpEchoServerHelper. Comu solitu, questu ùn hè micca una applicazione stessu, hè un ughjettu chì ci aiuta à creà applicazioni reali. Una di e nostre cunvenzioni hè di passà l'attributi necessarii à u custruttore di l'ughjettu helper. In questu casu, l'aiutu ùn pò micca fà nunda d'utile, salvu chì ùn hè micca datu u numeru di portu nantu à quale u servitore senterà i pacchetti, stu numeru deve esse cunnisciutu ancu à u cliente. In questu casu, passemu u numeru di portu à u constructore helper. U custruttore, à u turnu, faci solu SetAttribute cù u valore passatu. In seguitu, se vulete, pudete aduprà SetAttribute per stabilisce un valore diversu per l'attributu Port.

Cum'è parechji altri ogetti ausiliarii, l'ughjettu UdpEchoServerHelper hà un metudu stallà. Eseguisce stu metudu crea in modu efficau una applicazione di basa di u servitore d'eco è l'liga à l'ospite. Curiosamente, u metudu stallà piglia NodeContainer cum'è un paràmetru cum'è l'altri stallà metudi chì avemu vistu.

A cunversione implicita C++ chì travaglia quì piglia u risultatu di u metudu node.Get (1) (chì torna un puntatore intelligente à l'ughjettu node - Ptr ) è l'utiliza in u custruttore per l'ughjettu anonimu NodeContainerchì poi hè passatu à u metudu stallà. Se ùn pudete micca determinà in u codice C++ quale signatura di u metudu hè compilatu è eseguitu, allora cercate trà e cunversione implicite.

Avà vedemu chì echoServer.Install circa à stallà l 'applicazione UdpEchoServerApplication nantu à truvà in NodeContainerchì avemu aduprà per gestisce i nostri nodi, node cù indice 1. Metudu stallà riturnerà un containeru chì cuntene puntatori à tutte l'applicazioni (in questu casu unu, postu chì avemu passatu un anònimu NodeContainer, chì cuntene un node) creatu da l'aiutu.

L'applicazioni anu bisognu di specificà quandu cumincianu à generà trafficu "iniziu" è pò esse bisognu di specificà in più un tempu quandu si ferma "stop". Avemu furnisce e duie opzioni. Questi tempi sò stabiliti cù i metudi Applicazione Container Start и Stop. Sti metudi accettanu paràmetri di tipu tempu. In questu casu usemu una sequenza esplicita di cunversione C ++ per piglià C ++ doppia 1.0 è cunvertisce à un ughjettu tns-3 Time chì usa l'ughjettu Seconds per cunvertisce in seconde. Ricurdativi chì e regule di cunversione ponu esse cuntrullate da l'autore di u mudellu, è C ++ hà e so regule, perchè ùn pudete micca sempre cuntà i paràmetri chì sò cunvertiti a manera chì aspittàva. Dui linii

serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));

pruvucarà l'applicazione di u servitore di eco per inizià (accenderà automaticamente) una seconda dopu chì a simulazione principia è si ferma (spegne) dopu à dece seconde di a simulazione. A causa di u fattu chì avemu dichjaratu un avvenimentu di simulazione (avvenimentu di arrestu di l'applicazione), chì serà eseguitu in dece seconde, almenu dece seconde di u funziunamentu di a rete serà simulatu.

UdpEchoClientHelper

Applicazione di u cliente eccu cunfiguratu in una manera quasi simile à u servitore. Ci hè un oggettu di basa UdpEchoClientApplication, chì hè cuntrullata
UdpEchoClientHelper.

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));;

In ogni casu, per u cliente di eco avemu bisognu di stabilisce cinque attributi diffirenti. I primi dui attributi sò stabiliti à u tempu di creazione UdpEchoClientHelper. Passemu paràmetri chì sò usati (dentro l'aiutu) per stabilisce l'attributi "RemoteAddress" и "Portu Remote" in cunfurmità cù u nostru accordu per passà i paràmetri necessarii à u custruttore helper.

Ricurdemu chì avemu usatu IPv4 InterfaceContainer per seguità l'indirizzi IP chì avemu assignatu à i nostri dispositi. L'interfaccia nulla in u containeru di l'interfacce currisponde à l'indirizzu IP di u node nulu in u containeru di i nodi. A prima interfaccia in u containeru di l'interfaccia currisponde à l'indirizzu IP di u primu node in u containeru di i nodi. Allora, in a prima linea di codice (sopra), creamu un aiutu è dicemu chì l'indirizzu remotu di u cliente serà l'indirizzu IP assignatu à l'ospitu induve u servitore hè situatu. Dicemu ancu chì avemu bisognu di organizà i pacchetti per esse mandati à u portu nove.

L'attributu "MaxPackets" dice à u cliente u numeru massimu di pacchetti chì pudemu mandà durante a simulazione. L'attributu "Interval" dici à u cliente quantu tempu aspittà trà i pacchetti, è l'attributu "PacketSize" dice à u cliente quantu deve esse grande a carica di u pacchettu. Cù sta cumminazione di attributi, dicemu à u cliente di mandà un solu pacchettu di 1024 byte.

Cum'è cù u servitore di eco, avemu stabilitu l'attributi di u cliente di eco Start и Stop, ma quì avemu principiatu u cliente un secondu dopu chì u servitore hè attivatu (dui seconde dopu l'iniziu di a simulazione).

4.2.8 Simulatore

À questu puntu avemu bisognu di eseguisce a simulazione. Questu hè fattu cù a funzione globale Simulator::Run.

Simulator::Run ();

Quandu avemu prima chjamatu metudi,

serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
... 
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));

avemu in realtà pianificatu avvenimenti in u simulatore à 1,0 seconde, 2,0 seconde, è dui avvenimenti à 10,0 seconde. Dopu à a chjama Simulator::Run, u sistema cumincià à vede a lista di l'avvenimenti programati è eseguisce. Prima sparerà un avvenimentu dopu à 1,0 seconde, chì attivarà l'applicazione di u servitore di eco (stu avvenimentu pò à turnà pianificà assai altri avvenimenti). Allora sparerà un avvenimentu pianificatu à t = 2,0 seconde chì lanciarà l'applicazione cliente di eco. In novu, questu avvenimentu pò avè assai più avvenimenti previsti. L'implementazione di l'iniziu di l'avvenimentu in u cliente di l'eco hà da inizià a fase di trasferimentu di dati di a simulazione mandendu un pacchettu à u servitore.

L'attu d'invià un pacchettu à u servitore attivarà una catena di avvenimenti chì seranu automaticamente pianificati daretu à i sceni è chì implementarà a meccanica di mandà un pacchettu di eco secondu i paràmetri di timing chì avemu stabilitu in u script.

In u risultatu, postu chì mandemu solu un pacchettu (ricurdate, l'attributu MaxPackets hè stata stabilita à unu), a catena di avvenimenti iniziata da stu ping client unicu finiscerà è a simulazione andrà in modalità standby. Una volta chì questu succede, l'avvenimenti programati rimanenti seranu l'avvenimenti Stop per u servitore è u cliente. Quandu questi avvenimenti sò eseguiti, ùn ci sarà micca avvenimenti lasciati per un ulteriore prucessu è Simulator::Run tornerà u cuntrollu. A simulazione hè cumpleta.

Tuttu ciò chì resta hè di pulizziari dopu à sè stessu. Questu hè fattu chjamendu a funzione globale Simulator::Distrughje. Perchè e funzioni d'aiutu (o codice ns-3 di livellu bassu) sò stati chjamati, chì sò urganizati in modu chì i ganci sò stati inseriti in u simulatore per distrughje tutti l'uggetti chì sò stati creati. Ùn avete bisognu di seguità alcunu di questi ogetti stessu - tuttu ciò chì duvete fà era chjamà Simulator::Distrughje è esce. U sistema ns-3 farà stu travagliu duru per voi. E linee rimanenti di u nostru primu script ns-3, first.cc, facenu cusì:

Simulator::Destroy ();
return 0;
}

Quandu si ferma u simulatore?

ns-3 hè un simulatore di eventi discreti (DE). In un tali simulatore, ogni avvenimentu hè assuciatu cù u so tempu d'esekzione, è a simulazione cuntinueghja processendu l'avvenimenti in l'ordine chì si verificanu mentre a simulazione avanza. L'avvenimenti ponu causà avvenimenti futuri per esse pianificati (per esempiu, un cronometru pò esse riprogrammatu per finisce cuntà in u prossimu intervallu).

L'avvenimenti iniziali sò generalmente iniziati da l'entità, per esempiu IPv6 pianificà a scuperta di servizii nantu à a reta, richieste di vicini, etc. L'applicazione pianifica u primu avvenimentu di mandatu di pacchettu, è cusì. Quandu un avvenimentu hè processatu, pò generà zero, unu o più avvenimenti. Quandu a simulazione avanza, l'avvenimenti si verificanu, finiscinu o creendu novi. A simulazione si ferma automaticamente se a fila di l'avvenimenti hè viota o un avvenimentu speciale hè rilevatu Stop. Avvenimentu Stop generatu da a funzione Simulator::Stop (stop time).

Ci hè un casu tipicu induve Simulator::Stop hè assolutamente necessariu di piantà a simulazione: quandu ci sò avvenimenti auto-sostenibili. L'avvenimenti autosostenibili (o ripetitivi) sò avvenimenti chì sò sempre riprogrammati. In cunseguenza, mantenenu sempre a fila di l'avvenimenti micca viota. Ci sò parechji protokolli è moduli chì cuntenenu avvenimenti ripetuti, per esempiu:

• FlowMonitor - verificazione periodica per i pacchetti persi;

• RIPng - trasmissione periodica di l'aghjurnamenti di a tavola di routing;

• etc.

In tali casi Simulator::Stop necessariu per fermà a simulazione currettamente. Inoltre, quandu ns-3 hè in modu di emulazione, u RealtimeSimulator hè utilizatu per sincronizà u clock di simulazione cù l'orologio di a macchina, è Simulator::Stop necessariu di piantà u prucessu.

Parechji di i prugrammi di simulazione in u libru di testu ùn chjamanu micca Simulator::Stop esplicitamente, postu chì terminanu automaticamente quandu l'avvenimenti in fila sò esauriti. Tuttavia, sti prugrammi accittari dinù u Simulator::Stop call. Per esempiu, a seguente dichjarazione supplementaria in u primu prugramma di esempiu programarà un stop esplicitu à 11 seconde:

+ Simulator::Stop (Seconds (11.0));
  Simulator::Run ();
  Simulator::Destroy ();
  return 0;
}

U sopra ùn hà micca veramente cambià u cumpurtamentu di stu prugramma, postu chì sta simulazione particulare finisce naturalmente dopu à 10 seconde. Ma s'è tù avissi a canciari lu tempu di arrestu in a dichjarazione sopra da 11 seconde à 1 segundu, vi avissi nutatu chì a simulazione si ferma prima chì ogni output tocca à a schermu (poi chì l'output succede dopu à circa 2 seconde di tempu di simulazione).

Hè impurtante di chjamà Simulator::Stop prima di chjamà Simulator::Run; altrimenti Simulator::Run ùn pò mai rinvià u cuntrollu à u prugramma principale per eseguisce u stop!

4.2.9 Custruì u vostru script

Avemu fattu a creazione di i vostri scripts simplici triviale. Tuttu ciò chì duvete fà hè di mette u vostru script in u repertoriu di scratch è serà automaticamente custruitu se corre Waf. Pruvemu. Torna à u cartulare di u livellu superiore è copia esempi/tutorial/first.cc à u catalogu espagne

$ cd ../.. 
$ cp examples/tutorial/first.cc scratch/myfirst.cc

Avà custruite u vostru primu script di mostra usendu waf:

$ ./waf

Tu avissi a vede missaghji chì indicanu chì u vostru primu esempiu hè statu creatu successu.

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
[614/708] cxx: scratch/myfirst.cc -> build/debug/scratch/myfirst_3.o
[706/708] cxx_link: build/debug/scratch/myfirst_3.o -> build/debug/scratch/myfirst
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (2.357s)

Avà pudete eseguisce l'esempiu (nota chì se custruite u vostru prugramma in u cartulare scratch, allora duvete eseguisce da espagne):

$ ./waf --run scratch/myfirst

Duvete vede output simili:

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.418s) Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
Received 1024 bytes from 10.1.1.2

Quì pudete vede chì u sistema di custruzzione verifica chì u schedariu hè statu custruitu è ​​​​poi u corre. Vede l'entrata di cumpunenti nantu à u cliente di eco indica chì hà mandatu un solu pacchettu di 1024 byte à u servitore di eco 10.1.1.2. Avete ancu vede u cumpunente di logu nantu à u servitore di eco per dì chì hà ricevutu 1024 bytes da 10.1.1.1. U servitore di l'ecu riproduce in silenziu u pacchettu è pudete vede in u logu di u cliente di eco chì hà ricevutu u so pacchettu da u servitore.

4.3 ns-3 codice surghjente

Avà chì avete utilizatu alcuni di l'aiutu ns-3, pudete piglià un ochju à un pocu di u codice fonte chì implementa sta funziunalità. L'ultimu codice pò esse vistu nantu à u nostru servitore web à u ligame seguente: https://gitlab.com/nsnam/ns-3-dev.git. Quì vi vede a pagina di riassuntu Mercurial per u nostru arbulu di sviluppu ns-3. In cima di a pagina vi vede parechji ligami,

summary | shortlog | changelog | graph | tags | files

Vai avanti è selezziunate u ligame di i schedari. Questu hè u livellu più altu di a maiò parte di i nostri repositori:

drwxr-xr-x                               [up]
drwxr-xr-x                               bindings python  files
drwxr-xr-x                               doc              files
drwxr-xr-x                               examples         files
drwxr-xr-x                               ns3              files
drwxr-xr-x                               scratch          files
drwxr-xr-x                               src              files
drwxr-xr-x                               utils            files
-rw-r--r-- 2009-07-01 12:47 +0200 560    .hgignore        file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 1886   .hgtags          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 1276   AUTHORS          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 30961  CHANGES.html     file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 17987  LICENSE          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 3742   README           file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 16171  RELEASE_NOTES    file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 6      VERSION          file | revisions | annotate
-rwxr-xr-x 2009-07-01 12:47 +0200 88110  waf              file | revisions | annotate
-rwxr-xr-x 2009-07-01 12:47 +0200 28     waf.bat          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 35395  wscript          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 7673   wutils.py        file | revisions | annotate

I nostri script d'esempiu sò in u cartulare esempi. Se cliccate nantu à l'esempii, vi vede una lista di subdirectorii. Unu di i schedari in u subdirectory tutoriale - first.cc... Se cliccate nant'à prima.cc vi vede u codice appena amparatu.

U codice fonte hè principalmente situatu in u cartulare src. Pudete vede u codice fonte clicchendu nantu à u nome di u repertoriu o clicchendu nantu à u ligame di i schedari à a diritta di u nome di u repertoriu. Se cliccate nant'à u repertoriu src, uttene una lista di subdirectorii src. Sè dopu cliccate nant'à u subdirectory core, truverete una lista di schedari. U primu schedariu chì vi vede (à u mumentu di a scrittura di sta guida) hè abortà.h. Se cliccate nant'à u ligame abortà.h, vi sarà mandatu à u schedariu fonte per abortà.h, chì cuntene macros utili per esce da scripts se sò rilevati cundizioni anormali. U codice fonte per l'aiutu chì avemu usatu in stu capitulu pò esse truvatu in u cartulare src/Applicazioni/helper. Sentite liberu di chjappà intornu à l'arburu di u repertoriu per capisce ciò chì hè induve è capisce u stilu di i prugrammi ns-3.

Source: www.habr.com

Cumprate un hosting affidabile per i siti cù prutezzione DDoS, servitori VPS VDS 🔥 Cumprate un hosting di siti web affidabile cù prutezzione DDoS, servitori VPS VDS | ProHoster