5 Iestatījumi
5.1 MežizstrÄdes moduļa izmantoÅ”ana
5.1.1 MežizstrÄdes pÄrskats
5.1.2. IespÄjot reÄ£istrÄÅ”anu
5.1.3. ReÄ£istrÄcijas pievienoÅ”ana kodam
5.2 Komandrindas argumentu izmantoŔana
5.2.1. NoklusÄjuma atribÅ«tu vÄrtÄ«bu ignorÄÅ”ana
5.2.2. Savu komandu tverŔana
5.3. IzsekoÅ”anas sistÄmas izmantoÅ”ana
5.3.1. ASCII izsekoŔana
ParsÄ ASCII pÄdas
5.3.2. PCAP izsekoŔana
5 nodaļa
koriÄ£ÄÅ”ana
5.1 MežizstrÄdes moduļa izmantoÅ”ana
MÄs jau Ä«si apskatÄ«jÄm ns-3 reÄ£istrÄÅ”anas moduli, apskatot skriptu pirmais.cc. Å ajÄ nodaÄ¼Ä mÄs sÄ«kÄk aplÅ«kosim reÄ£istrÄÅ”anas apakÅ”sistÄmas iespÄjamos lietojumus.
5.1.1 MežizstrÄdes pÄrskats
Daudzas lielas sistÄmas atbalsta kÄdu ziÅojumu reÄ£istrÄÅ”anas iespÄju, un ns-3 nav izÅÄmums. Dažos gadÄ«jumos "operatora konsolÄ" (kas parasti ir stderr sistÄmÄs, kuru pamatÄ ir Unix) tiek rakstÄ«ti tikai kļūdu ziÅojumi. CitÄs sistÄmÄs var tikt parÄdÄ«ti brÄ«dinÄjuma ziÅojumi, kÄ arÄ« detalizÄtÄka informÄcija. Dažos gadÄ«jumos tiek izmantoti reÄ£istrÄÅ”anas rÄ«ki, lai izvadÄ«tu atkļūdoÅ”anas ziÅojumus, kas var Ätri aizmiglot izvadi.
ApakÅ”HRD, ko izmanto ns-3, pieÅem, ka visi Å”ie informÄcijas satura lÄ«meÅi ir noderÄ«gi, un mÄs piedÄvÄjam selektÄ«vu, daudzslÄÅu pieeju ziÅojumu reÄ£istrÄÅ”anai. ReÄ£istrÄÅ”anu var pilnÄ«bÄ atspÄjot, iespÄjot katram komponentam vai globÄli. Å im nolÅ«kam tiek izmantoti regulÄjami informÄcijas satura lÄ«meÅi. ns-3 reÄ£istrÄÅ”anas modulis nodroÅ”ina salÄ«dzinoÅ”i vienkÄrÅ”u veidu, kÄ iegÅ«t noderÄ«gu informÄciju no simulÄcijas.
Jums vajadzÄtu saprast, ka mÄs nodroÅ”inÄm vispÄrÄjas nozÄ«mes mehÄnismu ā izsekoÅ”anu ā datu iegÅ«Å”anai no jÅ«su modeļiem, kam vajadzÄtu bÅ«t vÄlamajai simulÄciju izvadei (plaÅ”Äku informÄciju par mÅ«su izsekoÅ”anas sistÄmu skatiet apmÄcÄ«bu sadaÄ¼Ä 5.3.). ReÄ£istrÄcijai ir jÄbÅ«t ieteicamai metodei, lai jebkurÄ laikÄ iegÅ«tu atkļūdoÅ”anas informÄciju, brÄ«dinÄjumus, kļūdu ziÅojumus vai Ätri izvadÄ«tu ziÅojumus no skriptiem vai modeļiem.
Å obrÄ«d sistÄma definÄ septiÅus žurnÄla ziÅojumu lÄ«meÅus (veidus) informÄcijas satura pieaugoÅ”Ä secÄ«bÄ.
- LOG_ERROR ā reÄ£istrÄÅ”anas kļūdu ziÅojumi (saistÄ«tais makro: NS_LOG_ERROR);
- LOG_WARN ā žurnÄla brÄ«dinÄjuma ziÅojumi (saistÄ«tais makro: NS_LOG_WARN);
- LOG_DEBUG ā reÄ£istrÄjiet salÄ«dzinoÅ”i retos Ä«paÅ”os atkļūdoÅ”anas ziÅojumus (saistÄ«tais makro: NS_LOG_DEBUG);
- LOG_INFO - informatÄ«vo ziÅojumu reÄ£istrÄcija par programmas gaitu (saistÄ«tais makro: NS_LOG_INFO);
- LOG_FUNCTION ā reÄ£istrÄ ziÅojumus, kas apraksta katru izsaukto funkciju (divi saistÄ«ti makro: NS_LOG_FUNCTION, ko izmanto dalÄ«bnieku funkcijÄm, un NS_LOG_FUNCTION_NOARGS, ko izmanto statiskÄm funkcijÄm);
- LOG_LOGIC ā reÄ£istrÄÅ”anas ziÅojumi, kas apraksta loÄ£isko plÅ«smu funkcijÄ (saistÄ«tais makro: NS_LOG_LOGIC);
- LOG_ALL ā reÄ£istrÄ visu iepriekÅ” minÄto (nav saistÄ«tÄ makro).
Katram tipam (LOG_TYPE) ir arÄ« LOG_LEVEL_TYPE, kas, ja tiek izmantots, ļauj reÄ£istrÄt visus virs tÄ esoÅ”os lÄ«meÅus papildus savam lÄ«menim. (RezultÄtÄ log_error un log_level_error, kÄ arÄ« log_all un log_level_all ir funkcionÄli ekvivalenti.) PiemÄram, iespÄjot log_info ļaus tikai ns_log_info makro, vienlaikus iespÄjot log_level_info, iekļaus arÄ« ziÅojumus, ko nodroÅ”ina makros ns_log_deBg, ns_log_warn.
MÄs piedÄvÄjam arÄ« beznosacÄ«jumu reÄ£istrÄÅ”anas makro, kas vienmÄr tiek rÄdÄ«ts neatkarÄ«gi no reÄ£istrÄÅ”anas lÄ«meÅa vai atlases komponenta.
- NS_LOG_UNCOND ā saistÄ«tÄ ziÅojuma beznosacÄ«jumu reÄ£istrÄÅ”ana (nav saistÄ«ta reÄ£istrÄÅ”anas lÄ«meÅa).
Katru lÄ«meni var jautÄt atseviŔķi vai kumulatÄ«vi. ReÄ£istrÄÅ”anu var konfigurÄt, izmantojot sh vides mainÄ«go NS_LOG vai reÄ£istrÄjot sistÄmas funkcijas izsaukumu. KÄ parÄdÄ«ts iepriekÅ”, reÄ£istrÄÅ”anas sistÄmai ir Doxygen dokumentÄcija, un tagad ir Ä«stais laiks to pÄrskatÄ«t, ja vÄl neesat to izdarÄ«jis.
Tagad, kad esat ļoti detalizÄti izlasÄ«jis dokumentÄciju, izmantosim Ŕīs zinÄÅ”anas, lai iegÅ«tu interesantu informÄciju no piemÄra skripta scratch/myfirst.cckuru jau esat apkopojis.
5.1.2. IespÄjot reÄ£istrÄÅ”anu
Izmantosim vides mainÄ«go NS_LOG, lai palaistu vÄl dažus žurnÄlus, bet vispirms, lai saprastu, palaidiet pÄdÄjo skriptu, kÄ to darÄ«jÄt iepriekÅ”,
$ ./waf --run scratch/myfirst
Jums vajadzÄtu redzÄt pazÄ«stamo izvadi no pirmÄs ns-3 piemÄra programmas
$ 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)
Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
Received 1024 bytes from 10.1.1.2
IzrÄdÄs, ka iepriekÅ” redzamie "nosÅ«tÄ«tie" un "saÅemtie" ziÅojumi patiesÄ«bÄ ir reÄ£istrÄti ziÅojumi no UdpEchoClientApplication Šø UdpEchoServerApplication. PiemÄram, mÄs varam lÅ«gt klienta lietojumprogrammai izdrukÄt papildu informÄciju, iestatot tÄs reÄ£istrÄÅ”anas lÄ«meni, izmantojot vides mainÄ«go NS_LOG.
No Ŕī brīža es pieÅemÅ”u, ka jÅ«s izmantojat sh-veida apvalku, kas izmanto sintaksi "VARIABLE=value". Ja izmantojat csh lÄ«dzÄ«gu Äaulu, tad jums bÅ«s jÄpÄrvÄrÅ” mani piemÄri uz "setenv mainÄ«gÄs vÄrtÄ«bas" sintaksi, kas nepiecieÅ”ama Ŕīm ÄaulÄm.
PaÅ”laik UDP atbalss klienta lietojumprogramma reaÄ£Ä uz Å”Ädu koda rindiÅu scratch/myfirst.cc,
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
Tas iespÄjo reÄ£istrÄÅ”anas lÄ«meni LOG_LEVEL_INFO. Kad mÄs nododam reÄ£istrÄÅ”anas lÄ«meÅa karogu, mÄs faktiski iespÄjojam Å”o lÄ«meni un visus zemÄkos lÄ«meÅus. Å ajÄ gadÄ«jumÄ esam iespÄjojuÅ”i NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN un NS_LOG_ERROR. MÄs varam palielinÄt reÄ£istrÄÅ”anas lÄ«meni un iegÅ«t vairÄk informÄcijas bez skripta izmaiÅÄm un atkÄrtotas kompilÄcijas, iestatot NS_LOG vides mainÄ«go Å”Ädi:
$ export NS_LOG=UdpEchoClientApplication=level_all
TÄtad mÄs iestatÄ«jÄm sh Äaulas mainÄ«go NS_LOG uz Å”Ädu vÄrtÄ«bu,
UdpEchoClientApplication=level_all
Uzdevuma kreisajÄ pusÄ ir reÄ£istrÄtÄ komponenta nosaukums, kuru vÄlamies konfigurÄt, un labajÄ pusÄ ir karodziÅÅ”, kuru mÄs vÄlamies tam piemÄrot. Å ajÄ gadÄ«jumÄ mÄs lietojumprogrammÄ iespÄjosim visus atkļūdoÅ”anas lÄ«meÅus. Ja palaižat skriptu ar Å”ÄdÄ veidÄ iestatÄ«tu NS_LOG, ns-3 reÄ£istrÄÅ”anas sistÄma pieÅems izmaiÅas, un jums vajadzÄtu redzÄt Å”Ädu izvadi:
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.404s)
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
Received 1024 bytes from 10.1.1.2
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
Papildu atkļūdoÅ”anas informÄcija, ko nodroÅ”ina lietojumprogramma, tagad ir NS_LOG_FUNCTION lÄ«menÄ«. Tas parÄda katru funkcijas izsaukuma gadÄ«jumu skripta izpildes laikÄ. Parasti metodes funkcijÄs ir vÄlams izmantot (vismaz)NS_LOG_FUNCTION (this)
... Izmantot NS_LOG_FUNCTION_NOARGS ()
tikai statiskÄs funkcijÄs. TomÄr Åemiet vÄrÄ, ka ns-3 sistÄmai nav jÄatbalsta reÄ£istrÄÅ”anas funkcionalitÄte. LÄmums par to, cik daudz informÄcijas tiek ierakstÄ«ts, ir katra modeļa izstrÄdÄtÄja ziÅÄ. Echo lietojumprogrammu gadÄ«jumÄ ir pieejams liels reÄ£istrÄÅ”anas izvades apjoms.
Tagad varat skatÄ«t lietojumprogrammas veikto funkciju izsaukumu žurnÄlu. Ja paskatÄs uzmanÄ«gi, starp rindiÅÄm pamanÄ«sit kolu UdpEchoClientApplication un metodes nosaukums, kur jÅ«s varÄtu sagaidÄ«t C++ tvÄruma operatoru (: :). Tas ir apzinÄti.
Tas faktiski nav klases nosaukums, bet gan reÄ£istrÄÅ”anas komponenta nosaukums. Ja ir sakritÄ«ba starp avota failu un klasi, tas parasti ir klases nosaukums, taÄu jums vajadzÄtu saprast, ka tas patiesÄ«bÄ nav klases nosaukums un dubultÄ kola vietÄ ir viens kols. Tas ir veids, kÄ salÄ«dzinoÅ”i smalkÄ veidÄ konceptuÄli atdalÄ«t reÄ£istrÄÅ”anas programmas nosaukumu no klases nosaukuma.
TomÄr dažos gadÄ«jumos var bÅ«t grÅ«ti noteikt, kura metode faktiski Ä£enerÄ Å¾urnÄla ziÅojumu. Ja skatÄties uz tekstu iepriekÅ”, iespÄjams, rodas jautÄjums, kur atrodas lÄ«nija "Received 1024 bytes from 10.1.1.2
" Å o problÄmu var atrisinÄt, iestatot lÄ«meni prefix_func uz vides mainÄ«go NS_LOG. IzmÄÄ£iniet tÄlÄk norÄdÄ«tÄs darbÄ«bas.
$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'
Å emiet vÄrÄ, ka pÄdiÅas ir nepiecieÅ”amas, jo vertikÄlÄ josla, ko izmantojam, lai attÄlotu operÄciju VAI, ir arÄ« Unix cauruļu savienotÄjs. Tagad, palaižot skriptu, redzÄsit, ka reÄ£istrÄÅ”anas sistÄma nodroÅ”ina, ka katram ziÅojumam konkrÄtajÄ Å¾urnÄlÄ ir pievienots komponenta nosaukums.
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.417s)
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
Tagad jÅ«s varat redzÄt, ka visi ziÅojumi, kas nÄk no UDP echo klienta lietojumprogrammas, ir identificÄti kÄ tÄdi. ZiÅojums "Received 1024 bytes from 10.1.1.2
" tagad ir skaidri identificÄts kÄ nÄk no echo klienta lietojumprogrammas. AtlikuÅ”ajam ziÅojumam ir jÄnÄk no UDP atbalss servera lietojumprogrammas. MÄs varam iespÄjot Å”o komponentu, vides mainÄ«gajÄ NS_LOG ievadot ar kolu atdalÄ«tu komponentu sarakstu.
$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func:
UdpEchoServerApplication=level_all|prefix_func'
BrÄ«dinÄjums: IepriekÅ” redzamajÄ teksta piemÄrÄ aiz kola (:) bÅ«s jÄnoÅem jaunrindas rakstzÄ«me, kas tiek izmantota dokumenta formatÄÅ”anai. Tagad, ja palaižat skriptu, jÅ«s redzÄsit visus žurnÄla ziÅojumus no klienta un servera echo lietojumprogrammÄm. JÅ«s varat redzÄt, ka tas var bÅ«t ļoti noderÄ«gi, veicot atkļūdoÅ”anu.
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.406s)
UdpEchoServerApplication:UdpEchoServer()
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoServerApplication:StartApplication()
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1
UdpEchoServerApplication:HandleRead(): Echoing packet
UdpEchoClientApplication:HandleRead(0x624920, 0x625160)
UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
UdpEchoServerApplication:StopApplication()
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()
Dažreiz ir arÄ« noderÄ«gi redzÄt simulÄcijas laiku, kurÄ tika Ä£enerÄts žurnÄla ziÅojums. To var izdarÄ«t, pievienojot bitu VAI prefiksa_laiks:
$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func|prefix_time: UdpEchoServerApplication=level_all|prefix_func|prefix_time'
Atkal, jums bÅ«s jÄnoÅem iepriekÅ” minÄtÄ jaunrindas rakstzÄ«me. Ja tagad palaižat skriptu, jums vajadzÄtu redzÄt Å”Ädu izvadi:
Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.418s)
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(): Sent 1024 bytes to 10.1.1.2
2.00369s UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1
2.00369s UdpEchoServerApplication:HandleRead(): Echoing packet
2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)
2.00737s UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
10s UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()
LÅ«dzu, Åemiet vÄrÄ, ka konstruktors priekÅ” UdpEchoServer simulÄcijas laikÄ tika izsaukts 0 sekundes. Tas faktiski notiek pirms simulÄcijas sÄkuma, bet laiks tiek parÄdÄ«ts kÄ nulle sekundes. Tas pats attiecas uz konstruktora ziÅojumu UdpEchoClient.
Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.418s)
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(): Sent 1024 bytes to 10.1.1.2
2.00369s UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1
2.00369s UdpEchoServerApplication:HandleRead(): Echoing packet
2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)
2.00737s UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
10s UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()
Atcerieties, ka skripts scratch/first.cc palaida echo servera lietojumprogrammu vienu sekundi pirms simulÄcijas sÄkuma. Tagad jÅ«s varat redzÄt Å”o metodi StartApplication serveris faktiski tiek izsaukts pirmajÄ sekundÄ. Varat arÄ« pamanÄ«t, ka atbalss klients sÄk darboties simulÄcijas otrajÄ sekundÄ, kÄ mÄs prasÄ«jÄm skriptÄ.
Tagad varat sekot simulÄcijas gaitai pÄc izsaukuma PlÄnots pÄrraide klientÄ, kas izsauc HandleRead atzvanÄ«Å”anu NosÅ«tiet echo servera lietojumprogrammÄ. Å emiet vÄrÄ, ka laiks, kas pagÄjis, lai nosÅ«tÄ«tu paketi, izmantojot saiti no punkta uz punktu, ir 3,69 milisekundes. Varat redzÄt, ka atbalss serveris reÄ£istrÄ ziÅojumu, ka tas ir atbildÄjis uz paketi, un pÄc tam pÄc kanÄla aizkaves redzat, ka echo klients saÅem atbalss paketi savÄ HandleRead metodÄ.
Å ajÄ simulÄcijÄ daudz kas notiek jums nemanot. Bet jÅ«s varat ļoti viegli izsekot visam procesam, iespÄjojot visus reÄ£istrÄÅ”anas komponentus sistÄmÄ. MÄÄ£iniet iestatÄ«t mainÄ«go NS_LOG uz Å”Ädu vÄrtÄ«bu,
$ export 'NS_LOG=*=level_all|prefix_func|prefix_time'
IepriekÅ” redzamÄ zvaigznÄ«te ir reÄ£istrÄÅ”anas komponenta aizstÄjÄjzÄ«me. Tas ietvers visus ierakstus visos simulÄcijÄ izmantotajos komponentos. Es Å”eit nereproducÄÅ”u izvadi (rakstÄ«Å”anas laikÄ tas rada 1265 izvades rindas vienai atbalss paketei), taÄu jÅ«s varat novirzÄ«t Å”o informÄciju uz failu un skatÄ«t to savÄ iecienÄ«tÄkajÄ redaktorÄ.
$ ./waf --run scratch/myfirst > log.out 2>&1
Es personÄ«gi izmantoju Å”o ÄrkÄrtÄ«gi detalizÄto reÄ£istrÄÅ”anas versiju, ja man ir problÄmas un nav ne jausmas, kur kaut kas nogÄja greizi. Es varu diezgan viegli sekot lÄ«dzi koda izpildei, nenosakot pÄrtraukuma punktus un nepÄrkÄpjot kodu atkļūdotÄjs. Es varu vienkÄrÅ”i rediÄ£Ät izvadi savÄ iecienÄ«tÄkajÄ redaktorÄ un meklÄt to, ko es gaidu, un redzÄt, ka notiek kaut kas, ko es negaidÄ«ju. Kad man ir vispÄrÄjs priekÅ”stats par to, kas notiek nepareizi, es ieslÄdzu atkļūdotÄju, lai izpÄtÄ«tu problÄmu. Å Äda veida izvade var bÅ«t Ä«paÅ”i noderÄ«ga, ja jÅ«su skripts veic kaut ko pilnÄ«gi negaidÄ«tu. Ja izmantojat tikai atkļūdotÄju, jÅ«s varat palaist garÄm kÄdu pagriezienu. ReÄ£istrÄcija padara Å”Ädus pagriezienus pamanÄmus.
5.1.3. ReÄ£istrÄcijas pievienoÅ”ana kodam
SimulÄcijÄm varat pievienot jaunus ierakstus, izsaucot žurnÄla komponentu no vairÄkiem makro. DarÄ«sim to skriptÄ myfirst.cc, kas mums ir ātÄ«rajÄā direktorijÄ. Atcerieties, ka mÄs definÄjÄm reÄ£istrÄÅ”anas komponentu Å”ajÄ scenÄrijÄ:
NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");
JÅ«s zinÄt, ka varat iespÄjot visu Ŕī komponenta ziÅojumu reÄ£istrÄÅ”anu, iestatot vides mainÄ«go NS_LOG dažÄdos lÄ«meÅos. Dosimies uz priekÅ”u un pievienosim skriptam dažus ierakstus. Makro, ko izmanto, lai žurnÄlam pievienotu informÄcijas lÄ«meÅa ziÅojumus, ir NS_LOG_INFO. Pievienosim ziÅojumu (tieÅ”i pirms sÄkam izveidot mezglus), kas norÄda, ka skripts atrodas "topoloÄ£ijas izveides" fÄzÄ. Tas tiek darÄ«ts Å”ajÄ koda fragmentÄ,
AtvÄrt scratch/myfirst.cc savÄ iecienÄ«tÄkajÄ redaktorÄ un pievienojiet rindiÅu,
NS_LOG_INFO ("Creating Topology");
tieÅ”i pirms rindÄm,
NodeContainer nodes;
nodes.Create (2);
Tagad apkopojiet skriptu, izmantojot WAF, un notÄ«riet mainÄ«go NS_LOG, lai atspÄjotu reÄ£istrÄÅ”anas straumi, ko iespÄjojÄm iepriekÅ”:
$ ./waf
$ export NS_LOG=
Š¢ŠµŠæŠµŃŃ, ŠµŃŠ»Šø Š²Ń Š·Š°ŠæŃŃŃŠøŃŠµ ŃŠŗŃŠøŠæŃ,
$ ./waf --run scratch/myfirst
JÅ«s neredzÄsit jauno ziÅojumu, jo nav iespÄjots saistÄ«tais reÄ£istrÄÅ”anas komponents (FirstScriptExample). Lai redzÄtu ziÅojumu, ir jÄiespÄjo reÄ£istrÄÅ”anas komponents FirstScriptPiemÄrs ar lÄ«meni, kas nav zemÄks par NS_LOG_INFO. Ja vÄlaties tikai redzÄt Å”o konkrÄto reÄ£istrÄÅ”anas lÄ«meni, varat to iespÄjot Å”Ädi,
$ export NS_LOG=FirstScriptExample=info
Ja palaižat skriptu tagad, jÅ«s redzÄsit jaunu ziÅojumu āTopoloÄ£ijas izveideā.
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.404s)
Creating Topology
Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
Received 1024 bytes from 10.1.1.2
5.2 Komandrindas argumentu izmantoŔana
5.2.1. NoklusÄjuma atribÅ«tu vÄrtÄ«bu ignorÄÅ”ana
VÄl viens veids, kÄ mainÄ«t ns-3 skriptu darbÄ«bu bez rediÄ£ÄÅ”anas vai veidoÅ”anas, ir izmantot komandrindas argumentus. MÄs nodroÅ”inÄm mehÄnismu, lai parsÄtu komandrindas argumentus un automÄtiski iestatÄ«tu vietÄjos un globÄlos mainÄ«gos, pamatojoties uz rezultÄtiem.
Pirmais solis komandrindas argumentu sistÄmas izmantoÅ”anÄ ir komandrindas parsÄtÄja deklarÄÅ”ana. Tas ir diezgan viegli izdarÄms (jÅ«su galvenajÄ programmÄ), tÄpat kÄ nÄkamajÄ kodÄ,
int
main (int argc, char *argv[])
{
...
CommandLine cmd;
cmd.Parse (argc, argv);
...
}
Å is vienkÄrÅ”ais divu rindiÅu fragments patiesÄ«bÄ ir ļoti noderÄ«gs pats par sevi. Tas paver durvis uz ns-3 globÄlo mainÄ«go un atribÅ«tu sistÄmu. GalvenÄs skripta funkcijas sÄkumam pievienosim divas koda rindiÅas scratch/myfirst.cc. Turpinot, mÄs apkopojam skriptu un palaižam to, palaižot mÄs veicam palÄ«dzÄ«bas pieprasÄ«jumu Å”Ädi:
$ ./waf --run "scratch/myfirst --PrintHelp"
Å Ä« komanda jautÄs Waf palaist skriptu scratch/myfirst un nododiet tam komandrindas argumentu ā Drukas palÄ«dzÄ«ba. PÄdiÅas ir nepiecieÅ”amas, lai norÄdÄ«tu, kurai programmai arguments ir paredzÄts. Komandrindas parsÄtÄjs noteiks argumentu ā Drukas palÄ«dzÄ«ba un parÄdÄ«s atbildi,
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.
Tagad apskatÄ«sim iespÄju ā Drukas atribÅ«ti. MÄs jau minÄjÄm ns-3 atribÅ«tu sistÄmu, pÄtot first.cc skriptu. MÄs esam redzÄjuÅ”i Å”Ädas koda rindas,
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
un viÅi to teica Datu pÄrraides Ätrums patiesÄ«bÄ ir atribÅ«ts PointToPointNetDevice. Lai skatÄ«tu atribÅ«tus, izmantosim komandrindas argumentu parsÄtÄju PointToPointNetDevice. PalÄ«dzÄ«bas sarakstÄ ir norÄdÄ«ts, kas mums ir jÄsniedz TypeId. Å is ir tÄs klases nosaukums, kurai pieder interesÄjoÅ”ie atribÅ«ti. MÅ«su gadÄ«jumÄ tÄ bÅ«s ns3::PointToPointNetDevice. TurpinÄsim virzÄ«ties uz priekÅ”u, ieejam,
$ ./waf --run "scratch/myfirst --PrintAttributes=ns3::PointToPointNetDevice"
SistÄma izdrukÄs visus Ŕī tÄ«kla ierÄ«ces tipa atribÅ«tus. JÅ«s redzÄsit, ka starp sarakstÄ esoÅ”ajiem atribÅ«tiem ir
--ns3::PointToPointNetDevice::DataRate=[32768bps]:
The default data rate for point to point links
Å Ä« ir noklusÄjuma vÄrtÄ«ba, ko sistÄma izmantos, veidojot objektu PointToPointNetDevice. MÄs ignorÄsim Å”o noklusÄjuma vÄrtÄ«bu, izmantojot parametru Ä«paŔība Š² PointToPointHelper augstÄks. Izmantosim noklusÄtÄs vÄrtÄ«bas punkta-punkta ierÄ«cÄm un kanÄliem. Lai to izdarÄ«tu, mÄs izdzÄsÄ«sim zvanus SetDeviceAttribute Šø SetChannelAttribute no myfirst.cc, kas mums ir tÄ«rÄ direktorijÄ.
JÅ«su skriptam tagad vajadzÄtu vienkÄrÅ”i deklarÄt PointToPointHelper un neveiciet nekÄdas instalÄÅ”anas darbÄ«bas, kÄ parÄdÄ«ts tÄlÄk esoÅ”ajÄ piemÄrÄ,
...
NodeContainer nodes;
nodes.Create (2);
PointToPointHelper pointToPoint;
NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);
...
Iet uz priekÅ”u un izveidojiet jaunu skriptu ar Waf (./waff) un atgriezÄ«simies, iekļaujot kÄdu ierakstu no UDP echo servera lietojumprogrammas un iekļaujot laika prefiksu.
$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'
Ja palaižat skriptu, jums vajadzÄtu redzÄt Å”Ädu izvadi:
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.405s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Sent 1024 bytes to 10.1.1.2
2.25732s Received 1024 bytes from 10.1.1.1
2.25732s Echoing packet
Received 1024 bytes from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()
AtgÄdinÄm, ka pÄdÄjo reizi, kad skatÄ«jÄmies simulÄcijas laiku, brÄ«dÄ«, kad echo serveri saÅÄma paketi, tas bija 2,00369 sekundes.
2.00369s UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1
Tagad viÅÅ” paciÅu saÅem 2.25732 sekundÄs. Tas ir tÄpÄc, ka mÄs vienkÄrÅ”i atiestatÄ«jÄm PointToPointNetDevice datu pÄrraides Ätrumu no pieciem megabitiem sekundÄ uz noklusÄjuma vÄrtÄ«bu, kas ir 32768 biti sekundÄ. Ja mÄs aizstÄtu jaunu DataRate, izmantojot komandrindu, mÄs varÄtu atkal paÄtrinÄt simulÄciju. MÄs to darÄ«sim Å”Ädi, saskaÅÄ ar palÄ«dzÄ«bas elementa norÄdÄ«to formulu:
$ ./waf --run "scratch/myfirst --ns3::PointToPointNetDevice::DataRate=5Mbps"
Tas atgriezÄ«s DataRate atribÅ«ta noklusÄjuma vÄrtÄ«bu pieci megabiti sekundÄ. Vai esat pÄrsteigts par rezultÄtu? IzrÄdÄs, ka, lai atgrieztu skripta sÄkotnÄjo uzvedÄ«bu, mums ir jÄiestata arÄ« kanÄla aizkave, lai tÄ atbilstu gaismas Ätrumam. MÄs varam lÅ«gt komandrindas sistÄmai izdrukÄt kanÄla atribÅ«tus, tÄpat kÄ mÄs to darÄ«jÄm tÄ«kla ierÄ«cei:
$ ./waf --run "scratch/myfirst --PrintAttributes=ns3::PointToPointChannel"
MÄs atklÄsim, ka kanÄla aizkaves atribÅ«ts ir iestatÄ«ts Å”Ädi:
--ns3::PointToPointChannel::Delay=[0ns]:
Transmission delay through the channel
PÄc tam mÄs varam, izmantojot komandrindas sistÄmu, iestatÄ«t abas Ŕīs noklusÄjuma vÄrtÄ«bas.
$ ./waf --run "scratch/myfirst
--ns3::PointToPointNetDevice::DataRate=5Mbps
--ns3::PointToPointChannel::Delay=2ms"
Å”ajÄ gadÄ«jumÄ mÄs atjaunojam laiku, kas mums bija, kad skriptÄ skaidri iestatÄ«jÄm DataRate un Delay:
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.417s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Sent 1024 bytes to 10.1.1.2
2.00369s Received 1024 bytes from 10.1.1.1
2.00369s Echoing packet
Received 1024 bytes from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()
Å emiet vÄrÄ, ka serveris atkal saÅem paketi pÄc 2,00369 sekundÄm. MÄs faktiski varÄtu iestatÄ«t jebkuru no skriptÄ izmantotajiem atribÅ«tiem Å”ÄdÄ veidÄ. Jo Ä«paÅ”i mÄs varÄtu iestatÄ«t MaxPackets atribÅ«tus uz vÄrtÄ«bÄm, kas nav viena UdpEchoClient.
KÄ jÅ«s to izmantotu? PamÄÄ£inÄt. Atcerieties, ka jums ir jÄizraksta vieta, kur mÄs ignorÄjam noklusÄjuma atribÅ«ta vÄrtÄ«bu un skaidri iestatÄm MaxPackets scenÄrijÄ. PÄc tam jums ir jÄpÄrveido skripts. Varat arÄ« izmantot komandrindu, lai saÅemtu sintakses palÄ«dzÄ«bu jaunas noklusÄjuma atribÅ«ta vÄrtÄ«bas iestatÄ«Å”anai. Kad to saprotat, varat kontrolÄt komandrindÄ parÄdÄ«to pakotÅu skaitu. TÄ kÄ mÄs esam strÄdÄ«gi cilvÄki, mÅ«su komandrindai vajadzÄtu izskatÄ«ties apmÄram Å”Ädi:
$ ./waf --run "scratch/myfirst
--ns3::PointToPointNetDevice::DataRate=5Mbps
--ns3::PointToPointChannel::Delay=2ms
--ns3::UdpEchoClient::MaxPackets=2"
Å ajÄ brÄ«dÄ« rodas dabisks jautÄjums, kÄ uzzinÄt par visu Å”o atribÅ«tu esamÄ«bu. Atkal komandrindas sistÄmai ir palÄ«dzÄ«bas funkcija Å”ajÄ jautÄjumÄ. Ja mÄs lÅ«dzam palÄ«dzÄ«bu komandrindÄ, mums vajadzÄtu redzÄt:
$ ./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.
Ja atlasÄt argumentu "PrintGroups", jums vajadzÄtu redzÄt visu reÄ£istrÄto grupu sarakstu TypeId. Grupu nosaukumi atbilst moduļu nosaukumiem avota direktorijÄ (lai gan ar lielo burtu). Visas informÄcijas drukÄÅ”ana uzreiz bÅ«tu pÄrÄk apjomÄ«ga, tÄpÄc ir pieejams papildu filtrs informÄcijas drukÄÅ”anai pa grupÄm. TÄtad, atkal koncentrÄjoties uz moduli no punkta uz punktu:
./waf --run "scratch/myfirst --PrintGroup=PointToPoint"
TypeIds in group PointToPoint:
ns3::PointToPointChannel
ns3::PointToPointNetDevice
ns3::PointToPointRemoteChannel
ns3::PppHeader
Å eit varat atrast pieejamos TypeId nosaukumus atribÅ«tu meklÄÅ”anai, piemÄram, in
--PrintAttributes = ns3 :: PointToPointChannel
kÄ parÄdÄ«ts iepriekÅ”.
VÄl viens veids, kÄ uzzinÄt par atribÅ«tiem, ir Doxygen ns-3. Ir lapa, kurÄ ir uzskaitÄ«ti visi simulatorÄ reÄ£istrÄtie atribÅ«ti.
5.2.2. Savu komandu tverŔana
Varat arÄ« pievienot savus ÄÄ·us, izmantojot komandrindas sistÄmu. Tas tiek darÄ«ts pavisam vienkÄrÅ”i, izmantojot komandrindas parsÄÅ”anas metodi AddValue.
Izmantosim Å”o funkciju, lai pavisam citÄdi norÄdÄ«tu parÄdÄmo pakotÅu skaitu. Pievienosim lokÄlo mainÄ«go ar nosaukumu nPaketes par funkciju galvenais. MÄs to iestatÄ«sim uz vienu, lai tas atbilstu mÅ«su iepriekÅ”Äjai noklusÄjuma darbÄ«bai. Lai komandrindas parsÄtÄjs varÄtu mainÄ«t Å”o vÄrtÄ«bu, mums Ŕī vÄrtÄ«ba ir jÄietver parsÄtÄjÄ. MÄs to darÄm, pievienojot zvanu AddValue. Ej un maini skriptu scratch/myfirst.cc lai sÄktu ar Å”Ädu kodu,
int
main (int argc, char *argv[])
{
uint32_t nPackets = 1;
CommandLine cmd;
cmd.AddValue("nPackets", "Number of packets to echo", nPackets);
cmd.Parse (argc, argv);
...
Ritiniet uz leju lÄ«dz vietai skriptÄ, kurÄ mÄs iestatÄ«jÄm MaxPackets atribÅ«tu, un mainiet to tÄ, lai tas bÅ«tu iestatÄ«ts uz nPackets mainÄ«go, nevis konstanto 1, kÄ parÄdÄ«ts zemÄk.
echoClient.SetAttribute ("MaxPackets", UintegerValue (nPackets));
Tagad, ja palaižat skriptu un sniedzat argumentu -PrintHelp, jums vajadzÄtu redzÄt jaunÄ lietotÄja argumentu. norÄdÄ«ts palÄ«dzÄ«bas displejÄ. Ieiet,
$ ./waf --run "scratch/myfirst --PrintHelp"
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.403s)
--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.
User Arguments:
--nPackets: Number of packets to echo
Ja vÄlaties mainÄ«t pÄrsÅ«tÄ«to pakeÅ”u skaitu, varat to izdarÄ«t, iestatot komandrindas argumentu -nPackets.
$ ./waf --run "scratch/myfirst --nPackets=2"
Tagad jums vajadzÄtu redzÄt
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.404s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Sent 1024 bytes to 10.1.1.2
2.25732s Received 1024 bytes from 10.1.1.1
2.25732s Echoing packet
Received 1024 bytes from 10.1.1.2
Sent 1024 bytes to 10.1.1.2
3.25732s Received 1024 bytes from 10.1.1.1
3.25732s Echoing packet
Received 1024 bytes from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()
Tagad esat nosÅ«tÄ«jis divas pakas. Diezgan vienkÄrÅ”i, vai ne?
Varat redzÄt, ka kÄ ns-3 lietotÄjs varat izmantot komandrindas argumentu sistÄmu, lai manipulÄtu ar globÄlajÄm vÄrtÄ«bÄm un atribÅ«tiem. Ja esat modeļa autors, varat pievienot jaunus atribÅ«tus saviem objektiem, un tie bÅ«s automÄtiski pieejami konfigurÄcijai jÅ«su lietotÄjiem, izmantojot komandrindas sistÄmu. Ja esat skriptu autors, varat saviem skriptiem pievienot jaunus mainÄ«gos un nemanÄmi pievienot tos komandrindas sistÄmai.
5.3. IzsekoÅ”anas sistÄmas izmantoÅ”ana
Visa modelÄÅ”anas bÅ«tÄ«ba ir Ä£enerÄt produkciju turpmÄkai izpÄtei, un ns-3 izsekoÅ”anas sistÄma ir galvenais mehÄnisms tam. TÄ kÄ ns-3 ir C++ programma, var izmantot standarta lÄ«dzekļus C++ programmas izvades Ä£enerÄÅ”anai:
#include <iostream>
...
int main ()
{
...
std::cout << "The value of x is " << x << std::endl;
...
}
Varat pat izmantot reÄ£istrÄÅ”anas moduli, lai savam risinÄjumam pievienotu nelielu struktÅ«ru. Ir daudzas zinÄmas problÄmas, ko izraisa Ŕī pieeja, un tÄpÄc mÄs esam nodroÅ”inÄjuÅ”i vispÄrÄ«gu notikumu izsekoÅ”anas apakÅ”sistÄmu, lai atrisinÄtu Ŕīs problÄmas.
ns-3 izsekoÅ”anas sistÄmas galvenie mÄrÄ·i ir:
-
Pamatuzdevumiem izsekoÅ”anas sistÄmai jÄļauj lietotÄjam Ä£enerÄt standarta izsekoÅ”anu populÄriem avotiem un atlasÄ«t objektus, kas Ä£enerÄ izsekoÅ”anu;
-
VidÄja lÄ«meÅa lietotÄjiem vajadzÄtu bÅ«t iespÄjai paplaÅ”inÄt izsekoÅ”anas sistÄmu, lai mainÄ«tu Ä£enerÄto izvades formÄtu vai ievietotu jaunus izsekoÅ”anas avotus, nepÄrveidojot simulatora kodolu;
-
PieredzÄjuÅ”i lietotÄji var modificÄt simulatora kodolu, lai pievienotu jaunus izsekoÅ”anas avotus un izlietnes. ns-3 izsekoÅ”anas sistÄma ir veidota pÄc neatkarÄ«gu izsekoÅ”anas avotu un uztvÄrÄju principiem, kÄ arÄ« vienota mehÄnisma avotu savienoÅ”anai ar patÄrÄtÄjiem.
SekoÅ”anas sistÄma ns-3 ir veidota pÄc neatkarÄ«gu izsekoÅ”anas avotu un uztvÄrÄju principiem, kÄ arÄ« vienota mehÄnisma avotu savienoÅ”anai ar uztvÄrÄjiem. IzsekoÅ”anas avoti ir objekti, kas var signalizÄt par notikumiem, kas notiek simulÄcijÄ, un nodroÅ”inÄt piekļuvi interesÄjoÅ”iem pamatÄ esoÅ”ajiem datiem. PiemÄram, izsekoÅ”anas avots var norÄdÄ«t, kad tÄ«kla ierÄ«ce ir saÅÄmusi paketi, un padarÄ«t paketes saturu pieejamu ieinteresÄtajiem izsekoÅ”anas uztvÄrÄjiem.
IzsekoÅ”anas avoti paÅ”i par sevi ir bezjÄdzÄ«gi, ja vien tie nav "savienoti" ar citÄm koda daļÄm, kas faktiski dara kaut ko noderÄ«gu ar izlietnes sniegto informÄciju. IzsekotÄji ir notikumu un datu patÄrÄtÄji, ko nodroÅ”ina izsekoÅ”anas avoti. PiemÄram, varat izveidot izsekoÅ”anas izlietni, kas (kad ir savienots ar iepriekÅ”ÄjÄ piemÄra izsekoÅ”anas avotu) izdrukÄs interesÄjoÅ”Äs daļas saÅemtajÄ paketÄ.
Å Ä«s skaidrÄs nodalÄ«Å”anas pamatojums ir ļaut lietotÄjiem savienot jaunus izlietnes veidus ar esoÅ”ajiem izsekoÅ”anas avotiem, nerediÄ£Äjot un atkÄrtoti kompilÄjot simulatora kodolu. TÄtad iepriekÅ” minÄtajÄ piemÄrÄ lietotÄjs var definÄt jaunu izsekotÄju savÄ skriptÄ un savienot to ar esoÅ”u izsekoÅ”anas avotu, kas definÄts simulÄcijas kodolÄ, tikai rediÄ£Äjot lietotÄja skriptu.
Å ajÄ apmÄcÄ«bÄ mÄs apskatÄ«sim dažus iepriekÅ” definÄtus avotus un izlietnes un parÄdÄ«sim, kÄ tos var konfigurÄt ar vismazÄko lietotÄja piepÅ«li. InformÄciju par papildu izsekoÅ”anas konfigurÄciju, tostarp izsekoÅ”anas nosaukumvietas paplaÅ”inÄÅ”anu un jaunu izsekoÅ”anas avotu izveidi, skatiet ns-3 rokasgrÄmatÄ vai norÄdÄ«jumu sadaļÄs.
5.3.1. ASCII izsekoŔana
ns-3 nodroÅ”ina palÄ«gfunkciju, kas nodroÅ”ina zema lÄ«meÅa izsekoÅ”anas sistÄmu, lai palÄ«dzÄtu jums iegÅ«t detalizÄtu informÄciju, iestatot vienkÄrÅ”as pakeÅ”u izsekoÅ”anas. Ja iespÄjosit Å”o funkciju, izvadi redzÄsit ASCII failos. Tiem, kas pÄrzina ns-2 izvadi, Å”is izsekoÅ”anas veids ir lÄ«dzÄ«gs out.tr, ko Ä£enerÄ daudzi skripti.
SÄksim darbu un pievienosim dažus ASCII izsekoÅ”anas rezultÄtus mÅ«su scratch/myfirst.cc skriptam. TieÅ”i pirms zvana Simulator :: Run ()
, pievienojiet Å”Ädas koda rindas:
AsciiTraceHelper ascii;
pointToPoint.EnableAsciiAll (ascii.CreateFileStream ("myfirst.tr"));
TÄpat kÄ daudzas citas ns-3 idiomas, Å”is kods izmanto palÄ«gobjektu, lai izveidotu ASCII trases. OtrajÄ rindÄ ir divi ligzdoti metožu izsaukumi. "IekÅ”Ä" metode CreateFileStream() izmanto anonÄ«mo objektu idiomu, lai izveidotu faila straumes objektu kaudzÄ (bez objekta nosaukuma) un nodod to izsauktajai metodei. NÄkotnÄ mÄs to iedziļinÄsimies, taÄu viss, kas jums Å”obrÄ«d jÄzina, ir tas, ka jÅ«s veidojat objektu, kas attÄlo failu ar nosaukumu myfirst.tr un pÄrsÅ«tiet to uz ns-3. MÄs uzticam ns-3 rÅ«pÄties par izveidoto objektu visu tÄ kalpoÅ”anas laiku, kura laikÄ tas atrisina problÄmas, ko rada maz zinÄms (tÄ«Å”s) ierobežojums, kas saistÄ«ts ar C++ straumes objektu kopiju konstruktoriem.
ÄrÄjais zvans IespÄjotAsciiAll() norÄda palÄ«gam, ka vÄlaties iekļaut ASCII izsekoÅ”anu savÄ simulÄcijÄ visiem punkta-punkta ierÄ«Äu savienojumiem un ka vÄlaties (norÄdÄ«tiem) izsekoÅ”anas uztvÄrÄjiem ierakstÄ«t pakeÅ”u kustÄ«bas informÄciju ASCII formÄtÄ.
Tiem, kas pÄrzina ns-2, izsekotie notikumi ir lÄ«dzvÄrtÄ«gi zinÄmajiem trasÄÅ”anas punktiem, kas reÄ£istrÄ notikumus "+", "-", "d" un "r".
Tagad varat izveidot skriptu un palaist to no komandrindas:
$ ./waf --run scratch/myfirst
TÄpat kÄ daudzas reizes iepriekÅ”, jÅ«s redzÄsiet vairÄkus ziÅojumus no Waf un pÄc tam āBÅ«vÄÅ”ana veiksmÄ«gi pabeigtaā ar dažiem ziÅojumiem no darbojoÅ”Äs programmas.
Palaižot, programma izveidos failu ar nosaukumu myfirst.tr. Darba rakstura dÄļ Waf, pÄc noklusÄjuma fails tiek izveidots nevis lokÄlajÄ direktorijÄ, bet gan repozitorija augstÄkÄ lÄ«meÅa direktorijÄ. Ja vÄlaties mainÄ«t ceļu, kurÄ tiek saglabÄtas pÄdas, varat izmantot Waf parametru, lai to norÄdÄ«tu --cwd
. MÄs to neesam izdarÄ«juÅ”i, tÄpÄc, lai apskatÄ«tu ASCII izsekoÅ”anas failu myfirst.tr jÅ«su iecienÄ«tÄkajÄ redaktorÄ, mums bÅ«s jÄpÄrvietojas uz mÅ«su repozitorija augstÄkÄ lÄ«meÅa direktoriju.
ParsÄ ASCII pÄdas
Tur ir daudz informÄcijas diezgan blÄ«vÄ formÄ, taÄu pirmÄ lieta, kas jums jÄÅem vÄrÄ, ir tas, ka fails sastÄv no atseviŔķÄm rindÄm. Tas kļūs skaidri redzams, ja skata logu izvÄrsiet plaÅ”Äk.
Katra faila rinda atbilst izsekoÅ”anas notikumam. Å ajÄ gadÄ«jumÄ mÄs izsekojam notikumus pÄrraides rindÄ, kas atrodas katrÄ simulÄcijas punkta-punkta tÄ«kla ierÄ«cÄ. PÄrsÅ«tÄ«Å”anas rinda ir rinda, caur kuru katrai paketei ir jÄiziet savienojuma no punkta uz punktu. Å emiet vÄrÄ, ka katra izsekoÅ”anas faila rinda sÄkas ar vienu rakstzÄ«mi (un aiz tÄs ir atstarpe). Å im simbolam bÅ«s Å”Äda nozÄ«me:
+: ierÄ«ces rindÄ notikusi rindas darbÄ«ba;
-: ierÄ«ces rindÄ notikusi elementu izguves darbÄ«ba;
d: pakete tika izmesta, parasti tÄpÄc, ka rinda bija pilna;
r: paketi saÅÄma tÄ«kla ierÄ«ce.
SÄ«kÄk apskatÄ«sim pirmo rindiÅu izsekoÅ”anas failÄ. Es to sadalÄ«Å”u daļÄs (skaidrÄ«bas labad ar ievilkumiem) un rindas numuru kreisajÄ pusÄ:
0 +
1 2
2 /NodeList/0/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Enqueue
3 ns3::PppHeader (
4 Point-to-Point Protocol: IP (0x0021))
6 ns3::Ipv4Header (
7 tos 0x0 ttl 64 id 0 protocol 17 offset 0 flags [none]
8 length: 1052 10.1.1.1 > 10.1.1.2)
9 ns3::UdpHeader (
10 length: 1032 49153 > 9)
11 Payload (size=1024)
Å Ä« paplaÅ”inÄtÄ izsekoÅ”anas notikuma pirmÄ sadaļa (0. rindiÅa) ir darbÄ«ba. Å eit mums ir simbols +, kas atbilst pÄrsÅ«tÄ«Å”anas rindas darbÄ«bai. OtrÄ sadaļa (1. rinda) ir simulÄcijas laiks, kas izteikts sekundÄs. JÅ«s varat atcerÄties, ko mÄs jautÄjÄm UdpEchoClientApplication sÄciet sÅ«tÄ«t paketes pÄc divÄm sekundÄm. Å eit mÄs redzam apstiprinÄjumu, ka tas patieÅ”Äm notiek.
NÄkamajÄ izsekoÅ”anas piemÄra sadaÄ¼Ä (no 2. rindiÅas) ir parÄdÄ«ts, kurÅ” izsekoÅ”anas avots Ä£enerÄja Å”o notikumu (norÄdot nosaukumvietas izsekoÅ”anu). JÅ«s varat domÄt par izsekoÅ”anas nosaukumvietu lÄ«dzÄ«gi kÄ par failu sistÄmas nosaukumvietu. Nosaukumvietas sakne ir Mezglu saraksts. Tas atbilst galvenajÄ ns-3 kodÄ pÄrvaldÄ«tajam konteineram. TajÄ ir visi skriptÄ izveidotie mezgli. TÄpat kÄ failu sistÄmas saknÄ var bÅ«t direktoriji, Mezglu saraksts mums var bÅ«t daudz mezglu. TÄtad rinda /NodeList/0 attiecas uz nulles mezglu NodeList, ko mÄs parasti domÄjam par "mezglu 0". Katram mezglam ir instalÄto ierÄ«Äu saraksts. Å is saraksts atrodas blakus nosaukumvietÄ. Var redzÄt, ka Å”is izsekoÅ”anas notikums nÄk no IerÄ«Äu saraksts/0, kas ir mezglÄ instalÄtÄ nulles ierÄ«ce.
NÄkamÄ apakÅ”virkne, $ ns3 :: PointToPointNetDevice
, norÄda, kura ierÄ«ce atrodas nulles pozÄ«cijÄ: nulles mezgla ierÄ«Äu saraksts. AtgÄdiniet, ka + darbÄ«ba, kas atrasta 0. rindÄ, nozÄ«mÄja, ka ierÄ«ces pÄrraides rindai tika pievienots elements. Tas ir atspoguļots pÄdÄjos āceļa ceļaā segmentos: TxQueue/Enqueue.
PÄrÄjÄm trases sadaļÄm jÄbÅ«t diezgan intuitÄ«vÄm. 3.ā4. rinda norÄda, ka pakete ir iekapsulÄta no punkta uz punktu protokolÄ. 5.ā7. rindiÅa parÄda, ka paketei ir IP4 versijas galvene un tÄs izcelsme ir IP adresÄ 10.1.1.1
un ir paredzÄts 10.1.1.2
. 8.-9. rindiÅa parÄda, ka Å”ai paketei ir UDP galvene, un visbeidzot 10. rinda parÄda, ka lietderÄ«gÄ slodze ir paredzamie 1024 baiti.
NÄkamÄ izsekoÅ”anas faila rinda parÄda, ka tÄ pati pakete tika izvilkta no pÄrraides rindas tajÄ paÅ”Ä mezglÄ.
TreÅ”Ä rindiÅa izsekoÅ”anas failÄ parÄda, ka paketi saÅÄmusi tÄ«kla ierÄ«ce echo servera resursdatorÄ. TÄlÄk es atkÄrtoju notikumu.
0 r
1 2.25732
2 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/MacRx
3 ns3::Ipv4Header (
4 tos 0x0 ttl 64 id 0 protocol 17 offset 0 flags [none]
5 length: 1052 10.1.1.1 > 10.1.1.2)
6 ns3::UdpHeader (
7 length: 1032 49153 > 9)
8 Payload (size=1024)
Å emiet vÄrÄ, ka izsekoÅ”anas darbÄ«ba tagad ir r un simulÄcijas laiks ir palielinÄts lÄ«dz 2,25732 sekundÄm. Ja rÅ«pÄ«gi sekojÄt apmÄcÄ«bai, tas nozÄ«mÄ, ka tÄ«kla ierÄ«Äu datu pÄrraides Ätruma un saites aizkave ir iestatÄ«ta uz noklusÄjuma vÄrtÄ«bÄm. Å im laikam vajadzÄtu bÅ«t pazÄ«stamam, kÄ jÅ«s redzÄjÄt iepriekÅ”ÄjÄ sadaļÄ.
IzsekoÅ”anas avota nosaukumvietas ieraksts (2. rindiÅa) ir modificÄts, lai atspoguļotu, ka Å”is notikums ir cÄlies no 1. mezgla (/Mezglu saraksts/1) un paketi saÅem izsekoÅ”anas avots (/MacRx). Jums vajadzÄtu bÅ«t diezgan viegli izsekot paketes kustÄ«bai caur topoloÄ£iju, apskatot atlikuÅ”Äs faila pÄdas.
5.3.2. PCAP izsekoŔana
Ns-3 ierÄ«Äu palÄ«gus var izmantot arÄ«, lai izveidotu izsekoÅ”anas failus .pcap formÄtÄ. AkronÄ«ms pcap (parasti rakstÄ«ts ar mazajiem burtiem) apzÄ«mÄ pakeÅ”u uztverÅ”anu un faktiski ir API, kas ietver .pcap faila formÄta definÄÅ”anu. PopulÄrÄkÄ programma, kas var lasÄ«t un parÄdÄ«t Å”o formÄtu, ir Wireshark (iepriekÅ” saukts Ethereal). TomÄr ir daudzi trafika izsekoÅ”anas analizatori, kas izmanto Å”o pakeÅ”u formÄtu. MÄs mudinÄm lietotÄjus izmantot daudzos pieejamos rÄ«kus, lai analizÄtu pcap pÄdas. Å ajÄ apmÄcÄ«bÄ mÄs pievÄrsÄ«simies pcap pÄdu skatÄ«Å”anai, izmantojot tcpdump.
PCap izsekoÅ”anas iespÄjoÅ”ana tiek veikta ar vienu koda rindiÅu.
pointToPoint.EnablePcapAll ("myfirst");
IelÄ«mÄjiet Å”o koda rindiÅu aiz ASCII izsekoÅ”anas koda, ko tikko pievienojÄm scratch/myfirst.cc. Å emiet vÄrÄ, ka mÄs nokÄrtojÄm tikai virkni "myfirst", nevis "myfirst.pcap" vai ko lÄ«dzÄ«gu. Tas ir tÄpÄc, ka parametrs ir prefikss, nevis pilns faila nosaukums. SimulÄcijas laikÄ palÄ«gs faktiski izveidos izsekoÅ”anas failu katrai punkta-punkta ierÄ«cei. Failu nosaukumi tiks izveidoti, izmantojot prefiksu, mezgla numuru, ierÄ«ces numuru un sufiksu ".pcap'.
MÅ«su skripta piemÄrÄ mÄs redzÄsim failus ar nosaukumu "myfirst-0-0.pcap"Un"myfirst-1-0.pcap", kas ir attiecÄ«gi pcap trases 0. ierÄ«cei 0 un mezgla 1 ierÄ«cei 0. Kad esat pievienojis koda rindiÅu, lai iespÄjotu pcap izsekoÅ”anu, varat palaist skriptu parastajÄ veidÄ:
$ ./waf --run scratch/myfirst
Ja skatÄties sava izplatÄ«Å”anas augstÄkÄ lÄ«meÅa direktorijÄ, jums vajadzÄtu redzÄt trÄ«s failus: ASCII izsekoÅ”anas failu myfirst.tr, ko mÄs iepriekÅ” pÄtÄ«jÄm, faili myfirst-0-0.pcap Šø myfirst-1-0.pcap - jauni pcap faili, ko tikko Ä£enerÄjÄm.
Izvades lasīŔana ar tcpdump
PagaidÄm vienkÄrÅ”Äkais veids, kÄ skatÄ«t pcap failus, ir izmantot tcpdump.
$ 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
IzgÄztuvÄ myfirst-0-0.pcap (klienta ierÄ«ce) jÅ«s varat redzÄt, ka atbalss pakete ir nosÅ«tÄ«ta pÄc 2 sekunžu simulÄcijas. Ja paskatÄs uz otro izgÄztuvi (myfirst-1-0.pcap), jÅ«s redzÄsiet, ka pakete tiek saÅemta pÄc 2,257324 sekundÄm. OtrajÄ izdrukÄ redzÄsit, ka pakete tiek atgriezta pÄc 2.257324 sekundÄm un visbeidzot, ka klients paketi saÅÄma atpakaļ pirmajÄ izgÄztuvÄ pÄc 2.514648 sekundÄm.
LasīŔanas izvade ar Wireshark
Ja neesat pazÄ«stams ar Wireshark, ir vietne, no kuras varat lejupielÄdÄt programmas un dokumentÄciju:
Avots: www.habr.com