ns-3 tīkla simulatora apmācība. 5. nodaļa

ns-3 tīkla simulatora apmācība. 5. nodaļa
1,2. nodaļa
3. nodaļa
4. nodaļa

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 :: PointToPointChannelkā 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: http://www.wireshark.org/. Wireshark ir GUI, ko var izmantot, lai parādÄ«tu Å”os izsekoÅ”anas failus. Ja jums ir Wireshark, varat atvērt jebkuru izsekoÅ”anas failu un parādÄ«t saturu tā, it kā jÅ«s bÅ«tu tvēris paketes, izmantojot pakeÅ”u sniffer.

Avots: www.habr.com

Pievieno komentāru