ns-3 vĂ”rgusimulatori Ă”petus. PeatĂŒkk 5

ns-3 vĂ”rgusimulatori Ă”petus. PeatĂŒkk 5
peatĂŒkid 1,2
peatĂŒkk 3
peatĂŒkk 4

5 Seadistamine
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Ă€skude rida argumentide kasutamine
5.2.1 Vaikimisi atribuudi vÀÀrtuste ĂŒmbersettemine
5.2.2 Oma kĂ€skude 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

LĂŒhipeatĂŒkk 5

Seadistamine

5.1 Logimise mooduli kasutamine

Oleme juba lĂŒhidalt tutvunud ns‑3 logimise mooduliga, vaadates lĂ€bi skripti first.cc. Selles peatĂŒkis vaatame lĂ€hemalt logimise alamsĂŒsteemi kasutamisvĂ”imalusi.

5.1.1 Logimise ĂŒlevaade

Paljud suured sĂŒsteemid toetavad mingit tĂŒĂŒpi sĂ”numite logimise vahendit, ning ns‑3 ei ole erand. MĂ”nel juhul salvestatakse ainult veateated «operaatori konsooli» (mis on tavaliselt stderr Unix-sĂŒsteemides). Teistes sĂŒsteemides vĂ”ivad samuti ilmuda hoiatusteated ja pĂ”hjalikum teave. MĂ”nel juhul kasutatakse logimise vahendeid silumiseteate vĂ€ljundiks, mis vĂ”ivad kiiresti «udustada» vĂ€ljundit.

ns‑3-s kasutatav lĂ€henemine eeldab, et kĂ”ik need informatiivsuse tasemed on kasulikud, ja me pakume valikulist, mitme tasandi lĂ€henemist sĂ”numite logimisele. Logimine vĂ”ib olla tĂ€ielikult keelatud, lubatud ĂŒksikutele komponentidele vĂ”i globaalsetes mÀÀkmetes. Selleks on kohandatavad informatiivsuse tasemed. ns‑3 logimise moodul pakub suhteliselt lihtsat viisi kasuliku teabe saamiseks teie simuleerimisest.

Te peaksite mĂ”istma, et me pakume universaalset mehhanismi - jĂ€lgimist - teie mudelitest andmete saamiseks, mis peaks olema prefektsionaalne vĂ€ljundiks modelleerimisel (kĂ”ige pĂ”hjalikuma teabe saamiseks meie jĂ€lgimissĂŒsteemi kohta vaadake Ă”pikute osa 5.3). Logimine peaks olema eelmainitud meetod silumiseteabe, hoiatusteate, veateadete saamiseks vĂ”i sĂ”numite kiireks vĂ€ljundiks teie skriptidest vĂ”i mudelitest igal hetkel.

Praegu on sĂŒsteemis mÀÀratletud seitse sĂ”numi logimise taset (tĂŒĂŒpi) informatiivsuse jĂ€rjekorras.

  • LOG_ERROR — vigade registreerimise tegemine (seotud makro: NS_LOG_ERROR);
  • LOG_WARN — hoiatavate sĂ”numite registreerimise tegemine (seotud makro: NS_LOG_WARN);
  • LOG_DEBUG — haruldaste eraldi tĂ”rkeotsingu sĂ”numite registreerimise tegemine (seotud makro: NS_LOG_DEBUG);
  • LOG_INFO — teabe registreerimise tegemine programmide kĂ€ivitamise kĂ€igust (seotud makro: NS_LOG_INFO);
  • LOG_FUNCTION — sĂ”numite registreerimise tegemine, mis kirjeldab iga kutsutud funktsiooni (kaks seotud makrot: NS_LOG_FUNCTION, mida kasutatakse liikmeliste funktsioonide jaoks, ja NS_LOG_FUNCTION_NOARGS, mida kasutatakse staatiliste funktsioonide jaoks);
  • LOG_LOGIC — sĂ”numite registreerimise tegemine, mis kirjeldab funktsiooni sees toimuvat loogilist voogu (seotud makro: NS_LOG_LOGIC);
  • LOG_ALL — kĂ”igi eespool loetletud registreerimine (seotud makrot pole).
    Iga tĂŒĂŒbi (LOG_TYPE) jaoks on samuti tĂŒĂŒp LOG_LEVEL_TYPE, mille kasutamisel vĂ”imaldab registreerida lisaks oma tasemele ka kĂ”ik tasemed ĂŒle selle. (Seega on LOG_ERROR ja LOG_LEVEL_ERROR ning LOG_ALL ja LOG_LEVEL_ALL funktsionaalselt ekvivalentsed.) NĂ€iteks LOG_INFO sisselogimine lubab ainult registreeritud sĂ”numeid makro NS_LOG_INFO kaudu, kui LOG_LEVEL_INFO on lubatud, hĂ”lmatakse ka sĂ”numid, mille on edastanud makrod NS_LOG_DEBUG, NS_LOG_WARN ja NS_LOG_ERROR.

Pakume ka tingimusteta logimise makrot, mis kuvatakse alati, olenemata logimise tasemest vÔi valitud komponendist.

  • NS_LOG_UNCOND — tingimusteta registreerimine seotud sĂ”numi jaoks (ilma seotud logimise tasemeta).

Iga taset saab kĂŒsida eraldi vĂ”i kumulatiivselt. Logimist saab seadistada keskkonnamuutujaga NS_LOG vĂ”i registreerimise kaudu sĂŒsteemi funktsiooni kutsega. Nagu eelnevalt nĂ€idatud, on logimissĂŒsteemil Doxygeni dokumentatsioon, ja nĂŒĂŒd on Ă”ige aeg seda vaadata, kui te pole seda veel teinud.

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

5.1.2 Logimise lubamine

Kasutame keskkonnamuutujat NS_LOG, et kÀivitada veel mÔned logid, kuid esmalt, lihtsalt selleks, et orienteeruda, kÀitage viimane skript, nagu te varem tegite.

$ ./waf --run scratch/myfirst

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

$ Waf: Sisen kataloog `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
Waf: Lahkumine kataloogist `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build' 'build'
valmistamine lÔppes edukalt (0.413s)
Saadetud 1024 baiti aadressile 10.1.1.2
Saadi 1024 baiti aadressilt 10.1.1.1
Saadi 1024 baiti aadressilt 10.1.1.2

Selgub, et "saadetud" ja "saadud" sĂ”numid, mida te ĂŒlal nĂ€ete, on tegelikult registreeritud sĂ”numid UdpEchoClientApplication ja UdpEchoServerApplication. NĂ€iteks vĂ”ime paluda kliendi rakendusel vĂ€lja printida lisainfot, seadistades selle logimistase keskkonnamuutuja NS_LOG kaudu.

Alates sellest hetkest eeldan, et kasutate sh-sarnast shelli, mis kasutab sĂŒntaksit „VARIABLE = value”. Kui kasutate csh-sarnast shelli, peate minu nĂ€idised ĂŒmber seadistama sĂŒntaksile „setenv ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœĐ°Ń Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”â€, mida need shellid nĂ”uavad.

Praegu vastab UDP eho klient jÀrgmisele koodireale scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

See aktiveerib logimistase LOG_LEVEL_INFO. Kui me edastame logimistase lippu, aktiveerime tegelikult selle taseme ja kÔik madalamad tasemed. Antud juhul aktiveerisime NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN ja NS_LOG_ERROR. Saame tÔsta logimistaset ja saada rohkem teavet, ilma et skripti muutaksime ja uuesti kompileerime, seades keskkonnamuutuja NS_LOG jÀrgmisel viisil:

$ export NS_LOG=UdpEchoClientApplication=level_all

Nii me seadistame jÀrgmise sh-shelile mÀÀratud NS_LOG vÀÀrtuse,

UdpEchoClientApplication=level_all

Vasak kĂŒlg mÀÀramisest on logitava komponendi nimi, mida soovime seadistada, ja parem kĂŒlg on lipp, mida tahame selle jaoks kasutada. Antud juhul kavatseme rakenduses aktiveerida kĂ”ik silumisastmed. Kui kĂ€itate skripti seadistatud NS_LOG-iga, aktsepteerib ns‑3 logimise sĂŒsteem muudatused ja peaksite nĂ€gema jĂ€rgmisi vĂ€ljundeid:

Waf: Sisenemine katalooge `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
Waf: Lahkumine kataloogist `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
'build' lÔpetati edukalt (0.404s)
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
Saadetud 1024 baiti aadressile 10.1.1.2
Saadi 1024 baiti aadressilt 10.1.1.1
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
Saadi 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 iga funktsiooni vĂ€ljakutsumist skripti tĂ€itmise ajal. Üldjuhul on funktsioonides-moodulites eelistatav kasutada (vĂ€hemalt)NS_LOG_FUNCTION (this). Kasutage NS_LOG_FUNCTION_NOARGS ()
ainult staatilistes funktsioonides. Samas tuleb mĂ€rkida, et ns‑3 sĂŒsteemis ei ole nĂ”udeid mingite ajakirjanduse funktsionaalsuste sĂ€ilitamiseks. Otsus, kui palju teavet registreerida, jÀÀb mudeli arendaja otsustada. Kaja rakenduste puhul on saadaval suur hulk ajakirjanduse vĂ€ljundit.

NĂŒĂŒd saate vaadata rakenduse tehtud funktsioonikutsumiste logi. Kui vaatate tĂ€helepanelikult, siis mĂ€rkate kahepunkti kirja UdpEchoClientApplication ja meetodi nime vahel, seal, kus vĂ”ib-olla ootasite nĂ€ha C++ ulatusoperaatorit (::). See on tehtud meelega.

Tegelikult ei ole see klassi nimi, vaid logimise komponentide nimi. Kui allika faili ja klassi vahel on seos, on see tavaliselt klassi nimi, kuid peate mĂ”istma, et see ei ole tegelikult klassi nimi, ja seal on ĂŒks kahepunkt, mitte kaks. See on viis, kuidas aidata teil suhteliselt Ă”hukeselt kontseptuaalselt eristada logimise komponendi nime klassi nimest.

Kuid mĂ”nel juhul vĂ”ib olla keeruline kindlaks teha, milline meetod tegelikult logimis sĂ”numi genereerib. Kui vaatate ĂŒlaltoodud teksti, siis vĂ”ib teil olla kĂŒsimus, kust tuli string "Received 1024 bytes from 10.1.1.2". Saate selle probleemi lahendada, seades taseme prefix_func NS_LOG keskkonnaparameetrisse. Proovige jĂ€rgmist,

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

Pange tĂ€hele, et jutumĂ€rgid on vajalikud, sest vertikaalne joon, mida kasutame ORE-operatsiooni tĂ€histamiseks, on samuti Unix'i toru ĂŒhendaja. NĂŒĂŒd, kui kĂ€itate skripti, nĂ€ete, et logimis sĂŒsteem tagab, et iga antud logistiku sĂ”numil on eelnev komponentide nimele.

Waf: Sisen katalooge `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build' 
Waf: Lahkub kataloogist `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build' 
'build' lÔpetatud edukalt (0.417s) 
UdpEchoClientApplication:UdpEchoClient() 
UdpEchoClientApplication:SetDataSize(1024) 
UdpEchoClientApplication:StartApplication() 
UdpEchoClientApplication:ScheduleTransmit() 
UdpEchoClientApplication:Send() 
UdpEchoClientApplication:Send(): Saadetud 1024 baidi 10.1.1.2 
VastuvÔetud 1024 baidi 10.1.1.1 
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20) 
UdpEchoClientApplication:HandleRead(): VastuvÔetud 1024 baidi 10.1.1.2 
UdpEchoClientApplication:StopApplication() 
UdpEchoClientApplication:DoDispose() 
UdpEchoClientApplication:~UdpEchoClient()

NĂŒĂŒd vĂ”ite nĂ€ha, et kĂ”ik UDP eho-klientrakendusest saadetud sĂ”numid on tuvastatud kui sellised. SĂ”num „Received 1024 bytes from 10.1.1.2“ on nĂŒĂŒd selgelt mÀÀratletud kui tulemas eho-klientrakendusest. ÜlejÀÀnud sĂ”num peaks tulema UDP eho-serverist. Saame selle komponendi aktiivseks teha, sisestades keskkonnamuutujasse NS_LOG komponente, mille vahel on koolonid.

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

Hoiatus: ĂŒlaltoodud tekstis nĂ€ete, et peate eemaldama uue rea sĂŒmboli pĂ€rast koolonit (:), see on dokumendi vormindamiseks. NĂŒĂŒd, kui kĂ€ivitada skript, nĂ€ete kĂ”iki logisĂ”numeid nii kliendi kui ka serveri eho-rakendustest. See vĂ”ib osutuda vĂ€ga kasulikuks tĂ”rgete leidmisel.

Waf: Siseneb katalooge `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build' 
Waf: Lahkub 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(): Saadetud 1024 baidi 10.1.1.2 
UdpEchoServerApplication:HandleRead(): VastuvÔetud 1024 baidi 10.1.1.1 
UdpEchoServerApplication:HandleRead(): Peegeldades paketti 
UdpEchoClientApplication:HandleRead(0x624920, 0x625160) 
UdpEchoClientApplication:HandleRead(): VastuvÔetud 1024 baidi 10.1.1.2 
UdpEchoServerApplication:StopApplication() 
UdpEchoClientApplication:StopApplication() 
UdpEchoClientApplication:DoDispose() 
UdpEchoServerApplication:DoDispose() 
UdpEchoClientApplication:~UdpEchoClient() 
UdpEchoServerApplication:~UdpEchoServer()

Samuti vÔib mÔnikord olla kasulik nÀha simulatsiooni aega, millal logisÔnum loodi. Selle saavutamiseks vÔite lisada vÔi bit prefix_time:

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

JĂ€llegi peate ĂŒlaltoodud uue rea sĂŒmboli eemaldama. Kui nĂŒĂŒd skripti kĂ€ivitate, peaksite nĂ€gema jĂ€rgmist vĂ€ljundit:

Waf: Sisene kausta `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build` Waf: JÀtab kausta `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build` 'build' lÔpetatud 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(): VastuvÔetud 1024 baiti aadressilt 10.1.1.1 2.00369s UdpEchoServerApplication:HandleRead(): Paketi peegeldamine 2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0) 2.00737s UdpEchoClientApplication:HandleRead(): VastuvÔetud 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 konstruktor UdpEchoServer kutsuti vÀlja simulatsiooni 0 sekundil. See juhtub tegelikult enne simulatsiooni algust, kuid seda aega nÀidatakse kui null sekundit. Sama kehtib ka konstruktorite kohta UdpEchoClient.

Waf: Sisene kausta `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build` Waf: JÀtab kausta `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build` 'build' lÔpetatud 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(): VastuvÔetud 1024 baiti aadressilt 10.1.1.1 2.00369s UdpEchoServerApplication:HandleRead(): Paketi peegeldamine 2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0) 2.00737s UdpEchoClientApplication:HandleRead(): VastuvÔetud 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Ă€ivitas echo-serveri rakenduse ĂŒhe sekundi jooksul enne simulatsiooni algust. NĂŒĂŒd nĂ€ete, et meetod StartApplication serveri jaoks kutsutakse tegelikult esimesel sekundil. Samuti vĂ”ite mĂ€rgata, et echo-client kĂ€ivitub simulatsiooni teisel sekundil, nagu me skriptis soovisime.

NĂŒĂŒd saate jĂ€lgida simulatsiooni kulgu, kutsudes ScheduleTransmit kliendis, mis kutsub ĂŒles saatma tagasiside kĂ€sitluse ehitus serveris. Pange tĂ€hele, et kahepunkti lingi kaudu paketi saatmiseks kulunud aeg on 3,69 millisekundit. NĂ€ete, et echo-server registreerib sĂ”numi, et ta vastas paketile, ja seejĂ€rel, pĂ€rast kanalit, nĂ€ete, et echo-client saab echo-paketi oma kĂ€sitluses HandleRead.

Selles simulatsioonis toimub palju, mis jÀÀb teie jaoks mĂ€rkamatuks. Kuid saate kogu protsessi vĂ€ga hĂ”lpsasti jĂ€lgida, lubades sĂŒsteemis kĂ”ik koostisosade logimise. Proovige seada muutuja NS_LOG jĂ€rgmisele vÀÀrtusele,

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

Asterisk eespool on logimisosa asendussĂŒmbol. See lĂŒlitab sisse kĂ”ik salvestused kĂ”ikides komponentides, mida kasutatakse simulatsioonis. Ma ei hakka siin vĂ€ljundi esitama (artikli kirjutamise hetkeks genereerib see 1265 rida vĂ€ljundit ĂŒhe echo-paketi jaoks), kuid saate selle teabe suunata faili ja vaadata seda oma lemmikredaktoris.

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

Ma kasutan isiklikult seda ÀÀrmiselt mahukat ajakirja versiooni, kui mul on probleem ja mul pole aimugi, kus asjad lĂ€ksid valesti. Ma suudan koodi tĂ€itmist hĂ”lpsasti jĂ€lgida, ilma et peaksin seadma siin ja seal katkestuspunktid ning esitama koodi silurisse. Ma saan lihtsalt oma lemmikredaktoris vĂ€ljundit redigeerida ja otsida seda, mida ootan, ning nĂ€ha, et juhtub midagi ootamatut. Kui mul on ĂŒldine ĂŒlevaade sellest, mis valesti lĂ€heb, lĂ€hen silurisse, et probleemi ĂŒksikasjalikult uurida. See tĂŒĂŒpi vĂ€ljund vĂ”ib olla eriti kasulik, kui teie skript teeb midagi tĂ€iesti ootamatut. Kui kasutate ainult silurit, vĂ”ite tĂ€iesti mööda lasta ootamatust pöördest. Ajakirjastamine muudab sellised pöörded mĂ€rgatavaks.

5.1.3 Logimise lisamine teie koodile

Saate lisada uusi kirjeid oma simuleerimisse, tehes log komponendi hĂŒvesid erinevatelt makroilt. Teeme seda skriptis myfirst.cc, mille meil on 'puhtas' kataloogis. KĂŒsime meeles, et oleme selles skriptis mÀÀratlenud ajakirjakomponendi:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Teate, et saate lubada selle komponendi kĂ”ikide sĂ”numite ajakirjastamise, mÀÀrates keskkonnamuutuj NS_LOG erinevatel tasemetel. JĂ€tkame ja lisame skripti mĂ”ned mĂ€rgid. Makrot, mida kasutatakse teabe taseme sĂ”numite ajakirjastamiseks — NS_LOG_INFO. Lisame sĂ”numi (otse enne, kui hakkame sĂ”lmi looma), mis ĂŒtleb teile, et skript on topoloogia loomise etapis ("Loodud topoloogia"). See tehakse jĂ€rgmises koodilĂ”igus,
Avage scratch/myfirst.cc oma lemmikredaktoris ja lisage rida,
NS_LOG_INFO ("Creating Topology");
otse enne ridasid,

NodeContainer nodes;
nodes.Create (2);

NĂŒĂŒd kompileerige skript, kasutades waf, ja puhastage keskkonnamuutuja NS_LOG, et keelata ajakirja voog, mille me varem lubasime:

$ ./waf
$ export NS_LOG=

NĂŒĂŒd, kui kĂ€itate skripti, $ ./waf --run scratch/myfirst ei nĂ€e te uut teadet, kuna seotud ajakirjakomponent (FirstScriptExample) ei olnud lubatud. Et nĂ€ha oma sĂ”numit, peate lubama ajakirjakomponendi FirstScriptExample, mis on tasemel madalam kui NS_LOG_INFO. Kui soovite lihtsalt nĂ€ha seda konkreetset ajakir Jenkinsimise taset, saate selle lubada nii,

$ export NS_LOG=FirstScriptExample=info

Kui skripti nĂŒĂŒd kĂ€ivitada, nĂ€ete uut sĂ”numit "Loome topoloogiat".

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Ôpetati edukalt (0.404s)
Loome topoloogiat
Saadetud 1024 baiti aadressile 10.1.1.2
Saadud 1024 baiti aadressilt 10.1.1.1
Saadud 1024 baiti aadressilt 10.1.1.2

5.2 KĂ€skude rida argumentide kasutamine

5.2.1 Vaikimisi atribuudi vÀÀrtuste ĂŒmbersettemine

Teine viis ns-3 skriptide kĂ€itumise muutmiseks ilma redigeerimise ja kompileerimiseta on kĂ€surea argumentide kasutamine. Pakume mehhanismi kĂ€surea argumentide analĂŒĂŒsimiseks ja lokaalsete ning globaalsete muutujate automaatseks seadmiseks, tuginedes tulemustele.

Esmalt tuleb kĂ€surea argumentide sĂŒsteemi kasutamiseks vĂ€lja kuulutada kĂ€surea analĂŒsaator. See on ĂŒsna lihtne teha (teie pĂ”hiprogrammis), nagu nĂ€ites koodis,

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

See lihtne kahe rea fragment on tegelikult iseenesest vĂ€ga kasulik. See avab ukse globaalsele ns-3 muutujale ja atribuutide sĂŒsteemile. Lisame peamise funktsiooni algusesse kaks rida koodi scratch/myfirst.cc. Liikudes edasi, kompilime skripti ja kĂ€ivitame selle, tehes kĂ€ivitamisel pĂ€ringu abi kĂŒsimiseks jĂ€rgmisega,

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

See kĂ€sk palub Waf kĂ€ivitada skripti scratch\/myfirst ja edastada sellele kĂ€surea argument --PrintHelp. Tsitaadid on vajalikud, et nĂ€idata, mille jaoks argument mĂ”eldud on. KĂ€surea analĂŒsaator tuvastab argumendi --PrintHelp ja prindib vastuse,

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Ôpetati edukalt (0.413s)
TcpL4Protocol:TcpStateMachine()
CommandLine:HandleArgument(): Töödelda arg nimega=PrintHelp vÀÀrtus=
--PrintHelp: Prindib selle abi sÔnumi.
--PrintGroups: Prindib gruppide nimekirja.
--PrintTypeIds: Prindib kÔik TypeId-d.
--PrintGroup=[gruppe]: Prindib kÔik TypeId-d gruppide kohta.
--PrintAttributes=[typeid]: Prindib kÔik attribuudid typeid kohta.
--PrintGlobals: Prindib globaalide nimekirja.

NĂŒĂŒd vaatame valikut --PrintAttributes. Oleme juba maininud ns-3 attribuutide sĂŒsteemi, kui uurisime skripti first.cc. Oleme nĂ€inud jĂ€rgmisi koodirekke,

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

ja rÀÀkisime, et DataRate on tegelikult atribuut PointToPointNetDevice. Rakendame nĂŒĂŒd kĂ€surea argumentide analĂŒsaatori atribuutide vaatamiseks. PointToPointNetDevice. Abi nimekiri ĂŒtleb, et peame esitama TypeId. See klass, millele kuuluvad huvitatud atribuudi. Meie puhul on see ns3::PointToPointNetDevice. JĂ€tkame edasi, sisestage

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

SĂŒsteem prindib vĂ€lja kĂ”ik selle tĂŒĂŒbi vĂ”rgu seadme atribuudid. Te nĂ€ete, et nende atribuutide nimekirjas on

--ns3::PointToPointNetDevice::DataRate=[32768bps]:
Kohustuslik andmeedastuskiirus punkt-punkti linkide jaoks

See on vaikevÀÀrtus, mida sĂŒsteem kasutab objekti loomisel PointToPointNetDevice. Me mÀÀratleme selle vaikevÀÀrtuse uuesti parameetriga Atribuut ja PointToPointHelper ĂŒle. Kasutame vaikimisi vÀÀrtusi punkt-punkt seadmete ja kanalite jaoks. Selleks eemaldame kutsed SetDeviceAttribute ja SetChannelAttribute API-s myfirst.cc, mis meil on puhtas kataloogis.

Teie skript peaks nĂŒĂŒd lihtsalt kuulutama PointToPointHelper ja mitte tegema mingeid seadistuste operatsioone, nagu on nĂ€idatud allolevas nĂ€ites

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

JĂ€tkake ja looge uus skript Waf (./waf) ja laske meil tagasi minna ning sisestada mĂ”ned logid UDP eho-serveri rakendusest ja sisse lĂŒlitada ajasilt.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

Kui kÀitate skripti, peate nÀgema jÀrgmist vÀljundit:

Waf: Sisenemine kataloogi `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Lahkumine kataloogi `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' lÔpetatud edukalt (0.405s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Saadetud 1024 baiti aadressile 10.1.1.2
2.25732s VastuvÔetud 1024 baiti aadressilt 10.1.1.1
2.25732s Peegeldan paketti
VastuvÔetud 1024 baiti aadressilt 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

Meenutame, et viimati, kui vaatasime simuleerimise aega, oli hetk, mil eho-server sai paketi, see oli 2,00369 sekundit.

2.00369s UdpEchoServerApplication:HandleRead(): VastuvÔetud 1024 baiti aadressilt 10.1.1.1

NĂŒĂŒd saab ta paketi 2.25732 sekundil. See on sellepĂ€rast, et me lihtsalt vĂ€hendasime PointToPointNetDevice edastuskiirus viis megabitti sekundis vaikevÀÀrtuseni, mis on 32768 bitti sekundis. Kui me oleksime uue DataRate seadnud kĂ€surealt, vĂ”iksime oma simulatsiooni taas kiirendada. Teeme seda jĂ€rgmiselt, vastavalt abielementide vihjele:

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

SeetĂ”ttu naaseb DataRate atribuudi vÀÀrtus vaikimisi viie megabiti sekundis. Kas tulemus ĂŒllatab teid? Selgub, et et tagastada skripti algne kĂ€itumine, peame ka kanali viivituse seadma vastavaks valguse kiirusel. Saame paluda kĂ€sureal vĂ€lja printida kanalite atribuute, nagu me tegime vĂ”rgu seadmega:

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

Avastame, et kanali viivituse atribuut on seadistatud jÀrgmiselt:

--ns3::PointToPointChannel::Delay=[0ns]:
Viivituse edastamine kanali kaudu

SeejÀrel saame kÀsurea kaudu need kaks vaikeseadet mÀÀrata,

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

sellisel juhul taastame aja, mis meil oli, kui mÀÀrasime DataRate ja Delay skriptis selgelt:

Waf: Siseneb katalooge `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
Waf: VĂ€ljub kataloogist `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
'build' lÔppes eduka lÔpetamisega (0.417s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Saadetud 1024 baiti aadressile 10.1.1.2
2.00369s Saadud 1024 baiti aadressilt 10.1.1.1
2.00369s Toimub paketi peegeldamine
Saadud 1024 baiti aadressilt 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

Pange tĂ€hele, et pakett saadetakse serverile tagasi 2,00369 sekundi pĂ€rast. Saaksime tegelikult mÀÀrata mistahes skriptis kasutatavat atribuutide vÀÀrtust. Eriti vĂ”iksime seada MaxPackets atribuudi vÀÀrtused erinevaks kui ĂŒks. UdpEchoClient.

Kuidas te seda kasutaksite? Proovige. Pidage meeles, et peate kommenteerima koha, kus me ĂŒletame vaikimisi atribuudi vÀÀrtuse ja mÀÀrame selle selgelt. MaxPackets skriptis. SeejĂ€rel peate skripti uuesti kompileerima. Samuti saate kĂ€surea kaudu abi uue vaikimisi atribuudi vÀÀrtuse seadmiseks. Olles sellega tuttav, suudate hallata kĂ€sureal kuvatavate pakettide arvu. Kuna oleme korralikud inimesed, peaks meie kĂ€surea kĂ€esolev vĂ€lja nĂ€gema umbes selline:

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

Loomulik kĂŒsimus, mis sel hetkel tĂ”useb, on, kuidas teada saada kĂ”igi nende atribuudi olemasolust. JĂ€llegi, kĂ€sureal on selle probleemiga seotud abifunktsioon. Kui me kĂŒsime kĂ€surealt abi, peaksime nĂ€gema:

$ .\/waf --run "scratch\/myfirst --PrintHelp"
myfirst [Program Arguments] [General Arguments]
General Arguments:
--PrintGlobals: TrĂŒki globaalsete loend.
--PrintGroups: TrĂŒki grupi loend.
--PrintGroup=[group]: TrĂŒki grupi kĂ”ik TypeId-d.
--PrintTypeIds: TrĂŒki kĂ”ik TypeId-d.
--PrintAttributes=[typeid]: TrĂŒki kĂ”ik typeid atribuudid.
--PrintHelp: Prindi see abitekst.

Kui valite argumendi „PrintGroups“, peaksite nĂ€gema kĂ”igi registreeritud rĂŒhmade nimekirja. TypeId. RĂŒhmade nimed vastavad moodulite nimedele lĂ€htekaustas (kuigi suurtĂ€hega). KĂ”ikide andmete kohe vĂ€ljastamine oleks liiga mahukas, seetĂ”ttu on saadaval lisafiltrite sĂŒsteem grupi andmete vĂ€ljatrĂŒkkimiseks. NĂ€iteks keskendudes taas „punkt-punkt“ moodulile:

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

Siit leiate saadaval olevad TypeId nimed atribuutide leidmiseks, nÀiteks:
--PrintAttributes = ns3 :: PointToPointChannel, nagu eespool nÀidatud.

Teine viis atribuutide tundmaÔppimiseks on Doxygen ns-3 kaudu. Seal on leht, mis loetleb kÔik simulaatoris registreeritud atribuudid.

5.2.2 Oma kĂ€skude pĂŒĂŒdmine

Samuti saate oma konksud kĂ€surea sĂŒsteemi kaudu lisada. Seda on ĂŒsna lihtne teha kĂ€sureaparseri meetodi abil. AddValue.
Kasutame seda vĂ”imalust, et mÀÀrata nĂ€idatud pakettide arv tĂ€iesti teistsugusel viisil. Lisa kohaliku muutuja nimega nPackets funktsiooni main. MÀÀrame selle vÀÀrtuseks ĂŒksteist, et see vastaks meie eelmisele vaikimisi kĂ€itumisele. Et vĂ”imaldada kĂ€sureaparseril seda vÀÀrtust muuta, peame selle muutujaga parserisse hĂ”ivama. Teeme seda, lisades kutse AddValue. Mine ja muuda skripti scratch/myfirst.cc nii, et see algab jĂ€rgnevast koodist,

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

Kerige alla punktini skriptis, kus mÀÀrame atribuudiks MaxPackets, ja muuda see nii, et see lÀhtuks muutujast nPackets, mitte konstantist 1, nagu allpool nÀidatud.

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

NĂŒĂŒd, kui kĂ€itate skripti ja lisate argumendi —PrintHelp, peaksite nĂ€gema uut kasutajaargumenti, mis on kuvatud abinĂ€idikute loendis. Sisestage,

$ .\/waf --run "scratch\/myfirst --PrintHelp"
Waf: Sisen kaust `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
Waf: Lahkub kaust `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
'build' Ônnestus edukalt (0.403s)
--PrintHelp: Prindi see abiteade.
--PrintGroups: Prindi rĂŒhmade loend.
--PrintTypeIds: Prindi kÔik TypeId'd.
--PrintGroup=[group]: Prindi kÔik TypeId'd grupist.
--PrintAttributes=[typeid]: Prindi kÔik atribuudid typeid'le.
--PrintGlobals: Prindi globaalsete objektide loend.
Kasutaja argumendid:
--nPackets: Pakettide arv, mis tuleb kopeerida

Kui soovite muuta edastatavate paketide arvu, saate seda teha, seadistades kÀsurealt argumendi -nPackets.

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

NĂŒĂŒd peate nĂ€gema

Waf: Siseneb kausta `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
Waf: Lahkub kaust `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
'build' Ônnestus edukalt (0.404s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Saadetud 1024 baiti aadressile 10.1.1.2
2.25732s Saadud 1024 baiti aadressilt 10.1.1.1
2.25732s Kaja pakett
Saadud 1024 baiti aadressilt 10.1.1.2
Saadetud 1024 baiti aadressile 10.1.1.2
3.25732s Saadud 1024 baiti aadressilt 10.1.1.1
3.25732s Kaja pakett
Saadud 1024 baiti aadressilt 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

Olete nĂŒĂŒd saatnud kaks paketti. HĂ€sti lihtne, eks?
VĂ”ite nĂ€ha, et ns-3 kasutajana saate kasutada kĂ€surea argumentide sĂŒsteemi globaalsete vÀÀrtuste ja atribuutide haldamiseks. Kui olete mudeli autor, saate lisada uusi atribuutide oma objektidele ning need saavad automaatselt olema konfigureeritavad teie kasutajate poolt kĂ€sureas. Kui olete skripti autor, saate oma skriptidesse lisada uusi muutujaid ning neid valutult oma kĂ€surea sĂŒsteemiga ĂŒhendada.

5.3 JĂ€lgimissĂŒsteemi kasutamine

Modelleerimise peamine eesmĂ€rk on genereerida vĂ€ljundandmed edasisteks uurimisteks ning ns-3 jĂ€lgimissĂŒsteem on selle peamine mehhanism. Kuna ns-3 on C++ programmeerimiskeeles, vĂ”ib kasutada standardseid vĂ€ljundandmete genereerimise vahendeid C++ programmis:

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

Te vĂ”ite isegi kasutada logimismoduuli, et lisada oma lahendusele veidi struktuuri. Sellest lĂ€henemisest tulenevaid probleeme on palju ning nende lahendamiseks oleme pakkunud ĂŒldist sĂŒndmuste jĂ€lgimise alam-sĂŒsteemi.

Ns-3 jĂ€lgimissĂŒsteemi pĂ”hieesmĂ€rgid:

  • PĂ”hitegevuse jaoks peab jĂ€lgimissĂŒsteem vĂ”imaldama kasutajal genereerida standardset jĂ€lgimist populaarsetelt allikatelt ning valima, millised objektid genereerivad jĂ€lgimist;

  • Vahe kasutajad peavad saama jĂ€lgimisse sĂŒsteemi laiendada, et muuta genereeritud vĂ€ljundi formaati vĂ”i lisada uusi jĂ€lgimise allikaid ilma simulatori tuuma modifitseerimiseta;

  • Kogenud kasutajad saavad simulatori tuuma modifitseerida, et lisada uusi jĂ€lgimise allikaid ja vastuvĂ”tjaid. Ns-3 jĂ€lgimisse sĂŒsteem pĂ”hineb sĂ”ltumatute jĂ€lgimise allikate ja vastuvĂ”tjate pĂ”himĂ”tetel ning ĂŒhtsel mehhanismil allikate ĂŒhendamiseks tarbijatega.

Ns-3 jĂ€lgimisse sĂŒsteem on rajatud sĂ”ltumatute jĂ€lgimise allikate ja vastuvĂ”tjate pĂ”himĂ”tetele ning ĂŒhtsele mehhanismile allikate ĂŒhendamiseks vastuvĂ”tjatega. JĂ€lgimise allikad on objektid, mis suudavad signaalida sĂŒndmusi, mis toimuvad simulatsioonis, ja tagada ligipÀÀsu huvitavatele pĂ”hikohtadele. NĂ€iteks vĂ”ib jĂ€lgimise allikas nĂ€idata, millal vĂ”rguseade sai paketi ja pakkuda ligipÀÀsu paketi sisule huvipakkuvatele jĂ€lgimise vastuvĂ”tjatele.

JĂ€lgimise allikad on enda iseenesest kasutud, kui nad pole 'ĂŒhendatud' koodi teiste osadega, mis tegelikult töötlevad informatsiooni, mille vastuvĂ”tja pakub, mingi kasuliku tegevuse jaoks. JĂ€lgijad on sĂŒndmuste ja andmete tarbijad, mida jĂ€lgimise allikad pakuvad. NĂ€iteks vĂ”ib luua jĂ€lgimise vastuvĂ”tja, mis (kui see on ĂŒhendatud eelnevas nĂ€ites oleva jĂ€lgimise allikaga) printib huvitavaid osi saadud paketist.

TĂ”sine pĂ”hjus sellise selge eristamise osas on vĂ”imaldada kasutajatel liita uusi vastuvĂ”tjaid olemasolevatele jĂ€lgimise allikatele, ilma simulatori tuuma redigeerimise ja uuesti kompileerimise vajaduseta. Seega vĂ”ib eeltoodud nĂ€ites kasutaja defineerida uue jĂ€lgija oma skriptis ja ĂŒhendada selle olemasoleva jĂ€lgimise allikaga, mis on mÀÀratletud simulatsiooni tuumas, lihtsalt muutes kasutaja skripti.

Selles juhendis tutvustame mĂ”ningaid mÀÀratletud allikaid ja vastuvĂ”tjaid ning nĂ€itame, kuidas neid seadistada, kasutades vĂ”imalikult vĂ€he kasutaja pingutusi. Vaadake juhendit ns‑3 vĂ”i juhised tĂ€iendava jĂ€lgimise seadistamise kohta, sealhulgas jĂ€lgimisruumi laiendamine ja uute jĂ€lgimisallikate loomine.

5.3.1 ASCII jÀlgimine

ns‑3 pakub abifunktsioone, mis pakuvad madala taseme jĂ€lgimissĂŒsteemi, et aidata teil pakettide jĂ€lgimise lihtsate seadistuste detailidega. Kui aktiveerite selle funktsiooni, nĂ€ete vĂ€ljundit ASCII-failides. Neile, kes tunnevad ns-2 vĂ€ljundit, on see jĂ€lgimistĂŒĂŒp sarnane out.tr, mis on genereeritud mitme skripti poolt.

Liigume edasi ja lisame mÔned ASCII jÀlgimistulemused meie skripti scratch/myfirst.cc. Just enne meetodi kutsumist Simulator::Run(), lisage jÀrgmised koodiread:
AsciiTraceHelper ascii;

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

Nagu paljudes teistes ns‑3 idiomides, kasutab see kood abistavat objekti ASCII jĂ€lgimiste loomisel. Teises reas on kaks sisemist meetodi kutsumist. Meetod "sisemine" CreateFileStream() kasutab anonĂŒĂŒmse objekti idiomat, et luua stekki faili voog objekti (ilma objekti nime) ja edastada selle kutsutavale meetodile. Tulevikus sĂŒveneme sellesse, kuid kĂ”ik, mida peate selle etapi jaoks teadma, on see, et loote objekti, mis esindab faili nimega myfirst.tr ja edastate selle ns‑3-le. Usaldame ns‑3-le loodud objekti hooldamise kogu selle eluaja, mille jooksul lahendatakse probleemid, mis on tingitud vĂ€he tuntud (teadlikust) piirangust, mis on seotud C++ voogude objektide koopiate konstruktoritega.

VĂ€line kutse EnableAsciiAll() annab abistajale teada, et soovite oma simulatsioonis aktiveerida ASCII jĂ€lgimise kĂ”ikidele punkt-punkt seadme ĂŒhendustele ning et soovite, et (mÀÀratud) jĂ€lgijad salvestaksid pakettide liikumise teavet ASCII formaadis.

Neile, kes tunnevad ns-2, 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 seda kĂ€surealt:

$ ./waf --run scratch/myfirst

Kui palju kordi olete varem nĂ€inud mitmeid sĂ”numeid Waf-i poolt ja seejĂ€rel "‘build’ finished successfully" (ehitamine Ă”nnestus) koos selle töötava programmi sĂ”numitega.

Töötamise kĂ€igus loob programm faili nimega myfirst.tr. Töö olemuse tĂ”ttu Waf, luuakse vaikimisi fail mitte kohalikus kataloogis, vaid reposi ĂŒlemises kataloogis. Kui soovite muuta teed, kuhu jĂ€ljed salvestatakse, saate Waf-i jaoks mÀÀrata tee paranmeetriga --cwd. Me ei teinud seda, seega, et vaadata ASCII jĂ€lgimisfaili myfirst.tr oma lemmiktoimetajas, peame minema meie reposi ĂŒlemisse kataloogi.

ASCII jĂ€lgimise analĂŒĂŒs

Seal on palju teavet ĂŒsna tihedas vormis, kuid esimene asi, millele tĂ€helepanu pöörata, on see, et fail koosneb eraldi ridadest. See saab selgelt nĂ€htavaks, kui laiendate vaateaken laiemaks.

Iga rida failis vastab jĂ€lgimise sĂŒndmusele. Antud juhul jĂ€lgime edastamise jĂ€rjekorra sĂŒndmusi, mis esinevad igas vĂ”rgu punkti-punkt seadmes simuleerimise ajal. EdastamisjĂ€rjekord on jĂ€rjekord, mille kaudu peab igasugune pakett punkti-punkt kanali jaoks lĂ€bima. Pange tĂ€hele, et iga rida jĂ€lgimisfailis algab ĂŒhekordse sĂŒmboliga (ja selle jĂ€rel on tĂŒhi koht). See sĂŒmbol omab jĂ€rgmisi vÀÀrtusi:

+: seadme jÀrjekorras toimus jÀrjekorda panemise operatsioon;
-: seadme jÀrjekorras toimus elemendi tÔstmise operatsioon;
d: pakk jĂ€i hĂŒlgatud, peamiselt seetĂ”ttu, et jĂ€rjekord oli tĂ€is;
r: pakk anti vÔrgu seadmele vastuvÔetuks.

Vaatame jÀlgimisfaili esimest rida detailsemalt. Jagame selle osadeks (vaate mugavuse tagamiseks sisse tÔstetud) ja number vasakul:

0 +
1 2
2 /NodeList/0/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Enqueue
3 ns3::PppHeader (
4   Punkt-to-punktprotokoll: IP (0x0021))
6   ns3::Ipv4Header (
7     tos 0x0 ttl 64 id 0 protokoll 17 offset 0 lipud [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 laiendatud jĂ€lgimise sĂŒndmuse esimene osa (rida 0) on operatsioon. Meil on siin sĂŒmbol +, mis vastab edastamisse jĂ€rjekorda panemise operatsioonile. Teine osa (rida 1) on simuleerimise aeg, vĂ€ljendatuna sekundites. Sa vĂ”id mĂ€letada, et palusime UdpEchoClientApplication pakettide saatmine algab kahe sekundi pĂ€rast. Siin nĂ€eme kinnitust, et see tĂ”epoolest toimub.

JĂ€rgmisel jĂ€lgimise nĂ€ite jaotises (read 2) nĂ€idatakse, millisest jĂ€lgimise allikast see sĂŒndmus tekkis (jĂ€lgimisruum on mĂ€rgitud). Sa saad esitada jĂ€lgimisruumi veidi nagu failisĂŒsteemi ruumi. JĂ€lgimisruumi juur on NodeList. See vastab konteinerile, mida kontrollib peamine ns-3 kood. Selles sisaldub kĂ”ik sĂ”lmed, mis skriptis loodud on. Nii nagu failisĂŒsteemil vĂ”ib juure all olla kausta, vĂ”ib NodeList meil olla palju sĂ”lmi. Seega viitab rida /NodeList/0 nullsĂ”lmele NodeListis, mida me tavaliselt mĂ”istame kui "sĂ”lm 0". Igas sĂ”lmes on seadmete loetelu, mis on paigaldatud. See loetelu asub jĂ€rgmises ruumis. Sa vĂ”id nĂ€ha, et see jĂ€lgimisĂŒritus pĂ€rineb DeviceList/0, mis on seadme null, mis on paigaldatud sĂ”lmes.

JÀrgmine alarida, $ ns3::PointToPointNetDevice, nÀitab, milline seade asub nullasendis: nullsÔlme seadmete loendis. Tuletame meelde, et rida +, mis oli reas 0, tÀhendas, et seadme edastamisjÀrjekorras toimus elemendi lisamine. See kajastub viimastes aadressi jÀlgimise segmentides: TxQueue/Enqueue.

ÜlejÀÀnud osad jĂ€lgimises peaksid olema piisavalt intuitiivsed. Ridu 3-4 nĂ€itavad, et pakk on kapseldatud punkti-punkti protokollis. Rida 5-7 nĂ€itavad, et pakk sisaldab IP4 versioonipealkirja ja pĂ€rineb IP-aadressilt 10.1.1.1 ja on mĂ”eldud 10.1.1.2. Ridu 8-9 nĂ€itavad, et see pakk sisaldab UDP pealkirja ja lĂ”puks nĂ€itab rida 10, et koormus on oodatud 1024 baiti.

JÀrgmine rida jÀlgimisfailis nÀitab, et sama pakk vÔeti edastusjÀrjekorrast sama sÔlme juures.

Kolmas rida jĂ€lgimisfailis nĂ€itab, et pakk aktsepteeriti vĂ”rgu seadme poolt sĂ”lmes, kus on kaja server. Reprodutseerin selle sĂŒndmuse allpool.

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 lipud [none]
5     pikkus: 1052 10.1.1.1 > 10.1.1.2)
6     ns3::UdpHeader (
7       pikkus: 1032 49153 > 9)
8       Koormus (suurus=1024)

Pöörake tĂ€helepanu, et jĂ€lgimisoperatsioon on nĂŒĂŒd r ja simuleerimise aeg on pikenenud 2,25732 sekundini. Kui olete Ă”petuse juhistele tĂ€helepanelikult jĂ€rgnenud, tĂ€hendab see, et olete jĂ€tnud vĂ”rgu seadmete DataRate ja kanalide hilinemise vaikesĂ€tted. See aeg peaks olema tuttav, nagu olete juba eelnevas osas nĂ€inud.

JĂ€lgimispinna nimirida (rida 2) on muudetud, et peegeldada, et see sĂŒndmus pĂ€rineb sĂ”lmost 1 (/NodeList/1) Đž паĐșДт ĐżŃ€ĐžĐœŃŃ‚ ĐžŃŃ‚ĐŸŃ‡ĐœĐžĐșĐŸĐŒ Ń‚Ń€Đ°ŃŃĐžŃ€ĐŸĐČĐșĐž (/MacRx). Te peaksite olema ĂŒsna kerge jĂ€lgida paketi liikumist topoloogias, vaadates failis jÀÀvaid jĂ€lgi.

5.3.2 PCAP jÀlgimine

Seadmete ns-3 abil saab samuti luua jĂ€lgimisfaile .pcap formaadis. AkroĂŒm pcap (tavaliselt kirjutatakse vĂ€ikeste tĂ€htedega) tĂ€histab pakettide pĂŒĂŒdmiseks ja on tegelikult API, mis sisaldab failiformaadi .pcap mÀÀratlemist. KĂ”ige populaarsem programm, mis suudab seda vormingut lugeda ja kuvada, on Wireshark (varem tuntud kui Ethereal). Siiski on palju liikluse jĂ€lgimise analĂŒsaatoreid, mis kasutavad seda paketti vormingut. Soovitame kasutajatel kasutada mitmeid tööriistu, mis on saadaval pcap jĂ€lgimise analĂŒĂŒsimiseks. Selles juhendis keskendume pcap jĂ€lgimise vaatamisele kasutades tcpdump.

Pcap jĂ€lgimise lubamine toimub ĂŒhe koodireaga.

pointToPoint.EnablePcapAll("myfirst");

Lisage see koodirida pĂ€rast ASCII jĂ€lgimise koodi, mille me just eri scratch/myfirst.cc. Pange tĂ€hele, et oleme edastanud ainult stringi «myfirst», mitte «myfirst.pcap» vĂ”i midagi sarnast. See on seetĂ”ttu, et parameeter on eellause, mitte failinimi. Simuleerimise ajal loob assistent tegelikult jĂ€lgimisfaili iga punkti vahelise seadme jaoks. Failide nimed koostatakse eellause, sĂ”lme numbri, seadme numbri ja sufiksi „pcap».

Meie stsenaariumi nĂ€ite puhul nĂ€eme lĂ”puks faile nimedega „myfirst-0-0.pcap" ja "myfirst-1-0.pcap”, mis on pcap jĂ€lgimised sĂ”lme 0-seade 0 ja sĂ”lme 1-seade 0 suhtes vastavalt. PĂ€rast selle koodirea lisamist pcap jĂ€lgimise lubamiseks saate skripti tavalise viisi kohaselt kĂ€ivitada:

$ ./waf --run scratch/myfirst

Kui vaatate oma jaotuse ĂŒlemise taseme katalooge, peaksite nĂ€gema kolme faili: ASCII jĂ€lgimisfaili myfirst.tr, mille me varem uurisime, failid myfirst-0-0.pcap ja myfirst-1-0.pcap — uued pcap-failid, mille me just genereerisime.

VĂ€ljastuse lugemine tcpdumpiga

Hetkel on pcap-failide vaatamine kÔige lihtsam tcpdumpiga.

$ tcpdump -nn -tt -r myfirst-0-0.pcap
reading from file myfirst-0-0.pcap, link-type PPP (PPP)
2.000000 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, length 1024
2.514648 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, length 1024
tcpdump -nn -tt -r myfirst-1-0.pcap
reading from file myfirst-1-0.pcap, link-type PPP (PPP)
2.257324 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, length 1024
2.257324 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, length 1024

Dumphis myfirst-0-0.pcap (klientseade) nÀete, et echo-pakett saadetakse 2 sekundi simuleerimise jooksul. Kui vaatate teist dumphi (myfirst-1-0.pcap), nÀete, et pakett vÔetakse vastu hetkel 2,257324 sekundit. Teises dumphis nÀete, et pakett tagastatakse hetkel 2,257324 sekundit ja lÔpuks, et pakett sai kliendilt tagasi esimese dumphi hetkel 2,514648 sekundit.

VĂ€ljastuse lugemine Wiresharkiga

Kui te ei tunne 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 pakette kinni pĂŒĂŒdnud, kasutades paketianalĂŒsaatorit.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster