Manuali për simulimin e rrjetit ns-3. Kapi 4

Manuali për simulimin e rrjetit ns-3. Kapi 4
kapitujt 1,2
kapitulli 3

4 Këndvështrimi i konceptit
4.1 Abstraksionet Kryesore
4.1.1 Nyjë (Node)
4.1.2 Aplikacion (Application)
4.1.3 Kanal (Channel)
4.1.4 Pajisje RRJETI (Net Device)
4.1.5 Asistentët Topologjikë
4.2 Skripti i Parë ns-3
4.2.1 Kodi Boilerplate
4.2.2 Modulet e Plug-in
4.2.3 Hapësira Emërtimi ns3
4.2.4 Regjistrimi
4.2.5 Funksioni Kryesor
4.2.6 Përdorimi i Asistentëve Topologjikë
4.2.7 Përdorimi i Aplikacionit
4.2.8 Simuluesi
4.2.9 Ndërtesa e skenarit tuaj
4.3 Kodi Burimor i ns-3

Kreu 4

Këndvështrimi i konceptit

E para gjĂ« qĂ« duhet tĂ« bĂ«jmĂ« pĂ«rpara se tĂ« fillojmĂ« tĂ« studiojmĂ« ose tĂ« shkruajmĂ« kod ns‑3 Ă«shtĂ« tĂ« shpjegojmĂ« disa koncepte dhe abstraksione thelbĂ«sore nĂ« sistem. ShumĂ« nga kĂ«to, pĂ«r disa, mund tĂ« duken tĂ« dukshme, por rekomandojmĂ« tĂ« kaloni kohĂ« pĂ«r tĂ« lexuar kĂ«tĂ« seksion pĂ«r tĂ« siguruar qĂ« po filloni nĂ« njĂ« bazĂ« tĂ« fortĂ«.

4.1 Abstraksionet Kryesore

NĂ« kĂ«tĂ« seksion do tĂ« shqyrtojmĂ« disa terma qĂ« zakonisht pĂ«rdoren nĂ« rrjet, por qĂ« kanĂ« njĂ« kuptim tĂ« caktuar nĂ« ns‑3.

4.1.1 Nyjë (Node)

NĂ« gjuhĂ«n e internetit, njĂ« pajisje kompjuterike qĂ« lidhet me rrjetin quhet host ose ndonjĂ«herĂ« sistem final. PĂ«r shkak se ns-3 Ă«shtĂ« njĂ« simulator rrjeti dhe jo simulatori i Internetit, ne qĂ«llimisht nuk pĂ«rdorim termin host, pasi ai Ă«shtĂ« ngushtĂ« i lidhur me Internetin dhe protokollet e tij. NĂ« vend tĂ« kĂ«saj, ne pĂ«rdorim njĂ« term mĂ« tĂ« pĂ«rgjithshĂ«m, i pĂ«rdorur gjithashtu nga simulatorĂ«t e tjerĂ«, qĂ« buron nga teoria e grafĂ«ve — nod.node).

Në ns-3, abstraksioni bazë i një pajisjeje kompjuterike quhet nod. Ky abstraksion paraqitet në klasën C++ Node. Klasa NodeNode (nod) ofron metoda për të menaxhuar përfaqësimet e pajisjeve kompjuterike në simuloj.

Duhet të kuptoni Node si një kompjuter, në të cilin do të shtoni funksionalitete. Do të shtoni gjëra si aplikacione, stack-e protokollesh dhe karta periferike me drejtime që lejojnë kompjuterin të realizojë punë të dobishme. Ne përdorim të njëjtën model themelore në ns-3.

4.1.2 Aplikacion (Application)

Software kompjuterik zakonisht ndahet në dy klasat e gjera. Softueri sistemor organizon burimet e ndryshme kompjuterike si memorien, ciklet e procesorit, disqet, rrjetin, etj. në përputhje me një model llogaritës. Softueri sistemor zakonisht nuk e përdor këto burime për të realizuar detyra që sjellin përfitim të drejtpërdrejtë për përdoruesin. Përdoruesi zakonisht ekzekuton një aplikacion për të arritur një qëllim të caktuar, i cili merr dhe përdor burimet e kontrolluara nga softueri sistemor.

Shpesh, linja e ndarjes mes softuerit sistemor dhe atij aplikativ pĂ«rcaktohet kur ndryshon niveli i privilegjeve, i cili ndodh nĂ« grackat e sistemit operativ. NĂ« ns‑3 nuk ka njĂ« koncept tĂ« vĂ«rtetĂ« tĂ« sistemit operativ dhe pĂ«rkatĂ«sisht nuk ka nocione tĂ« niveleve tĂ« privilegjit ose thirrjeve sistemike. MegjithatĂ«, kemi idenĂ« e aplikacionit. Ashtu si nĂ« "botĂ«n reale", pĂ«r tĂ« kryer detyra, aplikacionet software punojnĂ« nĂ« kompjuterĂ«, aplikacionet ns‑3 punojnĂ« nĂ« nyjat ns‑3 pĂ«r tĂ« menaxhuar simulimet nĂ« botĂ«n e simuluar.

NĂ« ns‑3, abstraksioni bazĂ« pĂ«r njĂ« program pĂ«rdoruesi qĂ« gjeneron ndonjĂ« aktivitet pĂ«r simulim Ă«shtĂ« aplikacioni. Ky abstraksion paraqitet nĂ« C++ pĂ«rmes klasĂ«s Application (aplikacion). Klasa Application ofron metoda pĂ«r tĂ« menaxhuar nĂ« simulimet pĂ«rfaqĂ«simet e versioneve tona tĂ« aplikacioneve tĂ« nivelit pĂ«rdorues. Pritet qĂ« zhvilluesit tĂ« specializojnĂ« klasĂ«n Application nĂ« kuptimin e programimit tĂ« orientuar nga objekti pĂ«r tĂ« krijuar aplikacione tĂ« reja. NĂ« kĂ«tĂ« udhĂ«zues, ne do tĂ« pĂ«rdorim specializimet e klasĂ«s Application, tĂ« quajtura UdpEchoClientApplication dhe UdpEchoServerApplication. Siç pritej, kĂ«to aplikacione pĂ«rbĂ«jnĂ« njĂ« grup aplikacionesh klient/servert qĂ« pĂ«rdoren pĂ«r tĂ« gjeneruar dhe echo-simuluar paketa rrjeti.

4.1.3 Kanal (Channel)

NĂ« botĂ«n reale, njĂ« kompjuter mund tĂ« lidhet me rrjetin. Shpesh, mjediset pĂ«rmes tĂ« cilave kalojnĂ« tĂ« dhĂ«nat nĂ« kĂ«to rrjete quhen kanale. Kur lidhni njĂ« kabllo Ethernet nĂ« njĂ« prizĂ« nĂ« mur, po e lidhni kompjuterin me kanalin e komunikimit Ethernet. NĂ« botĂ«n e simulimit ns‑3, njĂ« nyje lidhet me njĂ« objekt qĂ« pĂ«rfaqĂ«son kanal komunikimi. KĂ«tu, abstraksioni kryesor i nĂ«nrrjetit tĂ« komunikimit quhet kanal dhe pĂ«rfaqĂ«sohet nĂ« C++ nga klasa Channel (kanali).

Klasa ChannelChannel siguron metoda për menaxhimin e ndërveprimit të objekteve të nënrrjetit dhe lidhjen e nyjeve me to. Kanale gjithashtu mund të specializohen nga zhvilluesit në sensin e programimit të orientuar nga objektet. Specializimi i kanalit mund të modeling diçka të thjeshtë si një kabllo. Një kanal i specializuar gjithashtu mund të modeling gjëra të komplikuara si një switch Ethernet të madh ose një hapësirë tridimensionale plot pengesa në rastin e rrjeteve pa tel.

Ne do të përdorim në këtë udhëzues versionet e specializuara të kanalit të quajtur CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel dhe WifiChannelWifiChannel. CsmaChannel, për shembull, modelon versionin e një sub-reti komunikimi që implementon një mjedis komunikimi me qasje të shumëfishtë me kontroll mbi mbajtësin. Kjo na ofron funksionalitet të ngjashëm me Ethernet.

4.1.4 Pajisje RRJETI (Net Device)

Më parë, nëse dëshironit të lidhni një kompjuter në rrjet, duhej të blinit një kabllor të caktuar rrjeti dhe një pajisje harduerike, e njohur si (në terminologjinë e PC-ve) një kartë periferike, e cila duhej të instalohej në kompjuter. Nëse disa funksione rrjetesh ishin realizuar në kartën periferike, ato quheshin karta ndërfaqe rrjeti ose karta rrjeti. Sot, shumica e kompjuterëve vijnë me pajisje të integruara të ndërfaqes së rrjetit, dhe përdoruesit nuk i shohin ato si pajisje të veçanta.

Karta e rrjetit nuk do të funksionojë pa një driver programor që menaxhon harduerin e saj. Në Unix (ose Linux), një pjesë e pajisjeve periferike klasifikohet si pajisje. Pajisjet menaxhohen përmes drivereve të pajisjeve (device drivers), dhe pajisjet rrjetesore (NIC) menaxhohen duke përdorur driverët e pajisjeve rrjetësore (driverët e pajisjeve rrjetësore) dhe kanë një emër të përbashkët pajisjet e rrjetit (pajisje rrjeti). Në Unix dhe Linux, ju qaseni në pajisjet e rrjetit me emra të tillë si p.sh. eth0.

NĂ« ns-3, abstraksioni i pajisjes sĂ« rrjetit pĂ«rfshin si drejtuesin programor ashtu edhe pajisjen e modeluar. GjatĂ« simulimit, pajisja e rrjetit “instalohet” nĂ« nyje pĂ«r t'i lejuar atij tĂ« lidhet me nyje tĂ« tjera pĂ«rmes kanaleve. Si nĂ« njĂ« kompjuter real, njĂ« nyje mund tĂ« lidhet me disa kanale pĂ«rmes disa pajisjeve. Pajisjet e Rrjetit.

Abstraksioni i pajisjes sĂ« rrjetit paraqitet nĂ« C++ me klasĂ«n NetDevice. KlasĂ« NetDevice siguron metoda pĂ«r menaxhimin e lidhjeve me objektet Node dhe Channel; dhe mund tĂ« specializohen nga zhvilluesit nĂ« aspektin e programimit tĂ« orientuar nga objektet. NĂ« kĂ«tĂ« udhĂ«zues, ne do tĂ« pĂ«rdorim disa versione tĂ« specializuara tĂ« NetDevice me emrat CsmaNetDevice, PointToPointNetDevice dhe WifiNetDevice. Ashtu siç adaptori i rrjetit Ethernet Ă«shtĂ« i dizajnuar pĂ«r tĂ« punuar me rrjetin Ethernet, CsmaNetDevice Ă«shtĂ« i destinuar pĂ«r tĂ« punuar me CsmaChannel, PointToPointNetDevice Ă«shtĂ« i destinuar pĂ«r tĂ« punuar me PointToPointChannel, dhe WifiNetDevice — Ă«shtĂ« i destinuar pĂ«r tĂ« punuar me WifiChannel.

4.1.5 Asistentët Topologjikë

Në një rrjet të vërtetë do të gjeni host-kompjuterë me karta të rrjetit të shtuar (ose të integruara). Në ns-3 do të thoshim se do të shihni nyje me NetDevices të lidhura. Në një rrjet të madh të simuluar do t'ju duhet të organizoni lidhjet midis shumë objekteve. Node, NetDevice dhe Kanal.

Duke qenë se lidhja e NetDevices me nyjet, NetDevices me kanalet, dhe caktimi i adresave IP, etj., në ns-3 janë detyra të zakonshme, për ta bërë këtë sa më të lehtë, ne ofrojmë ndihmësit topologjikë të ashtuquajtur. Për shembull, për të krijuar një NetDevice nevojiten shumë operacione të bërthamës ns-3, të shtohet një adresë MAC, të vendoset ky pajisje rrjeti në Node, të konfigurohet staku i protokolleve të nyjës, dhe pastaj të lidhni NetDevice me Channel. Akoma më shumë operacione do të jenë të nevojshme për të lidhur disa pajisje me kanalet shumëpikëshe, dhe pastaj të lidhni rrjete të veçanta në një rrjet të bashkuar (Internetworks). Ne ofrojmë objekte ndihmëse topologjie, të cilat për lehtësinë tuaj bashkojnë këto shumë operacione në një model të lehtë për t'u përdorur.

4.2 Skripti i Parë ns-3

NĂ«se keni instaluar sistemin ashtu siç u sugjerua mĂ« lart, do tĂ« keni njĂ« version tĂ« ns‑3 nĂ« direktorinĂ« e quajtur repos nĂ« drejtorinĂ« tuaj tĂ« shtĂ«pisĂ«. Shkoni nĂ« direktorinĂ« release

NĂ«se nuk keni njĂ« direktor tĂ« tillĂ«, do tĂ« thotĂ« se gjatĂ« ndĂ«rtimit tĂ« versionit tĂ« lĂ«shuar tĂ« ns‑3 nuk keni specifikuar direktorinĂ« e daljes, kryeni ndĂ«rtimin kĂ«shtu:
$ ./waf configure —build-profile=release —out=build/release,
$ ./waf build

aty duhet të shihni një strukturë direktorie të ngjashme me këtë:

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

Shkoni në direktorinë examples/tutorial. Duhet të shihni atje një skedar me emrin first.cc. Ky është një skenar që do të krijojë një lidhje të thjeshtë pikë-pikë midis dy nyjave dhe do të transferojë një paketë midis nyjave. Le të shohim këtë skenar rresht pas rreshti, për këtë hapim first.cc në editorin tuaj të preferuar.

4.2.1 Kodi Boilerplate
Rreshti i parë në skedar është rreshti i modit të redaktorit emacs. Ai i thotë emacs-it për rregullat e formatimit (stilin e kodimit) që do të përdorim në kodin tonë burimor.

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

Kjo Ă«shtĂ« gjithmonĂ« njĂ« pyetje mjaft e diskutueshme, prandaj duhet tĂ« sqarojmĂ« diçka qĂ« ta heqim atĂ« nga rruga menjĂ«herĂ«. Projekti ns‑3, ashtu si shumica e projekteve tĂ« mĂ«dha, ka pranuar njĂ« stil kodimi, qĂ« çdo kod i dhĂ«nĂ« duhet tĂ« pĂ«rmbushĂ«. NĂ«se dĂ«shironi tĂ« kontribuoni kodin tuaj nĂ« projekt, pĂ«rfundimisht do t'ju duhet tĂ« pĂ«rputhni me standardin e kodimit ns‑3, siç pĂ«rshkruhet nĂ« skedarin doc/codingstd.txt ose i shfaqur nĂ« faqen e internetit tĂ« projektit: https://www.nsnam.org/develop/contributing-code/coding-style/.

Ne ju rekomandojmĂ« tĂ« habiteni me pamjen e kodit ns‑3 dhe tĂ« aplikoni kĂ«tĂ« standard çdo herĂ« kur punoni me kodin tonĂ«. I gjithĂ« ekipi i zhvilluesve dhe kontribuesve e ka pranuar kĂ«tĂ« pas disa diskutimesh. Rreshti i modit emacs, i pĂ«rmendur mĂ« sipĂ«r, e bĂ«n formatimin e saktĂ« mĂ« tĂ« lehtĂ« nĂ«se pĂ«rdorni redaktorin emacs.

Simulatori ns‑3 licencohet duke pĂ«rdorur LicencĂ«n Publike tĂ« GNU. Do tĂ« shihni titullin pĂ«rkatĂ«s ligjor tĂ« GNU nĂ« çdo skedar tĂ« shpĂ«rndarjes ns‑3. Shpesh mund tĂ« shihni njĂ« njoftim pĂ«r tĂ« drejtat e autorit pĂ«r njĂ« nga institucionet qĂ« marrin pjesĂ« nĂ« projektin ns‑3 mbi tekstin GPL dhe autorin, siç Ă«shtĂ« e shfaqur mĂ« poshtĂ«.

/* 
* 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 Modulet e Plug-in

Kodu fillon me një sërë operatorësh përfshirës (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"

Për të ndihmuar përdoruesit tanë të skripteve në nivel të lartë të përballen me një sasi të madhe dosjeve përkatëse, ne i grupojmë ato sipas përdorimit në module të mëdha. Ne ofrojmë një dosje përfshirëse, e cila do të ngarkojë në mënyrë rekurzive të gjitha dosjet e përfshirura që përdoren në këtë modul. Në vend që të kërkoni se cili titull ju nevojitet dhe ndoshta të merrni një listë të saktë të varësive, ne ju ofrojmë mundësinë të ngarkoni një grup dosjesh me një shkallë të madhe detaji. Kjo nuk është qasja më efikase, por sigurisht e bën shkrimin e skripteve shumë më të thjeshtë.

Çdo dosje e pĂ«rfshirĂ« ns‑3 vendoset nĂ« njĂ« direktorium me emrin ns3 (nĂ«n-direktoriumi i ndĂ«rtimit), pĂ«r tĂ« shmangur konfliktet e emrave tĂ« dosjeve gjatĂ« procesit tĂ« ndĂ«rtimit. Dosja ns3/core-module.h pĂ«rputhet me modul ns‑3, tĂ« cilin do ta gjeni nĂ« direktoriumin src/core nĂ« versionin qĂ« keni instaluar. NĂ« listimin e kĂ«tij direktoriumi do tĂ« gjeni njĂ« numĂ«r tĂ« madh dosjesh pĂ«rfshirĂ«se. Kur bĂ«ni ndĂ«rtimin, Waf vendos skedarĂ«t publikĂ« tĂ« titujve nĂ« direktorinĂ« ns3 nĂ« nĂ«n-direktorinĂ« ndĂ«rto/debug

NĂ«se nuk keni njĂ« direktor tĂ« tillĂ«, do tĂ« thotĂ« se gjatĂ« ndĂ«rtimit tĂ« versionit tĂ« lĂ«shuar tĂ« ns‑3 nuk keni specifikuar direktorinĂ« e daljes, kryeni ndĂ«rtimin kĂ«shtu:
$ ./waf configure —build-profile=debug —out=ndĂ«rto/debug
$ ./waf build
ose
$ ./waf configure —build-profile=optimized —out=ndĂ«rto/optimized
$ ./waf build

ose ndërto/optimized, në varësi të konfigurimit tuaj. Waf do të gjenerojë gjithashtu automatikisht një skedar të përfshirë moduli për të ngarkuar të gjitha skedarët publikë të titujve. Duke qenë se ju, sigurisht, e ndjekni këtë udhëzim me rigorozitet, ju tani keni bërë

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

për të konfigurimin e projektit për të realizuar ndërtimet e debugging, duke përfshirë shembuj dhe teste. Ju gjithashtu keni bërë

$ ./waf

për të ndërtuar projektin. Pra tani, kur të shikoni në direktorinë ../../ndërto/debug/ns3, do të gjeni skedarët e titujve të katër moduleve të treguara më lart. Mund të shikoni përmbajtjen e këtyre skedarëve dhe të zbuloni se ata përfshijnë të gjitha skedarët publikë të përdorur nga modulet përkatëse.

4.2.3 Hapësira Emërtimi ns3

Rreshti i ardhshëm në skript first.cc është shpallja e hapësirës së emrave.

duke përdorur hapësirën e emrave ns3;

Projekti ns‑3 Ă«shtĂ« realizuar nĂ« hapĂ«sirĂ«n e emrave C++, e cila quhet ns3. Kjo grupion tĂ« gjitha deklaratat e lidhura me ns‑3 jashtĂ« hapĂ«sirĂ«s globale tĂ« emrave, e cila, siç shpresojmĂ«, do tĂ« ndihmojĂ« nĂ« integrimin me kodin tjetĂ«r. PĂ«rdorimi i operatorit C++ fut hapĂ«sirĂ«n e emrave ns‑3 nĂ« rajonin aktual (global) deklarativ. Kjo Ă«shtĂ« njĂ« mĂ«nyrĂ« e çuditshme pĂ«r tĂ« thĂ«nĂ« se pas kĂ«saj deklarate, nuk do t'ju nevojitet tĂ« futni operatorin e zgjidhjes ns3::scope para çdo kodi ns‑3 pĂ«r ta pĂ«rdorur atĂ«. NĂ«se nuk jeni tĂ« njohur me hapĂ«sirat e emrave, konsultohuni me ndonjĂ« manual pĂ«r C++ dhe krahasoni hapĂ«sirĂ«n e emrave ns3 me pĂ«rdorimin e hapĂ«sirĂ«s sĂ« emrave std dhe deklaratat. using namespace std; nĂ« shembujt e punĂ«s me operatorin e daljes cout dhe rrjedhat.

4.2.4 Regjistrimi

Rreshti i radhës i skenarit është i tillë,

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Ne do ta pĂ«rdorim kĂ«tĂ« deklaratĂ« si njĂ« vend tĂ« dobishĂ«m pĂ«r tĂ« diskutuar sistemin tonĂ« tĂ« dokumentimit. Doxygen. NĂ«se e shihni faqen e internetit tĂ« projektit ns‑3, do tĂ« gjeni njĂ« lidhje "Dokumentacioni" (Documentation) nĂ« panelin e navigimit. NĂ«se zgjidhni kĂ«tĂ« lidhje, do tĂ« pĂ«rfundoni nĂ« faqen tonĂ« tĂ« dokumentacionit. Ekziston njĂ« lidhje pĂ«r "Versionin e fundit", e cila do t'ju çojĂ« nĂ« dokumentacionin pĂ«r versionin mĂ« stabil tĂ« ns‑3. NĂ«se zgjidhni lidhjen "Dokumentacioni i API-sĂ«", do tĂ« shkoni nĂ« faqen e dokumentacionit tĂ« API-sĂ« ns‑3.

NĂ« anĂ«n e majtĂ« tĂ« faqes do tĂ« gjeni njĂ« pĂ«rfaqĂ«sim grafik tĂ« strukturĂ«s sĂ« dokumentacionit. NjĂ« vend i mirĂ« pĂ«r tĂ« filluar Ă«shtĂ« "libra" Modules ns‑3 nĂ« pemĂ«n e navigimit ns‑3. NĂ«se e hapni Modules, do tĂ« shihni njĂ« listĂ« tĂ« dokumentacionit tĂ« moduleve ns‑3. Siç u diskutua mĂ« sipĂ«r, koncepti i modulit kĂ«tu Ă«shtĂ« ngushtĂ«sisht i lidhur me skedarĂ«t qĂ« pĂ«rfshihen nĂ« modulin e lartpĂ«rmendur. NĂ«n sistemi i regjistrimit (logimit) tĂ« ns‑3 diskutohet nĂ« seksionin PĂ«rdorimi i modulit tĂ« regjistrimit, kĂ«shtu qĂ« do tĂ« kthehemi tek ajo mĂ« vonĂ« nĂ« kĂ«tĂ« udhĂ«zues, por mund tĂ« mĂ«soni pĂ«r deklaratĂ«n e sipĂ«rme duke shikuar nĂ« modul BĂ«rthama, pastaj duke hapur librin Veglat e Debugging, pastaj duke zgjedhur faqen Regjistrimi. Klikoni mbi Regjistrimi.

Tani duhet të shikoni dokumentacionin Doxygen për modulin Regjistrimi. Në listën e makrosave në pjesën e sipërme të faqes, do të shihni një shënim për NS_LOG_COMPONENT_DEFINE. Para se të shkoni në lidhje, sigurohuni që të shikoni "Përshkrimin e Detajuar" të modulit të regjistrimit, për të kuptuar funksionimin e tij në përgjithësi. Për ta bërë këtë, mund të rrokullisni poshtë ose të zgjidhni "Më Shumë..." nën diagramin.

Pasi të keni një përmbledhje të përgjithshme mbi atë që po ndodh, vazhdoni dhe shikoni dokumentacionin për NS_LOG_COMPONENT_DEFINE specifik. Nuk do ta dyfishoj dokumentacionin këtu, por për ta përmbledhur, thashë se kjo rresht deklaron një komponent regjistrimi me emrin FirstScriptExample, i cili mundëson aktivizimin dhe çaktivizimin e regjistrimit të mesazheve në konsolë për lidhjen e emrit.

4.2.5 Funksioni Kryesor

Në rreshtat e ardhshëm të skriptit do të shihni,

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

Kjo është thjesht një deklaratë e funksionit kryesor të programit tuaj (skriptit). Si në çdo program në C++, duhet të definoni funksionin kryesor, i cili ekzekutohet i pari. Nuk ka asgjë të veçantë këtu. Skripti juaj ns-3 është thjesht një program C++. Rreshti në vazhdim vendos një rezolutë të kohës të barabartë me 1 nanosekondë, e cila është vlera e paracaktuar:

Time::SetResolution (Time::NS);

Rezolucioni në kohë ose thjesht rezolucioni është vlera më e vogël e kohës që mund të përdoret (dallimi më i vogël i dukshëm mes dy vlerave të kohës). Ju mund të ndryshoni rezolucionin vetëm një herë. Mekanizmi që siguron këtë fleksibilitet konsumon memorie, prandaj, sapo rezolucioni të vendoset shprehimisht, ne lironi memorjen, duke parandaluar përditësimet e mëtejshme. (Nëse nuk e vendosni rezolucionin shprehimisht, atëherë me default do të jetë një nanosekond, dhe memorja do të lirohet sa herë që fillon simulimi.)

Këto dy linja skripte përdoren për të aktivizuar dy komponentë regjistrimi që janë të integruar në aplikacione EchoClient dhe EchoServer:

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

Nëse keni lexuar dokumentacionin për komponentin Logging, do të shihni se ka disa nivele detajesh regjistrimi që mund të aktivizoni për secilin komponent. Këto dy rreshta kodi aktivizojnë regjistrimin e gabimeve në nivelin INFO për klientët dhe serverët e echo. Në këtë nivel, aplikacioni gjatë simulimit do të printojë mesazhe gjatë dërgimit dhe marrjes së paketimeve.

Tani do të kalojmë drejtpërdrejt në krijimin e topologjisë dhe fillimin e simulimit. Ne do të angazhojmë objekte ndihmëse topologjike për ta bërë këtë punë sa më të lehtë të jetë e mundur.

4.2.6 Përdorimi i Asistentëve Topologjikë

Dy rreshtat e mĂ«poshtĂ«m tĂ« kodit nĂ« skriptin tonĂ« faktikisht do tĂ« krijojnĂ« objektet Node ns‑3, tĂ« cilat do tĂ« pĂ«rfaqĂ«sojnĂ« kompjuterĂ«t nĂ« simullim.

NodeContainer nodes;
nodes.Create (2);

Para se tĂ« vazhdojmĂ«, le tĂ« gjejmĂ« dokumentacionin pĂ«r klasĂ«n NodeContainer. NjĂ« mĂ«nyrĂ« tjetĂ«r pĂ«r tĂ« hyrĂ« nĂ« dokumentacionin pĂ«r kĂ«tĂ« klasĂ« Ă«shtĂ« pĂ«rmes tabit Classes nĂ« faqet Doxygen. NĂ«se keni hapur tashmĂ« Doxygen, thjesht rrokullisni lart deri nĂ« fundin e faqes dhe zgjidhni skedĂ«n Classes. Duhet tĂ« shihni njĂ« grup tĂ« ri skedash, njĂ« nga tĂ« cilat Ă«shtĂ« lista e klasave. NĂ«n kĂ«tĂ« skedĂ« do tĂ« shihni listĂ«n e tĂ« gjitha klasave ns‑3. Rrokullisni poshtĂ«, deri ns3 :: NodeContainer. Kur tĂ« gjeni klasĂ«n, zgjidhni atĂ« pĂ«r tĂ« kaluar nĂ« dokumentacionin pĂ«r klasĂ«n.

Siç e kujtojmĂ«, njĂ« nga abstraksionet tona kryesore Ă«shtĂ« nyja. Ajo pĂ«rfaqĂ«son njĂ« kompjuter, tĂ« cilit do t'i shtojmĂ« gjĂ«ra si stekat e protokolleve, aplikacionet dhe kartat periferike. NdihmĂ«s i topologjisĂ« NodeContainer siguron njĂ« mĂ«nyrĂ« tĂ« lehtĂ« pĂ«r tĂ« krijuar, menaxhuar dhe aksesuar çdo objekt Node, qĂ« krijojmĂ« pĂ«r tĂ« nisur simuluar. E para rreshti mĂ« sipĂ«r thjesht shpall NodeContainer, qĂ« e quajmĂ« nodes. Rreshti i dytĂ« thĂ«rret metodĂ«n Create pĂ«r objektin nodes dhe kĂ«rkon qĂ« kontejneri tĂ« krijojĂ« dy nyje. Siç pĂ«rshkruhet nĂ« Doxygen, kontejneri kĂ«rkon nĂ« sistemin ns‑3 krijimin e dy objekteve Node dhe mban referencat pĂ«r kĂ«to objekte brenda vetes.

Nodet e krijuara në skript, për momentin nuk bëjnë asgjë. Hapi tjetër në ndërtimin e topologjisë është lidhja e nodet tona me rrjetin. Forma më e thjeshtë e rrjetit që mbështesim është lidhja midis dy nodave. Tani do të krijojmë një lidhje të tillë.

PointToPointHelper

Ne krijojmë një lidhje dy-pikëshe duke vepruar sipas një modeli të njohur për ne, duke përdorur një objekt ndihmës topologjik për të kryer punët e nivelit të ulët të nevojshme për lidhjen. Le të kujtojmë se dy abstraksionet tona kryesore NetDevice dhe Kanal. Në botën reale, këto terma përkojnë përafërsisht me kartat periferike dhe kabujt e rrjetit. Për zakonisht, këto dy gjëra janë të lidhura ngusht dhe askush nuk mund të presë ndërrim, për shembull, të pajisjeve Ethernet nëpërmjet një kanali pa tel. Ndihmësit tanë topologjikë ndjekin këtë lidhje të ngushtë dhe prandaj në këtë skenar do të përdorni një objekt PointToPointHelper për të konfiguruar dhe lidhur objektet ns-3 PointToPointNetDevice dhe PointToPointChannel. Tre rreshtat e ardhshëm në skenar:

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

Rreshti i parë,

PointToPointHelper pointToPoint;

krijon në stack një instancë të objektit PointToPointHelper. Nga një këndvështrim të përgjithshëm, rreshti i mëposhtëm,

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

i thotë subjektit PointToPointHelper të përdorë vlerën «5 Mbit/s» (pesë megabit në sekondë) si «DataRate».

Nga njĂ« kĂ«ndvĂ«shtrim mĂ« konkret, rreshti «DataRate» i pĂ«rgjigjet asaj qĂ« quajmĂ« atribut PointToPointNetDevice. NĂ«se shikoni nĂ« Doxygen pĂ«r klasĂ«n ns3::PointToPointNetDevice dhe nĂ« dokumentacionin e metodĂ«s GetTypeId do tĂ« gjeni njĂ« listĂ« atributesh tĂ« pĂ«rcaktuara pĂ«r pajisjen. Mes tyre do tĂ« jetĂ« atributi «DataRate». Shumica e objekteve tĂ« dukshme pĂ«r pĂ«rdoruesit nĂ« ns‑3 kanĂ« lista tĂ« ngjashme atributesh. Ne e pĂ«rdorim kĂ«tĂ« mekanizĂ«m pĂ«r konfigurimin e thjeshtĂ« tĂ« simulimit pa nevojĂ«n pĂ«r rikompilim, siç do tĂ« shihni nĂ« seksionin e ardhshĂ«m.

Përveç «DataRate» në PointToPointNetDevice, do të gjeni atributin «Delay», i lidhur me PointToPointChannel. Rreshti përfundimtar,

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

thotë PointToPointHelper të përdorë vlerën «2 ms» (dy milisekonda) si vlerën e vonesës së përhapjes në kanal, të cilin ai e krijon më pas.

NetDeviceContainer

Derisa kemi në skenarin tonë NodeContainer, i cili përmban dy nyje. Ne kemi PointToPointHelper, e cila është e përgatitur për të krijuar objekte PointToPointNetDevices dhe lidhjen e tyre me anë të objektit PointToPointChannel. Ashtu siç e përdorëm për të krijuar nyjat objektin ndihmues të topologjisë NodeContainer, ne do të kërkojmë PointToPointHelper të kryejë për ne punën që lidhet me krijimin, konfigurimin dhe vendosjen e pajisjeve tona. Na nevojitet një listë e të gjithëve objekteve të krijuara NetDevice, prandaj ne përdorim NetDeviceContainer për ruajtjen e tyre ashtu siç ne përdorëm NodeContainer për ruajtjen e nyjave të krijuara prej nesh. Dy rreshtat e ardhshëm të kodit,

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

përfundojnë konfigurimin e pajisjeve dhe kanaleve. Rresht i parë shpall konteinerin e pajisjeve, të përmendur më sipër, dhe rreshti i dytë kryen punën kryesore. Metoda Instalo objektit PointToPointHelper pranon NodeContainer si parametr. Brenda NetDeviceContainer për çdo nyje që ndodhet në NodeContainer krijohet (për lidhjen pikë-pikë duhet të jenë pikërisht dy) PointToPointNetDevice krijohet dhe ruhet në konteinerin e pajisjeve. PointToPointChannel krijohet dhe i bashkangjiten dy PointToPointNetDevices. Pas krijimit të objekteve, atributet e ruajtura në PointToPointHelper, përdoren për inicializimin e atributet përkatëse në objektet e krijuara.

Pas thirrjes pointToPoint.Install (nodes) ne do të kemi dy nyje, secila me një pajisje rrjeti "pikë në pikë" dhe një lidhje "pikë në pikë" midis tyre. Të dy pajisjet do të konfigurohen për të transmetuar të dhëna me shpejtësi pesë megabit në sekondë me një vonesë transmetimi në kanalin e dy milisekondave.

InternetStackHelper

Tani kemi konfiguruar nyjet dhe pajisjet, por në nyjet tona nuk janë instaluar stekët e protokolleve. Dy rreshtat e mëposhtëm të kodit do të kujdesen për këtë.

InternetStackHelper stack;
stack.Install (nodes);

InternetStackHelper — pĂ«rfaqĂ«son njĂ« ndihmĂ«s topologjie pĂ«r stekĂ«t e internetit, tĂ« ngjashĂ«m me PointToPointHelper pĂ«r pajisjet rrjetĂ« pikĂ« nĂ« pikĂ«. Metoda Instalo pranon NodeContainer si njĂ« parametrin. Pasi ekzekutohet, do tĂ« instalojĂ« stekun e internetit (TCP, UDP, IP etj.) nĂ« çdo nyje tĂ« kontenierit.

Ipv4AddressHelper

Pastaj na nevojitet të lidhim pajisjet tona me adresat IP. Ne ofrojmë një ndihmës topologjie për të menaxhuar shpërndarjen e adresave IP. Lloji i vetëm i API të dukshëm për përdoruesin është vendosja e adresës IP bazë dhe maskës së rrjetit për t'u përdorur gjatë shpërndarjes aktuale të adresave (kjo bëhet në një nivel më të ulët brenda ndihmësit). Rreshtat e mëposhtëm të kodit në shembullin tonë të skriptit first.cc,

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

deklarojnĂ« njĂ« objekt ndihmĂ«s pĂ«r adresĂ«n dhe i thonĂ« atij se duhet tĂ« fillojĂ« tĂ« ndajĂ« adresat IP nga rrjeti 10.1.1.0, duke pĂ«rdorur maskĂ«n e bitĂ«ve 255.255.255.0 pĂ«r pĂ«rcaktim. NĂ« mĂ«nyrĂ« tĂ« parazgjedhur, adresat e ndara do tĂ« fillojnĂ« nga njĂ« dhe do tĂ« rriten nĂ« mĂ«nyrĂ« monotone, kĂ«shtu qĂ« adresa e parĂ« e ndarĂ« nga kjo bazĂ« do tĂ« jetĂ« 10.1.1.1, pastaj 10.1.1.2 etj. NĂ« praktikĂ«, nĂ« nivel tĂ« ulĂ«t, sistemi ns‑3 mban mend tĂ« gjitha adresat IP tĂ« ndara dhe gjeneron njĂ« gabim fatal nĂ«se aksidentalisht krijoni njĂ« situatĂ« ku e njĂ«jta adresĂ« do tĂ« gjenerohet dy herĂ« (nĂ« fakt, ky gabim Ă«shtĂ« i vĂ«shtirĂ« pĂ«r t'u debug-uar).

Rreshti tjetër i kodit,

Ipv4InterfaceContainer interfaces = address.Assign (devices);

pĂ«rcakton adresĂ«n e tij faktike. NĂ« ns‑3 ne krijojmĂ« lidhjen midis adresĂ«s IP dhe pajisjes duke pĂ«rdorur objektin Ipv4Interface. Ashtu siç na nevojitet ndonjĂ«herĂ« njĂ« listĂ« e pajisjeve tĂ« rrjetit qĂ« janĂ« krijuar nga ndihmĂ«si pĂ«r pĂ«rdorim tĂ« mĂ«vonshĂ«m, ndonjĂ«herĂ« na nevojitet njĂ« listĂ« e objekteve Ipv4Interface. Ipv4InterfaceContainer qĂ« ofron kĂ«tĂ« funksionalitet.

Ne ndërtuam një rrjet pikë-në-pikë, me stakë të vendosur dhe adresa IP të caktuara. Tani na duhen aplikacione në çdo nyje për të gjeneruar trafik.

4.2.7 Përdorimi i Aplikacionit

NjĂ« tjetĂ«r nga abstraksionet kryesore tĂ« sistemit ns‑3 Ă«shtĂ« Application (aplikacioni). NĂ« kĂ«tĂ« skenar, ne pĂ«rdorim dy specializime tĂ« klasĂ«s bazĂ« Application ns‑3 tĂ« quajtur UdpEchoServerApplication dhe UdpEchoClientApplication. Ashtu si nĂ« rastet e mĂ«parshme, ne pĂ«rdorim objekte ndihmĂ«se pĂ«r tĂ« konfiguruar dhe menaxhuar objektet bazĂ«. KĂ«tu ne pĂ«rdorim UdpEchoServerHelper dhe UdpEchoClientHelperobjekte, pĂ«r tĂ« lehtĂ«suar jetĂ«n tonĂ«.

UdpEchoServerHelper

Rreshtat e mëposhtme të kodit në shembullin tonë të skriptit first.cc, përdoren për të konfiguruar aplikacionin e serverit UDP echo në një nga nyjet që e krijuam më parë.

UdpEchoServerHelper echoServer (9);

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

Linia e parë e kodit në fragmentin e mësipërm krijon UdpEchoServerHelper. Si zakonisht, kjo nuk është një aplikacion vetë, por një objekt që na ndihmon të krijojmë aplikacione reale. Një nga marrëveshjet tona është të kalojmë atributet e nevojshme në konstruktorin e objektit ndihmës. Në këtë rast, ndihmësi nuk mund të bëjë asgjë të dobishme nëse nuk i jepet numri i portës në të cilën serveri do të presë paketa, ky numër gjithashtu duhet të jetë i njohur për klientin. Në këtë rast, ne i kalojmë konstruktorit të ndihmës numrin e portës. Konstruktor, nga ana e tij, thjesht executon SetAttribute me vlerën e dorëzuar. Më vonë, nëse dëshirohet, me anë të SetAttribute do të jeni në gjendje të vendosni një vlerë tjetër për atributin "Port".

Si shumĂ« objekte tĂ« tjera ndihmĂ«se, objekti UdpEchoServerHelper ka njĂ« metodĂ« Instalo. Ekzekutimi i kĂ«saj metode, nĂ« tĂ« vĂ«rtetĂ« krijon njĂ« aplikacion bazĂ« tĂ« serverit tĂ« jehonĂ«s dhe e lidh atĂ« me nodin. ËshtĂ« interesante se metoda Instalo pranon NodeContainter si njĂ« parametĂ«r, po ashtu si dhe metodat e tjera Instalo qĂ« kemi parĂ«.

Konvertimi implicit nĂ« C++, qĂ« funksionon kĂ«tu, merr rezultatin e metodĂ«s node.Get (1) (i cili kthen njĂ« tregues tĂ« zgjuar nĂ« objektin e nodit — Ptr ) dhe e pĂ«rdor nĂ« konstruktorin pĂ«r objektin anonim NodeContainer, i cili pastaj i kalon metodĂ«s Instalo. NĂ«se nuk mund tĂ« pĂ«rcaktoni nĂ« kodin C++ se cila nĂ«nshkrim metode kompilohet dhe ekzekutohet, atĂ«herĂ« kĂ«rkoni mes konvertimeve tĂ« heshtura.

Tani ne shohim se echoServer.Install do të instalohet aplikacionin UdpEchoServerApplication në të gjetur në NodeContainer, që ne e përdorim për të menaxhuar nodet tona, nodi me indeks 1. Metoda Instalo do të kthejë një kontejner që përmban treguesit për të gjitha aplikacionet (në këtë rast një, sepse ne kaluam një NodeContainer, që përmban një nod) të krijuar nga ndihmësi.

Aplikacionet kĂ«rkojnĂ« tĂ« specifikojnĂ« momentin e fillimit pĂ«r gjenerimin e trafikut "start" dhe mund tĂ« kĂ«rkohet gjithashtu tĂ« specifikohet koha kur duhet tĂ« ndalet "stop". Ne ofrojmĂ« tĂ« dy parametrat. KĂ«to kohĂ« setohen me metodat ApplicationContainer Start dhe Stop. KĂ«to metoda marrin parametra tĂ« tipit Koha. NĂ« kĂ«tĂ« rast ne pĂ«rdorim njĂ« sekuencĂ« tĂ« qartĂ« konvertimesh C++, pĂ«r tĂ« marrĂ« C++ double 1.0 dhe e konverton atĂ« nĂ« objektin tns‑3 Time, duke pĂ«rdorur objektin Seconds pĂ«r ta pĂ«rkthyer nĂ« sekonda. Mbani mend se rregullat e konvertimit mund tĂ« kontrollohen nga autori i modelit, dhe C++ ka rregullat e veta, prandaj nuk mund tĂ« mbĂ«shteteni gjithmonĂ« nĂ« atĂ« qĂ« parametrat do tĂ« konvertohen ashtu siç prisni. Dy rreshta,

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

do të shkaktojë që aplikacioni i echo-server të startojë (të aktivizohet automatikisht) një sekondë pas fillimit të simullimit dhe të ndalet (të çaktivizohet) pas dhjetë sekondash simullimi. Për shkak se ne shpallëm një ngjarje simullimi (ngjarje ndalimi i aplikacionit), e cila do të realizohet pas dhjetë sekondash, simullimi do të tregojë të paktën dhjetë sekonda punë të rrjetit.

UdpEchoClientHelper

Aplikacioni i klientit echo konfigurohet në një mënyrë, praktikisht të ngjashme me serverin. Ekziston një objekt bazik UdpEchoClientApplication, i cili menaxhohet nga
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));

Megjithatë, për klientin e echo-s, na nevojiten pesë atribute të ndryshme. Dy atributet e para vendosen gjatë krijimit. UdpEchoClientHelperNe kalojmë parametra, të cilët përdoren (brenda ndihmës) për vendosjen e atributeve. «RemoteAddress» dhe «RemotePort» në përputhje me marrëveshjen tonë për kalimin e parametrave të nevojshëm në ndihmësin konstruktor.

Kujtojmë se kemi përdorur Ipv4InterfaceContainer për të ndjekur adresat IP që i kemi caktuar pajisjeve tona. Interface-i zero në kontejnerin e interface-ve do të përputhet me adresën IP të nodit zero në kontejnerin e nodave. Interface-i i parë në kontejnerin e interface-ve përputhet me adresën IP të nodit të parë në kontejnerin e nodave. Pra, në rreshtin e parë të kodit (në krye), ne krijojmë ndihmësin dhe i njoftojmë se adresa e largët e klientit do të jetë adresa IP e caktuar nodit ku ndodhet serveri. gjithashtu i themi se duhet të organizojmë dërgimin e paketave në portin e nëntë.

Atributi «MaxPackets» i tregon klientit numrin maksimal të paketave që mund të dërgojmë gjatë modelimit. Atributi «Interval» i tregon klientit sa gjatë duhet të presë mes paketave, dhe atributi «PacketSize» i thotë klientit sa e madhe duhet të jetë ngarkesa e paketës. Me këtë kombinim atributesh, i themi klientit të dërgojë një paketë 1024-byte.

Si në rastin e serverit të echo-s, ne caktuam atributet për klientin e echo-s, Start dhe Stop, por këtu e aktivizojmë klientin një sekondë pas aktivizimit të serverit (pas dy sekondash nga fillimi i simulimit).

4.2.8 Simuluesi

Në këtë fazë, na nevojitet të fillojmë simulimin. Kjo bëhet përmes funksionit global Simulator::Run.

Simulator::Run ();

Kur më parë thirrëm metodat,

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

ne në fakt planifikojmë ngjarje në simulator për 1.0 sekondë, 2.0 sekondë dhe dy ngjarje për 10.0 sekonda. Pas thirrjes Simulator::Run, sistemi do të fillojë të shqyrtojë listën e ngjarjeve të planifikuara dhe t'i realizojë ato. Së pari, do të aktivizojë ngjarjen pas 1.0 sekondash, e cila do të aktivizojë aplikacionin e serverit të jehonës (kjo ngjarje mund, nga ana tjetër, të planifikojë shumë ngjarje të tjera). Pastaj do të aktivizojë ngjarjen, e cila është planifikuar për t = 2.0 sekonda, që do të aktivizojë aplikacionin e klientit të jehonës. Përsëri, kjo ngjarje mund të planifikojë shumë ngjarje të tjera. Implementimi i ngjarjes së aktivizimit në klientin e jehonës do të fillojë fazën e transmetimit të të dhënave të simulimit, duke dërguar një paketë në server.

Aktivizimi i dërgimit të paketës në server do të thërrasë një zinxhir ngjarjesh, të cilat do të planifikohen automatikisht pas skenës dhe që do të realizojnë mekanikën e dërgimit të paketave të jehonës në përputhje me parametrat e sinkronizimit që kemi vendosur në skenar.

Si rezultat, pasi po dërgojmë vetëm një paketë (kujtojmë, atributi MaxPackets u vendos në një), zinxhiri i ngjarjeve të iniciuar nga kjo kërkesë e vetme e klientit të jehonës do të përfundojë, dhe simulimi do të kalojë në modin pritës. Sapo të ndodhë kjo, ngjarjet e mbetura të planifikuara do të jenë ngjarjet Stop për serverin dhe klientin. Kur këto ngjarje përfundojnë, nuk do të ketë ngjarje për përpunim të mëtejshëm dhe Simulator::Run do të kthejë kontrollin. Simulimi ka përfunduar.

Ka mbetur vetĂ«m tĂ« pastrohet. Kjo bĂ«het duke thirrur funksionin global Simulator::Destroy. Duke qenĂ« se janĂ« thirru funksionet ndihmĂ«se (ose kodi i nivelit tĂ« ulĂ«t ns-3), tĂ« cilat janĂ« organizuar nĂ« mĂ«nyrĂ« qĂ« nĂ« simulator tĂ« futen kanale pĂ«r shkatĂ«rrimin e tĂ« gjitha objekteve qĂ« janĂ« krijuar. Nuk keni nevojĂ« tĂ« ndiqni asnjĂ« prej kĂ«tyre objekteve vetĂ« — gjĂ«ja e vetme qĂ« duhet tĂ« bĂ«ni Ă«shtĂ« tĂ« thirrni Simulator::Destroy dhe tĂ« dilni. Sistemi ns-3 do ta bĂ«jĂ« kĂ«tĂ« punĂ« tĂ« vĂ«shtirĂ« pĂ«r ju. Rreshtat e mbetur tĂ« skriptit tonĂ« tĂ« parĂ« ns-3, first.cc, e bĂ«jnĂ« pikĂ«risht kĂ«tĂ«:

Simulator::Destroy ();
return 0;
}

Kur do të ndalet simuluesi?

ns-3 është një simulator i ngjarjeve diskrete (DE). Në një simulator të tillë, secila ngjarje lidhet me kohën e saj të ekzekutimit, dhe simulimi vazhdon me përpunimin e ngjarjeve në rendin e ndodhjes së tyre gjatë simulimit. Ngjarjet mund të shkaktojnë planifikimin e ngjarjeve të ardhshme (p.sh., një timer mund të ri-planifikojë veten për të përfunduar numërimin në intervalin e ardhshëm).

Ngjarjet fillestare zakonisht iniciohen nga një objekt, për shembull, IPv6 do të planifikojë përcaktimin e shërbimeve në rrjet, kërkesat e fqinjëve etj. Aplikacioni planifikon ngjarjen e parë për dërgimin e paketave etj. Kur ngjarja përpunohet, ajo mund të gjenerojë zéro, një ose më shumë ngjarje. Gjatë ekzekutimit të simuluar, ndodhin ngjarje, duke përfunduar thjesht ose duke gjeneruar të reja. Simulimi do të ndalet automatikisht, nëse radhitja e ngjarjeve rezulton bosh ose zbulohet një ngjarje speciale. StopNgjarja Stop gjenerohet nga funksioni Simulator::Stop (ndaloni kohën).

Ka një rast tipik ku Simulator::Stop është absolutisht e nevojshme për të ndaluar simulaimin: kur ka ngjarje vetë-mbështetëse. Ngjarjet vetë-mbështetëse (ose përsëritëse) janë ngjarje që gjithmonë riplanifikohen. Si pasojë, ato gjithmonë e mbajnë radhitjen e ngjarjeve jo bosh. Ka shumë protokolle dhe module që përmbajnë ngjarje përsëritëse, për shembull:

‱ FlowMonitor — kontroll periodike pĂ«r paketa tĂ« humbura;

‱ RIPng — shpĂ«rndarje periodike e pĂ«rditĂ«simeve tĂ« tabelave tĂ« routing;

‱ etj.

NĂ« raste tĂ« tilla Simulator::Stop nevojitet pĂ«r ndalimin e saktĂ« tĂ« simulimit. PĂ«r mĂ« tepĂ«r, kur ns‑3 Ă«shtĂ« nĂ« modin e emulimit, RealtimeSimulator pĂ«rdoret pĂ«r tĂ« sinkronizuar orĂ«t e simulimit me orĂ«t e makinĂ«s, dhe Simulator::Stop nevojitet pĂ«r ndalimin e procesit.

Shumë nga programet e simulimit në manual nuk thirren Simulator::Stop shprehimisht, pasi përfundojnë automatikisht me shterimin e ngjarjeve në radhë. Megjithatë, këto programe gjithashtu do të pranojnë thirrjen Simulator::Stop. Për shembull, operatori shtesë në shembullin e parë të programit do të planifikojë një ndalim të shprehur në sekondën 11:

+ Simulator::Stop (Sekondat (11.0));
  Simulator::Run ();
  Simulator::Destroy ();
  kthehu 0;
}

Më sipër, kjo në realitet nuk do të ndryshonte sjelljen e këtij programi, pasi kjo simulim specifik përfundon natyrshëm pas 10 sekondash. Por nëse do të ndryshonit kohën e ndalimit në operatorin e mësipërm nga 11 sekonda në 1 sekondë, do të vërenit se simulimi ndalet para se çdo dalje të shfaqet në ekran (pasi dalja ndodh rreth 2 sekondash kohë simulimi).

ËshtĂ« e rĂ«ndĂ«sishme tĂ« thĂ«rrasĂ«sh Simulator::Stop para Simulator::Run; nĂ« tĂ« kundĂ«rt, Simulator::Run mund tĂ« mos kthejĂ« kurrĂ« kontrollin te programi kryesor pĂ«r tĂ« ekzekutuar ndalimin!

4.2.9 Ndërtesa e skenarit tuaj

E kemi bërë krijimin e skenarëve tuaj të thjeshtë triviale. Të gjitha që ju nevojitet është të vendosni skenarin tuaj në katalogun scratch, dhe ai do të mbledhë automatikisht nëse e nisni. Waf. Le të provojmë. Kthehuni në katalogun e nivelit të lartë dhe kopjoni examples/tutorial/first.cc në katalog scratch

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

Tani, krijoni shembullin tuaj të parë të skenarit duke përdorur waf:

$ ./waf

Duhet të shihni mesazhe që tregojnë se shembulli juaj i parë është krijuar me sukses.

Waf: Duke hyrë në katalogun `/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: Duke lënë katalogun `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' përfundoi me sukses (2.357s)

Tani mund të nisni shembullin (vëreni që nëse krijoni programin tuaj në katalogun scratch, do të duhet ta nisni atë nga scratch):

$ ./waf --run scratch/myfirst

Duhet të shihni një output të ngjashëm:

Waf: Duke në direktorinë `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build`
Waf: TĂ« largohet nga direktorja `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build`
'build' përfundoi me sukses (0.418s) Dërguar 1024 bytes në 10.1.1.2
Marrë 1024 bytes nga 10.1.1.1
Marrë 1024 bytes nga 10.1.1.2

Këtu mund të shihni se sistemi i ndërtimit po kontrollon nëse skedari është ndërtuar dhe pastaj e drejton atë. Shihni që regjistrimi i komponentës në klientin e echo tregon se dërgoi një paketë 1024-byte në serverin e echo 10.1.1.2. Ju gjithashtu shihni regjistrimin në serverin e echo që thotë se mori 1024 byte nga 10.1.1.1. Serveri i echo e riprodhon paketën në heshtje dhe shihni në regjistrin e klientit të echo që mori paketën e tij pashtu nga serveri.

4.3 Kodi Burimor i ns-3

Tani që keni përdorur disa nga ndihmësit e ns-3, mund të shikoni disa kode burimi që realizojnë këtë funksionalitet. Kodi më i fundit mund të shikohet në serverin tonë të uebit në lidhjen e mëposhtme: https://gitlab.com/nsnam/ns-3-dev.git. Atje do të shihni një faqe përmbledhëse Mercurial për degën tonë të zhvillimit ns-3. Në krye të faqes do të shihni disa lidhje,

përmbledhja | lista e shkurtër | regjistri i ndryshimeve | grafiku | etiketat | skedarët

Shkoni përpara dhe zgjidhni lidhjen për skedarët. Këtu është si do të duket niveli i sipërm i shumicës së repo-ve tona:

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

Shembujt tanĂ« tĂ« skenarĂ«ve ndodhen nĂ« drejtorinĂ« examples. NĂ«se klikoni nĂ« shembuj, do tĂ« shihni njĂ« listĂ« tĂ« nĂ«n-drejtorive. NjĂ« prej skedarĂ«ve nĂ« nĂ«n-drejtorinĂ« tutorial — first.cc. NĂ«se klikoni nĂ« first.cc do tĂ« shihni kodin qĂ« sapo keni studiuar.

Kodi burimor Ă«shtĂ« kryesisht nĂ« direktorinĂ« src. Ju mund ta shihni kodin burimor duke klikuar emrin e direktorive ose duke klikuar nĂ« lidhjen me skedarĂ«t nĂ« tĂ« djathtĂ« tĂ« emrit tĂ« direktorive. NĂ«se klikoni nĂ« direktorinĂ« src, do tĂ« merrni njĂ« listĂ« tĂ« nĂ«n direktorive src. NĂ«se mĂ« pas klikoni nĂ« nĂ«n direktorine core, do tĂ« gjeni njĂ« listĂ« skedarĂ«sh. Skedari i parĂ« qĂ« do tĂ« shihni (nĂ« momentin e shkruanjes sĂ« kĂ«tij udhĂ«zimi) Ă«shtĂ« abort.h. NĂ«se klikoni nĂ« lidhjen abort.h, do tĂ« dĂ«rgoheni nĂ« skedarin burimor pĂ«r abort.h, i cili pĂ«rmban makro tĂ« dobishme pĂ«r tĂ« dalĂ« nga skriptet nĂ«se zbulohen kushte anormale. Kodi burimor pĂ«r ndihmĂ«sit qĂ« kemi pĂ«rdorur nĂ« kĂ«tĂ« kapitull mund tĂ« gjendet nĂ« direktorinĂ« src/Applications/helper. Mos hezitoni tĂ« kĂ«rkoni nĂ« strukturĂ«n e direktorive pĂ«r tĂ« kuptuar se çfarĂ« Ă«shtĂ« ku dhe pĂ«r tĂ« kuptuar stilin e programimit ns‑3.

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster