Õpik vĂ”rgu simulaatorile ns-3. PeatĂŒkk 5

Õpik vĂ”rgu simulaatorile ns-3. PeatĂŒkk 5
peatĂŒkid 1,2
peatĂŒkk 3
peatĂŒkk 4

5 Seadistus
5.1 Logimise mooduli kasutamine
5.1.1 Logimise ĂŒlevaade
5.1.2 Logimise lubamine
5.1.3 Logimise lisamine teie koodile
5.2 KĂ€skluste argumetide kasutamine
5.2.1 Vaikimisi atribuutide vÀÀrtuste ĂŒlekirjutamine
5.2.2 Teie enda kĂ€skluste pĂŒĂŒdmine
5.3 JĂ€lgimissĂŒsteemi kasutamine
5.3.1 ASCII jÀlgimine
ASCII jĂ€lgimise analĂŒĂŒs
5.3.2 PCAP jÀlgimine

PeatĂŒkk 5

Seadistamine

5.1 Logimise mooduli kasutamine

Oleme juba lĂŒhidalt vaadanud ns‑3 logimise moodulit, vaadates skripti first.cc. KĂ€esolevas peatĂŒkis uurime lĂ€hemalt logimise alam-sĂŒsteemi kasutamise vĂ”imalusi.

5.1.1 Logimise ĂŒlevaade

Paljud suured sĂŒsteemid toetavad mingit tĂŒĂŒpi sĂ”numite registreerimise vahendit ning ns‑3 ei ole erand. MĂ”nel juhul salvestatakse „operaatori konsoolisse“ (mis tavaliselt on stderr Unix-pĂ”histes sĂŒsteemides) ainult veateateid. Muudes sĂŒsteemides vĂ”ivad vĂ€ljenduda hoiatussĂ”numid ja ka pĂ”hjalikum teave. MĂ”nel juhul kasutatakse logimise vahendeid tĂ”rkeotsingu sĂ”numite vĂ€ljundiks, mis vĂ”ivad kiiresti vĂ€ljundi "uduseks" muuta.

ns‑3-s kasutatav logimisprotsess eeldab, et kĂ”ik need teavitustasemed on kasulikud, ning pakume valikulist, mitmetasandilist lĂ€henemist sĂ”numite registreerimisele. Logimine vĂ”ib olla tĂ€ielikult vĂ€lja lĂŒlitatud, aktiveeritud ĂŒksikutele komponentidele vĂ”i globaalses mÔÔtkavas. Selleks on kohandatavad teavitustasemed. ns‑3 logimismodul pakub suhteliselt lihtsat viisi kasuliku teabe saamiseks teie simuleerimisest.

Te peaksite mĂ”istma, et pakume universaalset mehhanismi — jĂ€lgimist — andmete vĂ€ljavĂ”tmiseks teie mudelitest, mille tuleks eelistada simuleerimise kĂ€igus (meie jĂ€lgimissĂŒsteemi kohta lisainfoks vaadake Ă”petuse peatĂŒkki 5.3). Logimine peaks olema eelistatud meetod, millega saada tĂ”rketeavet, hoiatusi, veateateid vĂ”i kiiresti edastada sĂ”numeid oma stsenaariumidest vĂ”i mudelitest igal ajal.

Praegu on sĂŒsteemis mÀÀratletud seitse logisĂ”numite taset (tĂŒĂŒpi) teavitustaseme jĂ€rgi kasvavas jĂ€rjekorras.

  • LOG_ERROR — veateadete registreerimine (seotud makro: NS_LOG_ERROR);
  • LOG_WARN — hoiatuste registreerimine (seotud makro: NS_LOG_WARN);
  • LOG_DEBUG — suhteliselt harvaesinevate spetsiaalsete tĂ”rketeadete registreerimine (seotud makro: NS_LOG_DEBUG);
  • LOG_INFO — teabe registreerimine programmi kĂ€itamise kohta (seotud makro: NS_LOG_INFO);
  • LOG_FUNCTION — iga kutsutud funktsiooni kirjeldavate teadete registreerimine (kaks seotud makrot: NS_LOG_FUNCTION, mida kasutatakse liikmete funktsioonide jaoks, ja NS_LOG_FUNCTION_NOARGS, mida kasutatakse staatiliste funktsioonide jaoks);
  • LOG_LOGIC — funktsiooni sees toimuva loogilise voolu kirjeldavate teadete registreerimine (seotud makro: NS_LOG_LOGIC);
  • LOG_ALL — kĂ”igi ĂŒlaltoodud registreerimine (seotud makrot ei ole).
    Iga tĂŒĂŒbi (LOG_TYPE) jaoks on olemas ka LOG_LEVEL_TYPE, mis, kui seda kasutatakse, lubab registreerida lisaks oma tasemele kĂ”ik kĂ”rgemad tasemed. (Seega on LOG_ERROR ja LOG_LEVEL_ERROR ning LOG_ALL ja LOG_LEVEL_ALL funktsionaalselt ekvivalentsed.) NĂ€iteks LOG_INFO lubamine lubab ainult NS_LOG_INFO makrotoimingutega esitatud sĂ”numeid, samas kui LOG_LEVEL_INFO lubamine hĂ”lmab ka NS_LOG_DEBUG, NS_LOG_WARN ja NS_LOG_ERROR makrotoimingutega esitatud sĂ”numeid.

Pakume ka tingimusteta logimise makrot, mis kuvatakse alati, olenemata logimistaseme vÔi komponentide valikust.

  • NS_LOG_UNCOND — tingimusteta logimine seotud sĂ”numi jaoks (ilma seotud logimistaseta).

Iga taset saab kĂŒsida eraldi vĂ”i kumulatiivselt. Logimist saab konfigureerida keskkonnamuutujaga NS_LOG vĂ”i sĂŒsteemifunktsiooni registreerimise kaudu. Nagu eespool nĂ€idatud, on logimisĂŒsteemil Doxygeni dokumentatsioon ja nĂŒĂŒd on see Ă”ige aeg seda vaadata, kui te pole seda veel teinud.

NĂŒĂŒd, kui olete dokumentatsiooni vĂ€ga pĂ”hjalikult lĂ€bi lugenud, kasutame neid teadmisi, et saada huvitavat teavet nĂ€idisstsenaariumi pĂ”hjal. scratch/myfirst.cc, mille olete juba kompileerinud.

5.1.2 Logimise lubamine

Kasutame keskkonnamuutujat NS_LOG, et kÀivitada veel mÔned logid, kuid kÔigepealt, et orienteeruda, kÀivitage viimane skript nagu te varem tegite,

$ ./waf --run scratch/myfirst

Te peaksite nÀgema juba tuttavat vÀljundit esimese nÀidisprogrammi kohta ns-3.

$ Waf: sisenemine katalooge `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: vÀljumine kataloogist `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 'build'
valmis edukalt (0.413s)
Saadetud 1024 baiti aadressile 10.1.1.2
Saadetud 1024 baiti aadressilt 10.1.1.1
Saadetud 1024 baiti aadressilt 10.1.1.2

Leidub, et 'saadetud' ja 'vastu vĂ”etud' sĂ”numid, mida nĂ€ete ĂŒlal, on tegelikult logitud sĂ”numid rakendusest UdpEchoClientApplication ja UdpEchoServerApplication. NĂ€iteks vĂ”ime paluda kliendirakendusel trĂŒkkida lisainfot, seadistades selle logimise taseme keskkonnamuutujaga NS_LOG.

Olen nĂŒĂŒd veendunud, et kasutate sh-sarnast kest, mis kasutab sĂŒntaksi „VARIABLE = value“. Kui kasutate csh-sarnast kesta, peate mu nĂ€ited teisendama sĂŒntaksiks „setenv variable value“, mida need kestad nĂ”uavad.

Praegu vastab UDP ehekliendi rakendus jÀrgmisele koodireale scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

See aktiveerib LOG_LEVEL_INFO logimistaseme. Kui me edastame logimistaseme lippu, lĂŒlitame me tegelikult selle taseme ja kĂ”ik madalamad tasemed sisse. Antud juhul oleme sisse lĂŒlitanud NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN ja NS_LOG_ERROR. Saame logimistaset tĂ”sta ja rohkem teavet saada, ilma skripti muutmata ja uuesti kompileerimata, seadistades keskkonnamuutujat NS_LOG jĂ€rgmiselt:

$ export NS_LOG=UdpEchoClientApplication=level_all

Nii seadistame sh-keskkonna muutujale NS_LOG jÀrgmise vÀÀrtuse.

UdpEchoClientApplication=level_all

Vasak pool mÀÀramisest on registreeritava komponendi nimi, mida soovime seadistada, ja parem pool on lipp, mida soovime selle jaoks rakendada. Antud juhul kavatseme rakenduses aktiveerida kĂ”ik tĂ”rkeotsingu tasemed. Kui kĂ€itate skripti selliselt seadistatud NS_LOG-iga, vĂ”tab ns-3 logimissĂŒsteem muudatused vastu ja peaksite nĂ€gema jĂ€rgmist vĂ€ljundit:

Waf: Sisenemine katalooge `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: VĂ€ljumine kataloogist `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' lÔppes edukalt (0.404s)
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
Saadetud 1024 baiti aadressile 10.1.1.2
Saadetud 1024 baiti aadressilt 10.1.1.1
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
Saadetud 1024 baiti aadressilt 10.1.1.2
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()

Rakenduse pakutav tĂ€iendav tĂ”rkeotsingu teave vastab nĂŒĂŒd NS_LOG_FUNCTION tasemele. See nĂ€itab igat funktsiooni kutsumise juhtumit skripti kĂ€itamise ajal. Üldiselt on funktsioonide puhul eelistatav kasutada (vĂ€hemalt)NS_LOG_FUNCTION (this). Kasutage NS_LOG_FUNCTION_NOARGS ()
ainult staatilistes funktsioonides. Siiski, pidage meeles, et ns‑3 sĂŒsteemis ei ole nĂ”udeid mis tahes logimise funktsionaalsuse sĂ€ilitamiseks. Otsus, kui palju teavet registreeritakse, jÀÀb mudeli arendaja otsustada. Kaja rakenduste puhul on logimiseks saadaval suur hulk vĂ€ljundit.

NĂŒĂŒd saate vaadata rakenduse poolt tehtud funktsioonikutsumise logi. Kui vaatate tĂ€helepanelikult, mĂ€rkate kahe punkti vahel rida UdpEchoClientApplication ja meetodi nime, seal, kus olete vĂ”ib-olla oodanud nĂ€ha C++ nĂ€htavuse operaatorit (::). See on tehtud sihikindlalt.

Tegelikult ei ole see klassi nimi, vaid logimise komponendi nimi. Kui lĂ€htefaili ja klassi vahel on vastavus, on see tavaliselt klassi nimi, kuid peate mĂ”istma, et see ei ole tegelikult klassi nimi, ja seal on ĂŒks kĂ€ik, mitte kaks. See on viis aidata teil konceptuaalselt eristada logimise komponendi nime klassi nimest.

Siiski, mĂ”nel juhul vĂ”ib olla keeruline kindlaks teha, milline meetod tegelikult logi sĂ”numi genereerib. Kui vaatate ĂŒlaltoodud teksti, tekib teil kĂŒsimus, kust tuli rida „Treceived 1024 bytes from 10.1.1.2”. Selle probleemi lahendamiseks saate seadistada taseme prefix_func NS_LOG keskkonnamuutujasse. Proovige jĂ€rgmist,

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

Pange tĂ€hele, et jutumĂ€rgid on vajalikud, kuna vertikaalne joon, mida kasutame ORE-operatsiooni tĂ€histamiseks, on ka Unix'i torude ĂŒhendaja. NĂŒĂŒd, kui kĂ€itate skripti, nĂ€ete, et logimissĂŒsteem tagab, et iga antud logi sĂ”numil on komponendi nimel eelfikseer.

Waf: Sisen katalooge `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Lahkumas katalooge `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' lÔpetati edukalt (0.417 s)
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SeadistaAndmeSuurus(1024)
UdpEchoClientApplication:AlustaRakendust()
UdpEchoClientApplication:AjakavaEdastamine()
UdpEchoClientApplication:Saata()
UdpEchoClientApplication:Saata(): Saadetud 1024 baiti aadressile 10.1.1.2
Saadud 1024 baiti aadressilt 10.1.1.1
UdpEchoClientApplication:KĂ€sitleRead(0x6241e0, 0x624a20)
UdpEchoClientApplication:KĂ€sitleRead(): Saadud 1024 baiti aadressilt 10.1.1.2
UdpEchoClientApplication:PeataRakendus()
UdpEchoClientApplication:KĂ€ivitaHĂ€vitamine()
UdpEchoClientApplication:~UdpEchoClient()

NĂŒĂŒd saate nĂ€ha, et kĂ”ik UDP echo-klientrakendusest saadetud sĂ”numid on tĂ€histatud vastavaks. SĂ”num „Treceived 1024 bytes from 10.1.1.2“ on nĂŒĂŒd selgelt mÀÀratletud kui echo-kliendilt saadetud. ÜlejÀÀnud sĂ”num peab tulema UDP echo-serveri rakendusest. Saame selle komponendi kaasata, sisestades NS_LOG keskkonnamuutujasse komponente, mis on eraldatud kolonidega.

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func:
               UdpEchoServerApplication=level_all|prefix_func'

Hoiatus: ĂŒlaltoodud tekstinĂ€idises peate uue rea sĂŒmboli (: ) eemaldama, kuna see on kasutatud dokumendi vormindamiseks. NĂŒĂŒd, kui teil on skript kĂ€ivitatud, nĂ€ete kĂ”iki logiteateid kliendi- ja serveri-eho rakendustest. See vĂ”ib olla vĂ€ga kasulik silumise kĂ€igus.

Waf: Sisenemine katalooge `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: VĂ€ljumine kataloogist `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' lÔpetatud edukalt (0.406s)
UdpEchoServerApplication:UdpEchoServer()
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoServerApplication:StartApplication()
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
UdpEchoClientApplication:Send(): Saadeti 1024 bitti aadressile 10.1.1.2
UdpEchoServerApplication:HandleRead(): Vastatud 1024 bitti aadressilt 10.1.1.1
UdpEchoServerApplication:HandleRead(): Pakett peegeldatakse
UdpEchoClientApplication:HandleRead(0x624920, 0x625160)
UdpEchoClientApplication:HandleRead(): Vastatud 1024 bitti aadressilt 10.1.1.2
UdpEchoServerApplication:StopApplication()
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()

Samuti on mÔnikord kasulik nÀha simulatsiooni aega, millal logiteade loodi. Sa saad seda teha, lisades ILI bitti. prefix_time:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func|prefix_time: UdpEchoServerApplication=level_all|prefix_func|prefix_time'

Pealegi peate eemaldama eelneva reavahe. Kui nĂŒĂŒd skripti kĂ€ivitate, peaksite nĂ€gema jĂ€rgmist vĂ€ljundit:

Waf: Siseneme katalooge `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Lahkume kataloogist `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' lÔpetati edukalt (0.418s)
0s UdpEchoServerApplication:UdpEchoServer()
0s UdpEchoClientApplication:UdpEchoClient()
0s UdpEchoClientApplication:SetDataSize(1024)
1s UdpEchoServerApplication:StartApplication()
2s UdpEchoClientApplication:StartApplication()
2s UdpEchoClientApplication:ScheduleTransmit()
2s UdpEchoClientApplication:Send()
2s UdpEchoClientApplication:Send(): Saadeti 1024 baiti aadressile 10.1.1.2
2.00369s UdpEchoServerApplication:HandleRead(): Vastatud 1024 baiti aadressilt 10.1.1.1
2.00369s UdpEchoServerApplication:HandleRead(): Paketi kajastamine
2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)
2.00737s UdpEchoClientApplication:HandleRead(): Vastatud 1024 baiti aadressilt 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
10s UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()

Pange tÀhele, et konstruktori jaoks UdpEchoServer kutsuti simuleerimise 0 sekundi ajal. See toimub tegelikult enne simuleerimise algust, kuid see aeg kuvatakse kui null sekundit. Sama kehtib ka konstruktori sÔnumi kohta UdpEchoClient.

Waf: Siseneme katalooge `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Lahkume kataloogist `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' lÔpetati edukalt (0.418s)
0s UdpEchoServerApplication:UdpEchoServer()
0s UdpEchoClientApplication:UdpEchoClient()
0s UdpEchoClientApplication:SetDataSize(1024)
1s UdpEchoServerApplication:StartApplication()
2s UdpEchoClientApplication:StartApplication()
2s UdpEchoClientApplication:ScheduleTransmit()
2s UdpEchoClientApplication:Send()
2s UdpEchoClientApplication:Send(): Saadeti 1024 baiti aadressile 10.1.1.2
2.00369s UdpEchoServerApplication:HandleRead(): Vastatud 1024 baiti aadressilt 10.1.1.1
2.00369s UdpEchoServerApplication:HandleRead(): Paketi kajastamine
2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)
2.00737s UdpEchoClientApplication:HandleRead(): Vastatud 1024 baiti aadressilt 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
10s UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()

Tuletame meelde, et skript scratch/first.cc kĂ€ivitab koheselt ökoserveri rakenduse ĂŒhe sekundi jooksul simuleerimise algusest. NĂŒĂŒd nĂ€ete, et meetod StartApplication serverit kutsutakse tegelikult vĂ€lja esimese sekundi jooksul. Samuti vĂ”ite mĂ€rgata, et ökokliendi kĂ€ivitamine toimub simuleerimise teisel sekundil, nagu soovisime skriptis.

NĂŒĂŒd saate jĂ€lgida simuleerimise kulgu kutsumise kaudu ScheduleTransmit kliendis, mis kutsub esile Send tagasikutsumise HandleRead ökoserveri rakenduses. Pange tĂ€hele, et kahesuunalise lingi kaudu paketi saatmise aeg on 3,69 millisekundit. On nĂ€ha, et ökoserver logib teadet, et ta vastas paketile, ja seejĂ€rel, pĂ€rast kanaliseretardi, nĂ€ete, et ökokliendi HandleRead meetodis saabub öko-pakett.

Selles simuleerimises toimub palju, mis jÀÀb teile mĂ€rkamatuks. Kuid saate kogu protsessi vĂ€ga lihtsalt jĂ€lgida, lubades sĂŒsteemis kĂ”ikide komponentide logimist. Proovige mÀÀrata muutuja NS_LOG jĂ€rgmine vÀÀrtus,

$ export 'NS_LOG=*=level_all|prefix_func|prefix_time'

YllÀ oleva tÀhti on lokikomponentin wildcard, joka mahdollistaa kaikkien lokimerkintöjen sisÀllyttÀmisen kaikista komponenteista simulaatiossa. En toista tulostusta tÀÀllÀ (artikkelin kirjoitushetkellÀ se tuottaa 1265 riviÀ tulostusta yhdelle echo-paketille), mutta voit ohjata tÀmÀn tiedon tiedostoon ja tarkastella sitÀ suosikkieditorissasi.

$ ./waf --run scratch/myfirst > log.out 2>&1

Ma kasutan seda ĂŒlimalt detailsed logimise versiooni, kui mul tekib probleem ja mul pole aimugi, kus midagi valesti lĂ€ks. Ma saan koodi tĂ€itmist ĂŒsna lihtsalt jĂ€lgida, ilma et peaksin seadma katkestuspunktide ja samm-sammult koodi jĂ”udma tĂ”rkedebugeerijasse. Ma vĂ”in lihtsalt vĂ€ljundit mu lemmiktoimetajas redigeerida ja otsida seda, mida ootan, ja nĂ€ha, mis toimub, mida ma ei oodanud. Kui mul on ĂŒldine ettekujutus sellest, mis valesti lĂ€heb, siis lĂ€hen ma tĂ”rkedebugeerijasse, et probleemile sĂŒvitsi minna. Selline vĂ€ljund vĂ”ib olla eriti kasulik, kui teie skript teeb midagi tĂ€iesti ootamatut. Kui kasutate ainult tĂ”rkedebugeerijat, vĂ”ite ootamatud pöörded tĂ€ielikult tĂ€helepanuta jĂ€tta. Logimine teeb need pöörded mĂ€rgatavaks.

5.1.3 Logimise lisamine teie koodile

Saate lisada oma simuleerimisse uusi kirjeid, tehes log komponendi ĂŒleskutsed mitmest makrotest. Teeme seda skriptis myfirst.cc, mida me omaniku „puhas“ kaustas. Tuletame meelde, et oleme sellel skriptil mÀÀratlenud logimise komponendi:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Teadsite, et saate selle komponendi kĂ”igi sĂ”numite logimise lubamiseks seada keskkonnamuutujat NS_LOG erinevatele tasanditele. JĂ€tkame ja lisame mĂ”ned kirjed skripti. Makro, mida kasutatakse teatesĂ”numite logimiseks, on NS_LOG_INFO. Lisame sĂ”numi (vahetult enne, kui hakkame sĂ”lme looma), mis ĂŒtleb teile, et stsenaarium on topoloogia loomise etapis ("Creating Topology"). See tehakse jĂ€rgmises koodifragmendis,
Avage scratch/myfirst.cc oma lemmiktoimetajas ja lisage rida,
NS_LOG_INFO ("Creating Topology");
otse ridade ees,

NodeContainer nodes;
nodes.Create (2);

NĂŒĂŒd kompileerige skript, kasutades waf, ja tĂŒhjendage muutujat NS_LOG, et keelata logimisvoog, mille me varem lubasime:

$ ./waf
$ export NS_LOG=
NĂŒĂŒd, kui te kĂ€ivitate skripti,
$ ./waf --run scratch/myfirst

, siis te ei nĂ€e uut sĂ”numit, kuna seotud logimise komponent (FirstScriptExample) ei olnud lubatud. Et nĂ€ha teie sĂ”numit, peate lubama logimiskomponendi FirstScriptExample logitase taseme seadistamine peab olema vĂ€hemalt NS_LOG_INFO. Kui soovite lihtsalt nĂ€ha seda konkreetset logimist, saate selle sisse lĂŒlitada nii,

$ export NS_LOG=FirstScriptExample=info

Kui kĂ€ivitate skripti nĂŒĂŒd, nĂ€ete uut sĂ”numit «Loome topoloogiat»,

Waf: Sisenen kausta `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Lahkun kaustast `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' lÔpetati edukalt (0.404s)
Loome topoloogiat
Saadetud 1024 baiti aadressile 10.1.1.2
Saadi 1024 baiti aadressilt 10.1.1.1
Saadi 1024 baiti aadressilt 10.1.1.2

5.2 KĂ€skluste argumetide kasutamine

5.2.1 Vaikimisi atribuutide vÀÀrtuste ĂŒlekirjutamine

Teine viis ns‑3 skriptide kĂ€itumise muutmiseks ilma redigeerimise ja kompileerimiseta on kasutada kĂ€surea argumente. Me pakume mehhanismi, mis tĂ”lgendab kĂ€surea argumente ja seadistab automaatselt kohalikke ja globaalseid muutujaid vastavalt tulemustele.

Esimene samm kĂ€surea argumentide sĂŒsteemi kasutamisel on kĂ€surea parsimise programmi kuulutamine. Seda on ĂŒsna lihtne teha (oma pĂ”hiprogrammis), nagu jĂ€rgmises koodis,

int
main (int argc, char *argv[])
{
...
CommandLine cmd;
cmd.Parse (argc, argv);
...
}

See lihtne kahekohaline fragment on tegelikult iseenesest vĂ€ga kasulik. See avab ukse globaalsetele muutujaile ns‑3 ja atribuutide sĂŒsteemile. Lisaime skripti peafunktsiooni algusesse kaks rida koodi. scratch/myfirst.ccLiikudes edasi, kompileerime stsenaariumi ja kĂ€ivitame selle, kĂ€ivitamisel teeme abikĂŒsimuse jĂ€rgmiselt:

$ ./waf --run "scratch/myfirst --PrintHelp"

See kĂ€sk palub Waf kĂ€ivitada skripti scratch/myfirst ja edastada sellele kĂ€surida argument —PrintHelp. ÜmberkĂŒtsed on vajalikud, et nĂ€idata, mille jaoks see argument mĂ”eldud on. KĂ€skude parsimisprotsess avastab argumendi —PrintHelp ja vĂ€ljastab vastuse.

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.413s)
TcpL4Protocol:TcpStateMachine()
CommandLine:HandleArgument(): Handle arg name=PrintHelp value=
--PrintHelp: Print this help message.
--PrintGroups: Print the list of groups.
--PrintTypeIds: Print all TypeIds.
--PrintGroup=[group]: Print all TypeIds of group.
--PrintAttributes=[typeid]: Print all attributes of typeid.
--PrintGlobals: Print the list of globals.

NĂŒĂŒd vaatame valikut —PrintAttributes. Oleme juba maininud ns‑3 atribuutide sĂŒsteemi, kui uurisime skripti first.cc. Oleme nĂ€inud jĂ€rgmisi koodi ridu,

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

ja öeldi, et DataRate on tegelikult atribuut PointToPointNetDevice. Rakendame argumentide analĂŒĂŒsijat atribuutide vaatamiseks PointToPointNetDevice. Abilisti kohaselt peame esitama TypeId. See on klassi nimi, millele huvipakkuvad atribuudid kuuluvad. Meie puhul on see ns3::PointToPointNetDevice. Liigume edasi, sisestage

$ ./waf --run "scratch/myfirst --PrintAttributes=ns3::PointToPointNetDevice"

SĂŒsteem prindib vĂ€lja kĂ”ik selle tĂŒĂŒpi vĂ”rgu seadme atribuudid. NĂ€ete, et loendis on atribuutide seas

--ns3::PointToPointNetDevice::DataRate=[32768bps]:
Vaikimisi andmeedastuskiirus punkt-punkti ĂŒhenduste jaoks

See on vaikimisi vÀÀrtus, mida sĂŒsteem kasutab objekti loomisel PointToPointNetDevice. Üle kirjutame selle vaikimisi vÀÀrtuse parameetriga Attribute ĂŒhes PointToPointHelper ĂŒle. Kasutame vaikimisi vÀÀrtusi punkt-punkt seadmete ja kanalite jaoks. Selleks eemaldame kutsed SetDeviceAttribute ja SetChannelAttribute kohast myfirst.cc, mis meil on puhtas kataloogis.

Teie skript peaks nĂŒĂŒd lihtsalt deklareerima PointToPointHelper ja mitte teha mingeid installimisoperatsioone, nagu on nĂ€idatud allpool olevas nĂ€ites,

...
NodeContainer nodes;
nodes.Create (2);
PointToPointHelper pointToPoint;
NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);
...

JĂ€tkake ja looge uus skript koos Waf (./waf) ja naeme tagasi ja lĂŒlitame sisse mĂ”ned kirjed UDP kaja serveri rakendusest ning lĂŒlitame ajamĂ€rgenduse sisse.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

Kui kÀivitate skripti, peaksite nÀgema jÀrgmist vÀljundit:

Waf: Sisenedes katalooge `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: VĂ€lja sisenedes katalooge `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' lÔpetamine Ônnestus (0.405s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Saadetud 1024 bitti aadressile 10.1.1.2
2.25732s Vastatud 1024 bitti aadressilt 10.1.1.1
2.25732s Kaja pakett
Vastatud 1024 bitti aadressilt 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

Kordame, et eelmisel korral, kui me vaatasime simulatsiooni aega, hetkel, kui kaja server vÔttis paketi vastu, oli see 2,00369 sekundit.

2.00369s UdpEchoServerApplication:HandleRead(): Vastatud 1024 bitti aadressilt 10.1.1.1

NĂŒĂŒd saab ta paketi 2.25732 sekundi jooksul. See on tingitud sellest, et me lihtsalt vĂ€hendasime PointToPointNetDevice edastuskiirus viiest megabitsist sekundis vaikimisi vÀÀrtuseni, mis on 32768 bitti sekundis. Kui me paneksime uue DataRate kĂ€sureale, saaksime meie modelleerimise uuesti kiirendada. Teeme seda jĂ€rgmiselt vastavalt abi elemendi soovitatud valemile:

$ ./waf --run "scratch/myfirst --ns3::PointToPointNetDevice::DataRate=5Mbps"

Tulemuseks naaseb DataRate atribuut vaikimisi viiesse megabitti sekundis. Kas olete tulemusega ĂŒllatunud? Selgub, et algse skripti kĂ€itumise taastamiseks peame samuti seadma kanali viivituse vastavaks valguse kiirusale. Saame paluda kĂ€sureal sĂŒsteemil printida kanali atribuute, samuti nagu me tegime vĂ”rgu seadme puhul:

$ ./waf --run "scratch/myfirst --PrintAttributes=ns3::PointToPointChannel"

Me leiame, et kanali viivituse atribuudi seadistus on jÀrgmine:

--ns3::PointToPointChannel::Delay=[0ns]:
Edastamise viivitus lÀbi kanali

SeejÀrel saame kÀsurea kaudu kahe variandi vaikimisi vÀÀrtused seadistada,

$ ./waf --run "scratch/myfirst
--ns3::PointToPointNetDevice::DataRate=5Mbps
--ns3::PointToPointChannel::Delay=2ms"

Selles juhul taastame aja, mis meil oli, kui me seadsime DataRate ja Delay skriptis selgelt:

Waf: Sisenemine katalooge `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: VĂ€ljumine katalooge `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' lÔpetatud eduka lÔpp-punktiga (0.417s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Saadetud 1024 baiti aadressile 10.1.1.2
2.00369s Vastatud 1024 baiti aadressilt 10.1.1.1
2.00369s Paketi peegeldamine
Vastatud 1024 baiti aadressilt 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

Pange tĂ€hele, et pakk on taas serveri poolt saadud 2.00369 sekundi pĂ€rast. Tegelikult vĂ”iksime sellisel viisil seada mis tahes skriptis kasutatavate atribuutide vÀÀrtusi. Eriti vĂ”iksime seada MaxPackets atribuutide vÀÀrtusi erinevaks kui ĂŒks UdpEchoClient.

Kuidas seda kasutaksite? Proovige. Pidage meeles, et peate kommenteerima koha, kus me mÀÀrame kasutusele atribuudi vaikevÀÀrtuse ja seame selle selgelt. MaxPackets stenaariumis. SeejÀrel peate skripti uuesti ehitama. Samuti saate kÀsurealt abi uue vaikeatribuutide vÀÀrtuse seadistamiseks. Kui olete selle selgeks saanud, saate hallata kÀsureal kuvatavate pakettide arvu. Kuna me oleme pÔhjalikud, peaks meie kÀsurea vÀlimus olema umbes selline:

$ ./waf --run "scratch/myfirst
--ns3::PointToPointNetDevice::DataRate=5Mbps
--ns3::PointToPointChannel::Delay=2ms
--ns3::UdpEchoClient::MaxPackets=2"

Loomulik kĂŒsimus, mis siin esile kerkib, on, kuidas teada saada kĂ”igi nende atribuutide olemasolust. Taaskord on kĂ€sureal selle probleemi lahendamiseks abifunktsioon. Kui kĂŒsime kĂ€surealt abi, peaksime nĂ€gema:

$ ./waf --run "scratch/myfirst --PrintHelp"
myfirst [Program Arguments] [General Arguments]
General Arguments:
--PrintGlobals: Print the list of globals.
--PrintGroups: Print the list of groups.
--PrintGroup=[group]: Print all TypeIds of group.
--PrintTypeIds: Print all TypeIds.
--PrintAttributes=[typeid]: Print all attributes of typeid.
--PrintHelp: Print this help message.

Kui valite argumendi „PrintGroups”, peaksite nĂ€gema kĂ”igi registreeritud gruppide loendit. TypeId. Gruppide nimed vastavad moodulite nimedele lĂ€htekaustas (kuigi suurtĂ€hega). KĂ”igi andmete printimine korraga oleks liiga mahukas, seetĂ”ttu on saadaval tĂ€iendav filter andmete prindimiseks gruppide kaupa. Keskendudes taas moodulile „punktist punkti”:

./waf --run "scratch/myfirst --PrintGroup=PointToPoint"
TypeIds grupis PointToPoint:
ns3::PointToPointChannel
ns3::PointToPointNetDevice
ns3::PointToPointRemoteChannel
ns3::PppHeader

Siit vÔite leida saadaval olevad TypeId nimed atribuutide otsimiseks, nÀiteks
--PrintAttributes = ns3 :: PointToPointChannel, nagu eespool nÀidatud.

Teine viis atribuutide kohta teabe saamiseks on lĂ€bi Doxygen ns‑3. Seal on leht, mis loetleb kĂ”ik simulatsioonis registreeritud atribuudid.

5.2.2 Teie enda kĂ€skluste pĂŒĂŒdmine

Samuti saate kĂ€surea kaudu lisada oma konksud. See on ĂŒsna lihtne, kasutades kĂ€surea parsimise meetodit AddValue.
Kasutame seda vĂ”imalust, et mÀÀrata pakettide arv, mida tuleb kuvada, tĂ€iesti teisel viisil. Lisame kohaliku muutuja nimega nPackets funktsiooni main. Me seame selle ĂŒheks, et see vastaks meie eelmisele vaikekĂ€itumisele. Selleks, et lubada kĂ€surea parseril seda vÀÀrtust muuta, peame selle vÀÀrtuse parserisse jÀÀdvustama. Teeme seda, lisades kutsungi AddValue. Minge ja muutke skripti scratch/myfirst.cc nii, et see algab jĂ€rgmistest koodidest,

int
main (int argc, char *argv[])
{
uint32_t nPackets = 1;
CommandLine cmd;
cmd.AddValue("nPackets", "Pakettide arv, mida kajastada", nPackets);
cmd.Parse(argc, argv);
...

Kerige alla punkti, kus me mÀÀrame atribuudi MaxPackets ja muutke seda nii, et see oleks seadistatud muutujale nPackets, mitte konstandile 1, nagu allpool nÀidatud.

echoClient.SetAttribute ("MaxPackets", UintegerValue(nPackets));

NĂŒĂŒd, kui kĂ€itate skripti ja sisestate argumendi —PrintHelp, peaksite nĂ€gema uut kasutajaargumenti, mis kuvatakse abi ekraanil. Sisestage,

$ ./waf --run "scratch/myfirst --PrintHelp"
Waf: Sisenen kausta `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: VĂ€ljun kaustast `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' lÔpetatud edukalt (0.403s)
--PrintHelp: Kuvab selle abi sÔnumi.
--PrintGroups: Kuvab rĂŒhmade loendi.
--PrintTypeIds: Kuvab kÔik TypeId-d.
--PrintGroup=[group]: Kuvab kÔik TypeId-d grupist.
--PrintAttributes=[typeid]: Kuvab kÔik atribuudid typeid kohta.
--PrintGlobals: Kuvab globaalsete loendi.
Kasutaja argumendid:
--nPackets: Pakettide arv, mida kajastada

Kui soovite muuda edastatavate pakettide arvu, saate seda teha, seadistades kĂ€surea argumendi - -nPackets.

$ ./waf --run "scratch/myfirst --nPackets=2"

NĂŒĂŒd peaksite nĂ€gema

Waf: Sisenemine katalooge `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Lahkumine katalooge `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' lÔpetatud edukalt (0.404s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Saadetud 1024 baiti aadressile 10.1.1.2
2.25732s 1024 baiti saadud aadressilt 10.1.1.1
2.25732s Paketi peegeldamine
Saadud 1024 baiti aadressilt 10.1.1.2
Saadetud 1024 baiti aadressile 10.1.1.2
3.25732s 1024 baiti saadud aadressilt 10.1.1.1
3.25732s Paketi peegeldamine
Saadud 1024 baiti aadressilt 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

Olete nĂŒĂŒd saatnud kaks paketti. Üsna lihtne, eks?
NĂ€gite, et ns‑3 kasutajana saate kĂ€surea argumendi sĂŒsteemi abil hallata globaalsete vÀÀrtuste ja atribuutide seadistusi. Kui olete mudeli autor, saate oma objektidele uusi atribuute lisada, mis on automaatselt kasutajate jaoks kĂ€surea sĂŒsteemi kaudu kohandatavad. Kui olete skripti autor, saate lisada uusi muutujaid oma skriptidesse ja neid probleemideta oma kĂ€surea sĂŒsteemiga ĂŒhendada.

5.3 JĂ€lgimissĂŒsteemi kasutamine

Simulation's core purpose is to generate output for further examination, and the ns-3 tracing system is the primary mechanism for this. Since ns-3 is a C++ program, standard C++ output generation techniques can be utilized.

#include <iostream>
...
int main ()
{
...
std::cout << "The value of x is " << x << std::endl;
...
}

You can even use a logging module to add a bit of structure to your solution. Many issues can arise from this approach, and to address those, we provide a common event tracing subsystem.

The main objectives of the ns-3 tracing system:

  • For basic tasks, the tracing system should allow users to generate standard traces for popular sources and select the objects that generate the traces.

  • Intermediate users should be able to extend the tracing system to modify the output format or to insert new tracing sources without modifying the core of the simulator.

  • Kogenud kasutajad saavad simulaatori pĂ”hikoode modifitseerida, et lisada uusi jĂ€lgimisallikaid ja vastuvĂ”tjaid. ns-3 jĂ€lgimisse sĂŒsteem pĂ”hineb sĂ”ltumatute jĂ€lgimisallikate ja vastuvĂ”tjate pĂ”himĂ”tetel, samuti ĂŒhtsel mehhanismil allikate ĂŒhendamiseks tarbijatega.

ns-3 jĂ€lgimisse sĂŒsteem pĂ”hineb sĂ”ltumatute jĂ€lgimisallikate ja vastuvĂ”tjate pĂ”himĂ”tetel, samuti ĂŒhtsal mehhanismil allikate ĂŒhendamiseks vastuvĂ”tjatega. JĂ€lgimisallikateks on objektid, mis suudavad signaalida sĂŒndmusi, mis toimuvad simuleerimisel ning tagada juurdepÀÀsu huvipakkuvatele aluseks olevatele andmetele. NĂ€iteks vĂ”ib jĂ€lgimisallikas nĂ€idata, millal vĂ”rgu seade sai paketi ja tagada juurdepÀÀsu paketi sisule huvipakkuvatele jĂ€lgimisvastuvĂ”tjatele.

JĂ€lgimisallikad on iseenesest kasutud, kui need ei ole „seotud“ koodi muude osadega, mis teevad sidujate poolt antud teabega midagi kasulikku. JĂ€lgijad on jĂ€lgimisallikate poolt pakutavate sĂŒndmuste ja andmete tarbijad. NĂ€iteks vĂ”ib luua jĂ€lgijate jaoks, mis on ĂŒhendatud eelmise nĂ€ite jĂ€lgimisallikaga, printimise, et kuvada huvipakkuvaid osi saadud paketist.

Sellise selge eristuse mĂ”istlik alus on vĂ”imaldada kasutajatel ĂŒhendada uusi tĂŒĂŒpe jĂ€lgijaid olemasolevate jĂ€lgimisallikatega ilma simulaatori pĂ”hijuurde editimata ja uuesti kompileerimata. Seega saab kasutaja ĂŒlaltoodud nĂ€ites mÀÀrata uue jĂ€lgija oma skriptis ja ĂŒhendada selle olemasoleva jĂ€lgimisallikaga, mis on mÀÀratletud simuleerimise yhi pĂ”hikoodis, lihtsalt muutes kasutaja skripti.

KÀesolevas juhendis kÀsitleme mÔned mÀÀratud allikad ja vastuvÔtjad ning nÀitame, kuidas neid vÔimalikult vÀhese kasutaja pingutusega seadistada. Lisainfot eraldi konfiguratsiooni jÀlgimise kohta leiate ns-3 juhendist vÔi juhiste jaotistest.

5.3.1 ASCII jÀlgimine

ns-3 pakub abifunktsioone, mis pakuvad madalat jĂ€lgimisse sĂŒsteemi, et aidata teil hallata lihtsate paketijĂ€lgimiste detaile. Kui see funktsioon on lubatud, nĂ€ete vĂ€ljundit ASCII failides. Need, kes on tuttavad ns-2 vĂ€ljundiga, peaksid teadma, et see tĂŒĂŒpi jĂ€lgimine on sarnane out.tr, mis on genereeritud arvukate skriptide abil.

Asume aga asja kallale ja lisame mÔned ASCII jÀlgimise tulemused meie skripti scratch/myfirst.cc. Just enne Simulator::Run(), lisage jÀrgmised koodiread:
AsciiTraceHelper ascii;

pointToPoint.EnableAsciiAll(ascii.CreateFileStream("myfirst.tr"));

Nagu paljudes teistes ns‑3 idiomides, kasutab see kood abieksekti ASCII jĂ€lgimise loomiseks. Teises reas on kaks vĂ€hemasti meetodi kutsumist. CreateFileStream () kasutab anonĂŒĂŒmse objekti idiomi, et luua faili voogude objekt virnas (ilma objekti nime) ja edastab selle kutsutud meetodile. Tulevikus sĂŒveneme sellesse, kuid kĂ”ik, mida peate selle etapi kohta teadma, on see, et loote objekti, mis esindab faili nimega myfirst.tr ja edastama selle ns‑3-le. Me usaldame ns‑3-nendel kaetud objektide haldamise kogu nende eluea jooksul, mille jooksul lahendatakse C++ voogude objektide kopeerimise konstruktoritega seotud vĂ€he tuntud (eesmĂ€rgiliselt) piirangud.

VĂ€line kutsumine EnableAsciiAll() teavitab abieksekti, et soovite oma simulatsioonis lubada ASCII jĂ€lgimist kĂ”igi punkt-punkt seadmeĂŒhenduste jaoks ja et soovite, et (mÀÀratud) jĂ€lgijad salvestaksid teavet pakettide edasiviimise kohta ASCII formaadis.

Ns-2-iga tuttavatele on jĂ€lgitavad sĂŒndmused vĂ”rdsed tuntud jĂ€lgimispunktidega, mis logivad sĂŒndmusi „+“, „-“, „d“ ja „r“.
NĂŒĂŒd saate skripti kokku panna ja kĂ€ivitada selle kĂ€surealt:

$ ./waf --run scratch/myfirst

Nagu ka varem, nĂ€ete mitmeid Wafi teateid ja seejĂ€rel „'build' finished successfully“ (ehitamine Ă”nnestus) koos arvukate teadete osalevast programmist.

Töötades loob programm faili nimega myfirst.tr. Erinevuste tĂ”ttu Waf, loodetakse vaikimisi, et fail ei luuakse kohalikus kataloogis, vaid ĂŒlemise taseme hoidlas. Kui soovite muuta teed, kuhu jĂ€lgimisfailid salvestatakse, saate Wafi jaoks kasutada parameetrit --cwd. Kui me seda ei teinud, peame, et vaadata ASCII jĂ€lgimisfaili myfirst.tr oma lemmikredaktoris, minema ĂŒlemise taseme hoidla katalooge.

ASCII jĂ€lgimise analĂŒĂŒs

Seal on palju teavet ĂŒsna tihedas vormis, kuid esimesena, millele tĂ€helepanu pöörata, on see, et fail koosneb eraldi ridadest. See muutub selgelt nĂ€htavaks, kui laiendate vaatamisaknate.

Iga rida failis vastab jĂ€lgimisĂŒritusele. Antud juhul jĂ€lgime ĂŒlekande jĂ€rjekorras tekkivaid sĂŒndmusi, mis on olemas igas vĂ”rkuĂŒhenduspunktis simuleerimisel. Ülekande jĂ€rjekord on jĂ€rjekord, mille kaudu peab iga pakett minema punkt-punkt kanali jaoks. Pange tĂ€hele, et iga rida jĂ€lgimisfailis algab ĂŒhekordse sĂŒmboliga (ja selle jĂ€rel on tĂŒhik). See sĂŒmbol will have the following meaning:

+: seadme jÀrjekorras toimus jÀrjekorda panemise operatsioon;
-: seadme jÀrjekorras toimus elemendi eemaldamise operatsioon;
d: pakett oli tagasi lĂŒkatud, tavaliselt selle tĂ”ttu, et jĂ€rjekord on tĂ€is;
r: pakett oli vĂ”rkuĂŒhendusse saadetud seadme poolt saadud.

Vaatame jÀlgimisfaili esimest rida lÀhemalt. Jagame selle osadeks (selguse huvides) ja ridade numbritega vasakul:

0 +
1 2
2 /NodeList/0/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Enqueue
3 ns3::PppHeader (
4   Punkt-punkt protokoll: IP (0x0021))
6   ns3::Ipv4Header (
7     tos 0x0 ttl 64 id 0 protokoll 17 offset 0 flags [none]
8     pikkus: 1052 10.1.1.1 > 10.1.1.2)
9     ns3::UdpHeader (
10      pikkus: 1032 49153 > 9)
11      Koormus (suurus=1024)

Selle pikendatud jĂ€lgimise sĂŒndmuse esimene jaotis (rida 0) on tehing. Siin on meil sĂŒmbol +, mis vastab edastusjĂ€rjekorda panemise tehingule. Teine jaotis (rida 1) on simuleerimise aeg, vĂ€ljendatuna sekundites. Te vĂ”ite meenutada, et palusime UdpEchoClientApplication alustada pakettide saatmist kahe sekundi pĂ€rast. Siin nĂ€eme kinnitust, et see tĂ”epoolest toimub.

JĂ€rgmisest jĂ€lgimisnĂ€ite jaotusest (alates reast 2) selgub, milline jĂ€lgimisallikas selle sĂŒndmuse tekitab (nĂ€idatakse jĂ€lgimisruumi nime). VĂ”ite kujutada, et jĂ€lgimisruum on rohkem nagu failisĂŒsteemi ruum. JĂ€lgimisruumi juur on NodeList. See vastab konteinerile, mida haldab peamine ns-3 kood. Sellesse kuuluvad kĂ”ik sĂ”lmed, mis skriptis loodakse. Nii nagu failisĂŒsteemis vĂ”ivad juured sisaldada ka kaustu, NodeList meil vĂ”ib olla mitu sĂ”lme. Seega, rida /NodeList/0 viitab null sĂ”lmele NodeList'is, mida me tavaliselt mĂ”tleme kui 'sĂ”lm 0'. Igal sĂ”lmel on seadmete loetelu, mis on paigaldatud. See loetelu asub jĂ€rgmises nimekirjas. NĂ€ete, et see jĂ€lgimise sĂŒndmus pĂ€rineb DeviceList/0, mis on seadme null, mis on paigaldatud sĂ”lmes.

JÀrgmine alamrida, $ ns3 :: PointToPointNetDevice, teatab, milline seade asub null positsioonis: seadmete loetelu null sÔlmes. Tuletame meelde, et operatsioon +, mis asus real 0, tÀhendas, et seadme edastusjÀrjekorda lisati element. See peegeldub viimastes 'rada jÀlgimise' segmentides: TxQueue/Enqueue.

ÜlejÀÀnud lĂ”igud jĂ€lgimises peaksid olema piisavalt arusaadavad. Rida 3-4 nĂ€itab, et pakett on kapseldatud punkt-punkt protokollis. Rida 5-7 nĂ€itab, et paketil on IP4 versiooni pealkiri ja see pĂ€rineb IP-aadressist 10.1.1.1 ja on suunatud 10.1.1.2. Rida 8-9 nĂ€itab, et sellel paketil on UDP pealkiri ja viimaks rida 10 nĂ€itab, et kasuliku koormuse oodatud suurus on 1024 baiti.

JÀrgmine rida jÀlgimisfailis nÀitab, et sama pakk on vÀlja vÔetud edastusjÀrjekorrast samas sÔlmes.

Kolmas rida jĂ€lgimisfailis nĂ€itab, et pakk on vastu vĂ”etud vĂ”rgu seadme poolt sĂ”lmes, kus asub kaja-server. Ma olen selle sĂŒndmuse allpool uuesti esitanud.

0 r
1 2.25732
2 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/MacRx
3   ns3::Ipv4Header (
4     tos 0x0 ttl 64 id 0 protokoll 17 offset 0 flags [none]
5     pikkus: 1052 10.1.1.1 > 10.1.1.2)
6     ns3::UdpHeader (
7       pikkus: 1032 49153 > 9)
8       Kasutajaandmed (suurus=1024)

Pange tĂ€hele, et jĂ€lgimisoperaator on nĂŒĂŒd r, ja simulatsiooni aeg on suurenenud 2,25732 sekundini. Kui olete tĂ€pselt jĂ€rginud Ă”pikuteavet, siis see tĂ€hendab, et olete jĂ€tnud vĂ”rgu seadmete andmeedastuskiirus ja kanali latentsuse nende vaikeseadetesse. See aeg peaks olema tuttav, nagu olete juba eelnevas osas nĂ€inud.

JĂ€lgimise nimekiri (rida 2) on muudetud, et peegeldada, et see sĂŒndmus pĂ€rineb sĂ”lmest 1 (/NodeList/1) Đž паĐșДт ĐżŃ€ĐžĐœŃŃ‚ ĐžŃŃ‚ĐŸŃ‡ĐœĐžĐșĐŸĐŒ Ń‚Ń€Đ°ŃŃĐžŃ€ĐŸĐČĐșĐž (/MacRx). Te peaksite olema suhteliselt lihtne jĂ€lgida paki liikumist lĂ€bi topoloogia, vaadates jĂ€lgimisfailist jĂ€etud andmeid.

5.3.2 PCAP jÀlgimine

ns-3 seadmete abivahendeid saab kasutada ka .pcap formaadis jĂ€lgimisfailide loomiseks. LĂŒhend pcap (tavaliselt kirjutatakse vĂ€ike tĂ€ht) tĂ€histab paketisid ning on tegelikult API, mis hĂ”lmab .pcap faili formaadi mÀÀratlemist. KĂ”ige populaarsem programm, mis suudab seda formaati lugeda ja kuvada, on Wireshark (varem tuntud kui Ethereal). Siiski on palju liiklusjĂ€lgimise analĂŒsereid, mis kasutavad seda paketi formaati. Soovitame kasutajatel kasutada mitmeid tööriistu, mis on saadaval pcap jĂ€lgede analĂŒĂŒsimiseks. Selles juhendis keskendume pcap jĂ€lgede vaatamisele koos tcpdump.

pcap jĂ€lgimise aktiveerimine toimub ĂŒhe koodireaga.

pointToPoint.EnablePcapAll ("myfirst");

Sisestage see koodirida pÀrast ASCII jÀlgimise koodi, mille me just lisasime scratch/myfirst.cc. Pange tÀhele, et edastasime ainult stringi 'myfirst', mitte 'myfirst.pcap' vÔi midagi sarnast. See on sellepÀrast, et parameeter on prefiks, mitte tÀielik faili nimi. Simulatsiooni kÀigus loob assistent tegelikult jÀlgimisfaili iga punkt-punkt seadme jaoks. Failide nimed koostatakse prefiksi, sÔlme numbri, seadme numbri ja sufiksi ' vastu.pcap».

Meie nĂ€ites nĂ€eme lĂ”puks faile nimega „myfirst-0-0.pcap» ja «myfirst-1-0.pcap”, mis on 0-seadmest 0 ja 1-seadmest 0 vastavad pcap jĂ€lgimise failid. PĂ€rast seda, kui olete lisanud koodi rea pcap jĂ€lgimise kaasamiseks, vĂ”ite skripti tavalises vormis kĂ€ivitada:

$ ./waf --run scratch/myfirst

Kui vaadata teie distributsiooni tippkatalooge, peaksite nĂ€gema kolme faili: ASCII jĂ€lgimisfaili myfirst.tr, mille oleme eelnevalt uurinud, faile myfirst-0-0.pcap ja myfirst-1-0.pcap — uusi pcap faile, mille me just genereerisime.

VĂ€ljundi lugemine tcpdumpiga

Praegu on pcap failide vaatamiseks kÔige lihtsam kasutada tcpdumpi.

$ tcpdump -nn -tt -r myfirst-0-0.pcap
lugemine failist myfirst-0-0.pcap, link-tĂŒĂŒp PPP (PPP)
2.000000 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, pikkus 1024
2.514648 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, pikkus 1024
tcpdump -nn -tt -r myfirst-1-0.pcap
lugemine failist myfirst-1-0.pcap, link-tĂŒĂŒp PPP (PPP)
2.257324 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, pikkus 1024
2.257324 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, pikkus 1024

Dumpis myfirst-0-0.pcap (kliendi seade) nÀete, et kaja-pakett saadetakse 2 sekundi jooksul simuleerimise jooksul. Kui vaatate teist dumpi (myfirst-1-0.pcap), nÀete, et pakett vÔetakse vastu hetkel 2,257324 sekundit. Teises dumpis nÀete, et pakett tagastatakse hetkel 2.257324 sekundit ning lÔpuks, et pakett saadeti kliendile tagasi esimeses dumpis hetkel 2.514648 sekundit.

VĂ€ljundi lugemine Wiresharki abil

Kui te ei ole tuttav Wireshark, on veebisait, kust saate alla laadida programme ja dokumentatsiooni: http://www.wireshark.org/. Wireshark — see on graafiline kasutajaliides, mida saab kasutada nende jĂ€lgimisfailide kuvamiseks. Kui teil on Wireshark, saate avada ĂŒkskĂ”ik millise jĂ€lgimisfaili ja kuvada sisu, nagu oleksite paki analĂŒsaatorit kasutades pakette kinni pĂŒĂŒdnud.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster