ns-3 verkkosimulaattorin opetusohjelma. Luku 5

ns-3 verkkosimulaattorin opetusohjelma. Luku 5
luku 1,2
luku 3
luku 4

5 Asetukset
5.1 Kirjausmoduulin käyttö
5.1.1 Kirjauksen yleiskatsaus
5.1.2 Ota kirjaus käyttöön
5.1.3 Kirjauksen lisääminen koodiisi
5.2 Komentoriviargumenttien käyttäminen
5.2.1 Ominaisuuksien oletusarvojen ohittaminen
5.2.2 Omien komentojesi tallentaminen
5.3 Jäljitysjärjestelmän käyttö
5.3.1 ASCII-seuranta
ASCII-jälkien jäsentäminen
5.3.2 PCAP Trace

Luku 5

säätö

5.1 Kirjausmoduulin käyttö

Tarkastelimme jo lyhyesti ns-3-lokimoduulia katsomalla komentosarjaa ensimmäinen.cc. Tässä luvussa tarkastellaan lähemmin kirjausalijärjestelmän mahdollisia käyttötapoja.

5.1.1 Kirjauksen yleiskatsaus

Monet suuret järjestelmät tukevat jonkinlaista viestien kirjaustoimintoa, eikä ns-3 ole poikkeus. Joissakin tapauksissa vain virheilmoitukset kirjoitetaan "operaattorikonsoliin" (joka on yleensä stderr Unix-pohjaisissa järjestelmissä). Muissa järjestelmissä voidaan näyttää varoitusviestejä sekä tarkempia tietoja. Joissakin tapauksissa lokityökaluja käytetään tulostamaan virheenkorjausviestejä, jotka voivat nopeasti hämärtää tulosteen.

ns-3:ssa käytetty subHRD olettaa, että kaikki nämä tietosisällön tasot ovat hyödyllisiä, ja tarjoamme valikoivan, kerroksittainen lähestymistavan viestien kirjaamiseen. Kirjaaminen voidaan poistaa kokonaan käytöstä, ottaa käyttöön komponenttikohtaisesti tai maailmanlaajuisesti. Tätä tarkoitusta varten käytetään säädettäviä tietosisällön tasoja. ns-3-lokimoduuli tarjoaa suhteellisen yksinkertaisen tavan saada hyödyllistä tietoa simulaatiostasi.

Sinun tulisi ymmärtää, että tarjoamme yleiskäyttöisen mekanismin - jäljityksen - tietojen poimimiseen malleistasi, minkä pitäisi olla ensisijainen tulos simulaatioissa (lisätietoja jäljitysjärjestelmästämme on opetusohjelman osiossa 5.3). Kirjaamisen tulisi olla ensisijainen menetelmä virheenkorjaustietojen, varoitusten ja virheilmoitusten saamiseksi tai viestien nopeaan tulostamiseen komentosarjoista tai malleista milloin tahansa.

Tällä hetkellä järjestelmä määrittelee seitsemän lokiviestien tasoa (tyyppiä) tietosisällön kasvavassa järjestyksessä.

  • LOG_ERROR - lokivirheilmoitukset (aiheeseen liittyvä makro: NS_LOG_ERROR);
  • LOG_WARN - Loki varoitusviestit (liittyvä makro: NS_LOG_WARN);
  • LOG_DEBUG - Kirjaa suhteellisen harvinaisia ​​erityisiä virheenkorjausviestejä (aiheeseen liittyvä makro: NS_LOG_DEBUG);
  • LOG_INFO - ohjelman edistymistä koskevien tietoviestien rekisteröinti (liittyvä makro: NS_LOG_INFO);
  • LOG_FUNCTION - Lokiviestit, jotka kuvaavat kutakin kutsuttua funktiota (kaksi toisiinsa liittyvää makroa: NS_LOG_FUNCTION, käytetään jäsenfunktioille, ja NS_LOG_FUNCTION_NOARGS, käytetään staattisille funktioille);
  • LOG_LOGIC - lokiviestit, jotka kuvaavat funktion sisällä olevaa loogista kulkua (liittyvä makro: NS_LOG_LOGIC);
  • LOG_ALL - Kirjaa kaiken edellä mainitun (ei liitettyä makroa).
    Jokaiselle tyypille (LOG_TYPE) on myös LOG_LEVEL_TYPE, joka mahdollistaa kaikkien sen yläpuolella olevien tasojen kirjaamisen oman tasonsa lisäksi. (Seurauksena log_error ja log_level_error sekä log_all ja log_level_all ovat toiminnallisesti ekvivalentteja.) Esimerkiksi log_info sallii vain NS_LOG_INFO -makrojen toimittamat viestit, kun taas Log_Level_INFO: n käyttöönotto on myös makrot NS_LOG_DEBUG, NS_LOG_LOG_LOG_LOG_LOG_LOG_LOG_LOG_LOG_LOG_LOG -viestejä.

Tarjoamme myös ehdottoman kirjausmakron, joka näkyy aina kirjaustasosta tai valintakomponentista riippumatta.

  • NS_LOG_UNCOND - Liittyvän viestin ehdoton kirjaaminen (ei liittyvää kirjaustasoa).

Jokaista tasoa voidaan kysyä erikseen tai kumulatiivisesti. Kirjaaminen voidaan määrittää käyttämällä sh-ympäristömuuttujaa NS_LOG tai kirjaamalla lokiin järjestelmäfunktiokutsu. Kuten aiemmin näytettiin, lokijärjestelmässä on Doxygen-dokumentaatio ja nyt on hyvä aika tarkistaa se, jos et ole vielä tehnyt sitä.

Nyt kun olet lukenut dokumentaation hyvin yksityiskohtaisesti, käytetään tätä tietoa saadaksemme mielenkiintoisia tietoja esimerkkiskriptistä scratch/myfirst.ccjonka olet jo koonnut.

5.1.2 Ota kirjaus käyttöön

Käytämme NS_LOG-ympäristömuuttujaa lisäämään lokeja, mutta ensin, jotta saat suuntasi, suorita viimeinen komentosarja kuten teit aiemmin,

$ ./waf --run scratch/myfirst

Sinun pitäisi nähdä tuttu tulos ensimmäisestä ns-3-esimerkkiohjelmasta

$ 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

Osoittautuu, että yllä näkyvät "lähetetyt" ja "vastaanotetut" viestit ovat itse asiassa kirjattuja viestejä UdpEchoClientApplication и UdpEchoServerApplication. Voimme esimerkiksi pyytää asiakassovellusta tulostamaan lisätietoja asettamalla sen lokitason NS_LOG-ympäristömuuttujan kautta.

Tästä eteenpäin aion olettaa, että käytät sh:n kaltaista komentotulkkia, joka käyttää "MUUTTUJA=arvo" -syntaksia. Jos käytät csh-tyyppistä komentotulkkia, sinun on muunnettava esimerkit "setenv-muuttujan arvo" -syntaksiksi, jota nämä kuoret vaativat.

Tällä hetkellä UDP echo -asiakassovellus vastaa seuraavaan koodiriviin scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

Se mahdollistaa lokitason LOG_LEVEL_INFO. Kun ohitamme kirjaustason lipun, otamme itse asiassa käyttöön kyseisen tason ja kaikki alemmat tasot. Tässä tapauksessa olemme ottaneet käyttöön NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN ja NS_LOG_ERROR. Voimme nostaa kirjaustasoa ja saada lisää tietoa ilman komentosarjan muutoksia ja uudelleenkääntämistä asettamalla NS_LOG-ympäristömuuttujan seuraavasti:

$ export NS_LOG=UdpEchoClientApplication=level_all

Joten asetamme shell-muuttujan NS_LOG seuraavaan arvoon,

UdpEchoClientApplication=level_all

Tehtävän vasen puoli on sen lokiin kirjatun komponentin nimi, jonka haluamme määrittää, ja oikealla puolella on lippu, jota haluamme hakea sille. Tässä tapauksessa aiomme ottaa käyttöön kaikki virheenkorjauksen tasot sovelluksessa. Jos suoritat skriptin siten, että NS_LOG on asetettu tällä tavalla, ns-3-lokijärjestelmä hyväksyy muutokset ja sinun pitäisi nähdä seuraava tulos:

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()

Sovelluksen tarjoamat lisävirheenkorjaustiedot ovat nyt NS_LOG_FUNCTION-tasolla. Se näyttää jokaisen funktiokutsun esiintymän komentosarjan suorittamisen aikana. Pääsääntöisesti menetelmäfunktioissa on suositeltavaa käyttää (vähintään)NS_LOG_FUNCTION (this). Käyttää NS_LOG_FUNCTION_NOARGS ()
vain staattisissa toiminnoissa. Huomaa kuitenkin, että ns-3-järjestelmän ei tarvitse tukea mitään lokitoimintoja. Päätös siitä, kuinka paljon tietoa tallennetaan, jätetään yksittäisen mallin kehittäjän tehtäväksi. Kaikusovellusten tapauksessa käytettävissä on suuri määrä lokitulosteita.

Voit nyt tarkastella lokia sovelluksen tekemistä funktiokutsuista. Jos katsot tarkasti, huomaat rivien välissä kaksoispisteen UdpEchoClientApplication ja menetelmän nimi, jossa saatat odottaa näkevän C++-sovellusoperaattorin (: :). Tämä on tahallista.

Tämä ei itse asiassa ole luokan nimi, vaan lokikomponentin nimi. Kun lähdetiedoston ja luokan välillä on vastaavuus, se on yleensä luokan nimi, mutta sinun tulee ymmärtää, että se ei itse asiassa ole luokan nimi, ja kaksoispisteen sijaan on yksi kaksoispiste. Tämä on tapa auttaa sinua erottamaan kirjauspavun nimi luokan nimestä suhteellisen hienovaraisella tavalla.

Joissakin tapauksissa voi kuitenkin olla vaikeaa määrittää, mikä menetelmä todella luo lokiviestin. Jos katsot yllä olevaa tekstiä, saatat ihmetellä, missä rivi "Received 1024 bytes from 10.1.1.2" Voit ratkaista tämän ongelman asettamalla tason prefix_func NS_LOG-ympäristömuuttujaan. Kokeile seuraavaa:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

Huomaa, että lainausmerkit ovat välttämättömiä, koska pystypalkki, jota käytämme edustamaan TAI-toimintoa, on myös Unix-putkiliitin. Jos nyt suoritat komentosarjan, näet, että lokijärjestelmä varmistaa, että jokaisen tietyn lokin sanoman etuliitteenä on komponentin nimi.

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()

Nyt voit nähdä, että kaikki UDP echo -asiakassovelluksesta tulevat viestit tunnistetaan sellaisiksi. viesti"Received 1024 bytes from 10.1.1.2" on nyt selvästi tunnistettu tulevaksi echo-asiakassovelluksesta. Jäljellä olevan viestin on tultava UDP-kaikupalvelinsovelluksesta. Voimme ottaa tämän komponentin käyttöön syöttämällä kaksoispisteillä erotetun luettelon komponenteista NS_LOG-ympäristömuuttujaan.

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

Varoitus: Yllä olevassa esimerkkitekstissä sinun on poistettava rivinvaihtomerkki kaksoispisteen (:) jälkeen. Sitä käytetään asiakirjan muotoiluun. Jos nyt suoritat komentosarjan, näet kaikki asiakas- ja palvelinkaikusovellusten lokiviestit. Voit nähdä, että tämä voi olla erittäin hyödyllistä virheenkorjauksessa.

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()

Joskus on myös hyödyllistä nähdä simulointiaika, jolloin lokiviesti luotiin. Voit tehdä tämän lisäämällä TAI-bitin etuliite_aika:

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

Jälleen sinun on poistettava yllä oleva rivinvaihtomerkki. Jos nyt suoritat komentosarjan, sinun pitäisi nähdä seuraava tulos:

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()

Huomaa, että rakentaja varten UdpEchoServer kutsuttiin simulaation aikana 0 sekuntia. Tämä tapahtuu itse asiassa ennen simulaation alkamista, mutta aika näytetään nollana sekuntina. Sama pätee rakentajan viestiin 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()

Muista, että käsikirjoitus scratch/first.cc käynnisti kaikupalvelinsovelluksen sekuntia ennen simulaation alkamista. Nyt näet sen menetelmän Käynnistä Sovellus palvelinta todella kutsutaan ensimmäisessä sekunnissa. Saatat myös huomata, että echo-asiakasohjelma käynnistyy simulaation toisessa sekunnissa, kuten pyysimme skriptissä.

Voit nyt seurata simulaation etenemistä päivystyksen jälkeen AikatauluTransmit Asiakkaassa, joka kutsuu HandleRead-soittopyynnön Lähetä kaikupalvelinsovelluksessa. Huomaa, että paketin lähettämiseen pisteestä pisteeseen -linkin kautta kulunut aika on 3,69 millisekuntia. Voit nähdä, että kaikupalvelin kirjaa lokiin viestin, että se on vastannut pakettiin, ja sitten kanavaviiveen jälkeen näet, että echo-asiakas vastaanottaa kaikupaketin HandleRead-menetelmällään.

Tässä simulaatiossa paljon tapahtuu huomaamatta. Mutta voit seurata koko prosessia erittäin helposti ottamalla käyttöön kaikki lokikomponentit järjestelmässä. Yritä asettaa NS_LOG-muuttuja seuraavaan arvoon,

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

Yllä oleva tähti on lokikomponentin jokerimerkki. Tämä sisältää kaikki merkinnät kaikissa simulaatiossa käytetyissä komponenteissa. En toista tulostetta tässä (kirjoitushetkellä se tuottaa 1265 riviä yhdelle kaikupaketille), mutta voit ohjata nämä tiedot tiedostoon ja tarkastella sitä suosikkieditorissasi.

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

Käytän henkilökohtaisesti tätä erittäin monisanaista kirjausversiota, kun minulla on ongelma enkä tiedä, missä asiat menivät pieleen. Pystyn seuraamaan koodin suorittamista melko helposti ilman keskeytyskohtien asettamista ja debuggerin koodin läpi astumista. Voin vain muokata tulosta suosikkieditorissani ja etsiä mitä odotan ja nähdä tapahtuvan jotain, mitä en odottanut. Kun minulla on yleinen käsitys siitä, mikä on vialla, hyppään debuggeriin syventyäkseni ongelmaan. Tämän tyyppinen tulos voi olla erityisen hyödyllinen, kun komentosarjasi tekee jotain täysin odottamatonta. Jos käytät vain debuggeria, saatat missata käänteen kokonaan. Rekisteröityminen tekee tällaiset käännökset havaittavissa.

5.1.3 Kirjauksen lisääminen koodiisi

Voit lisätä uusia merkintöjä simulaatioihisi soittamalla lokikomponenttiin useista makroista. Tehdään se käsikirjoituksessa myfirst.cc, joka meillä on "puhdas" -hakemistossa. Muista, että määritimme lokikomponentin tässä skenaariossa:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Tiedät, että voit ottaa käyttöön kaikkien tämän komponentin viestien kirjaamisen asettamalla NS_LOG-ympäristömuuttujan eri tasoille. Mennään eteenpäin ja lisätään joitain merkintöjä käsikirjoitukseen. Makro, jota käytetään tietotason sanomien lisäämiseen lokiin, on NS_LOG_INFO. Lisätään viesti (juuri ennen kuin aloitamme solmujen luomisen), joka kertoo, että komentosarja on "Creating Topology" -vaiheessa. Tämä tehdään seuraavassa koodinpätkässä,
Avaa scratch/myfirst.cc suosikkieditorissasi ja lisää rivi,
NS_LOG_INFO ("Creating Topology");
juuri ennen rivejä,

NodeContainer nodes;
nodes.Create (2);

Käännä nyt skripti käyttämällä WAF, ja tyhjennä NS_LOG-muuttuja poistaaksesi aiemmin käyttöön otetun lokivirran käytöstä:

$ ./waf
$ export NS_LOG=
Теперь, если вы запустите скрипт,
$ ./waf --run scratch/myfirst

Et näe uutta viestiä, koska siihen liittyvää lokikomponenttia (FirstScriptExample) ei ole otettu käyttöön. Nähdäksesi viestisi, sinun on otettava lokikomponentti käyttöön FirstScriptEsimerkki jonka taso on vähintään NS_LOG_INFO. Jos haluat vain nähdä tämän tietyn kirjaustason, voit ottaa sen käyttöön seuraavasti:

$ export NS_LOG=FirstScriptExample=info

Jos suoritat komentosarjan nyt, näet uuden viestin "Creating Topology",

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 Komentoriviargumenttien käyttäminen

5.2.1 Ominaisuuksien oletusarvojen ohittaminen

Toinen tapa muuttaa ns-3-skriptien toimintaa ilman muokkaamista tai rakentamista on käyttää komentoriviargumentteja. Tarjoamme mekanismin komentorivin argumenttien jäsentämiseen ja paikallisten ja globaalien muuttujien automaattiseen asettamiseen tulosten perusteella.

Ensimmäinen vaihe komentoriviargumenttijärjestelmän käytössä on komentorivin jäsentimen ilmoittaminen. Tämä on melko helppo tehdä (pääohjelmassasi), kuten seuraavassa koodissa,

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

Tämä yksinkertainen kaksirivinen katkelma on itse asiassa erittäin hyödyllinen sinänsä. Se avaa oven globaaliin ns-3-muuttuja- ja attribuuttijärjestelmään. Lisätään kaksi riviä koodia pääskriptifunktion alkuun scratch/myfirst.cc. Jatketaan, kokoamme skriptin ja suoritamme sen, kun suoritamme, teemme avunpyynnön seuraavasti:

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

Tämä komento kysyy waf suorita komentosarja scratch/myfirst ja anna sille komentoriviargumentti — Tulostusohje. Lainausmerkit ovat pakollisia osoittamaan, mille ohjelmalle argumentti on tarkoitettu. Komentorivin jäsentäjä havaitsee argumentin — Tulostusohje ja näyttää vastauksen,

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.

Katsotaan nyt vaihtoehtoa -PrintAttributes. Olemme jo maininneet ns-3-attribuuttijärjestelmän tutkiessamme first.cc-skriptiä. Olemme nähneet seuraavat koodirivit,

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

ja he sanoivat sen Datanopeus on itse asiassa attribuutti PointToPointNetDevice. Tarkastellaan attribuutteja komentorivin argumentin jäsentimen avulla PointToPointNetDevice. Ohjelista kertoo, mitä meidän on annettava TypeId. Tämä on sen luokan nimi, johon kiinnostavat attribuutit kuuluvat. Meidän tapauksessamme se tulee olemaan ns3::PointToPointNetDevice. Jatketaan eteenpäin, sisään,

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

Järjestelmä tulostaa kaikki tämän verkkolaitetyypin määritteet. Näet, että luettelon ominaisuuksien joukossa on

--ns3::PointToPointNetDevice::DataRate=[32768bps]:
The default data rate for point to point links

Tämä on oletusarvo, jota järjestelmä käyttää objektia luodessaan PointToPointNetDevice. Ohitamme tämän oletusarvon käyttämällä parametria Ominaisuus в PointToPointHelper korkeampi. Käytetään oletusarvoja point-to-point-laitteille ja -kanaville. Tätä varten poistamme puhelut AsetaDeviceAttribute и SetChannelAttribute ja myfirst.cc, joka meillä on puhtaassa hakemistossa.

Skriptisi pitäisi nyt yksinkertaisesti ilmoittaa PointToPointHelper äläkä suorita alla olevan esimerkin mukaisia ​​asennustoimia,

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

Mene eteenpäin ja luo uusi käsikirjoitus waf (./waff).

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

Jos suoritat skriptin, sinun pitäisi nähdä seuraava tulos:

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()

Muista, että kun viimeksi katsoimme simulointiaikaa, sillä hetkellä, kun kaikupalvelin vastaanotti paketin, se oli 2,00369 sekuntia.

2.00369s UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1

Nyt hän vastaanottaa paketin 2.25732 sekunnissa. Tämä johtuu siitä, että nollasimme PointToPointNetDevicen tiedonsiirtonopeuden viidestä megabitistä sekunnissa oletusarvoon, joka on 32768 bittiä sekunnissa. Jos korvaamme uuden DataRaten komentorivin avulla, voisimme nopeuttaa simulointiamme uudelleen. Teemme tämän seuraavasti ohjeelementin antaman kaavan mukaan:

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

Tämä palauttaa DataRate-attribuutin oletusarvoonsa viisi megabittiä sekunnissa. Oletko yllättynyt tuloksesta? Osoittautuu, että jotta voimme palauttaa skriptin alkuperäisen käyttäytymisen, meidän on myös asetettava kanavan viive vastaamaan valonnopeutta. Voimme pyytää komentorivijärjestelmää tulostamaan kanavan attribuutit, aivan kuten teimme verkkolaitteelle:

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

Huomaamme, että kanavan viive-attribuutti on asetettu seuraavasti:

--ns3::PointToPointChannel::Delay=[0ns]:
Transmission delay through the channel

Voimme sitten asettaa molemmat nämä oletusarvot komentorivijärjestelmän kautta.

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

tässä tapauksessa palautamme ajan, joka meillä oli, kun asetimme nimenomaisesti datanopeuden ja viiveen komentosarjassa:

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()

Huomaa, että palvelin vastaanottaa paketin uudelleen 2,00369 sekunnin kuluttua. Voisimme itse asiassa asettaa minkä tahansa skriptissä käytetyn attribuutin tällä tavalla. Erityisesti voisimme asettaa MaxPackets-attribuutit ei-yhdelle arvolle UdpEchoClient.

Miten käyttäisit sitä? Kokeile sitä. Muista, että sinun on kommentoitava paikka, jossa ohitamme oletusattribuutin arvon ja asetamme eksplisiittisesti MaxPackets käsikirjoituksessa. Sitten sinun on rakennettava käsikirjoitus uudelleen. Voit myös käyttää komentoriviä saadaksesi syntaksiapua uuden oletusattribuutin arvon asettamiseen. Kun ymmärrät tämän, voit hallita komentorivillä näytettävien pakettien määrää. Koska olemme ahkeria ihmisiä, komentorivimme pitäisi näyttää suunnilleen tältä:

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

Tässä vaiheessa herää luonnollinen kysymys, kuinka tietää kaikkien näiden ominaisuuksien olemassaolosta. Jälleen komentorivijärjestelmässä on ohjetoiminto tähän asiaan. Jos pyydämme komentoriviltä apua, meidän pitäisi nähdä:

$ ./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.

Jos valitset "PrintGroups"-argumentin, sinun pitäisi nähdä luettelo kaikista rekisteröidyistä ryhmistä TypeId. Ryhmien nimet ovat yhdenmukaisia ​​lähdehakemistossa olevien moduulien nimien kanssa (tosin isoilla kirjaimilla). Kaiken tiedon tulostaminen kerralla olisi liian suuri, joten käytettävissä on lisäsuodatin tietojen tulostamiseen ryhmittäin. Keskitymme siis jälleen point-to-point-moduuliin:

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

Täältä löydät käytettävissä olevat TypeId-nimet attribuuttihauille, esimerkiksi in
--PrintAttributes = ns3 :: PointToPointChannelkuten yllä näkyy.

Toinen tapa oppia attribuuteista on Doxygen ns-3:n avulla. Sivulla on luettelo kaikista simulaattoriin rekisteröidyistä määritteistä.

5.2.2 Omien komentojesi tallentaminen

Voit myös lisätä omia koukkujasi komentorivijärjestelmän kautta. Tämä tehdään yksinkertaisesti käyttämällä komentorivin jäsennysmenetelmää Lisätä arvoa.
Määritetään tällä ominaisuudella näytettävien pakettien määrä aivan eri tavalla. Lisätään paikallinen muuttuja nimeltä nPaketit funktioksi tärkein. Asetamme sen arvoksi yksi vastaamaan aikaisempaa oletuskäyttäytymistämme. Jotta komentorivin jäsentäjä voi muuttaa tätä arvoa, meidän on kaapattava tämä arvo jäsentimeen. Teemme tämän lisäämällä puhelun Lisätä arvoa. Mene ja muuta käsikirjoitusta scratch/myfirst.cc joten aloittaa seuraavalla koodilla,

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);
...

Vieritä alas komentosarjan kohtaan, jossa asetamme MaxPackets-attribuutin, ja muuta se niin, että se on asetettu nPackets-muuttujaan vakion 1 sijaan, kuten alla on esitetty.

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

Jos nyt suoritat komentosarjan ja annat -PrintHelp-argumentin, sinun pitäisi nähdä uuden käyttäjän argumentti. lueteltu ohjenäytössä. Tulla sisään,

$ ./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

Jos haluat muuttaa lähetettyjen pakettien määrää, voit tehdä sen asettamalla komentoriviargumentin - -nPackets.

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

Nyt sinun pitäisi nyt nähdä

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()

Olet nyt lähettänyt kaksi pakettia. Aika yksinkertaista, eikö?
Näet, että ns-3-käyttäjänä voit käyttää komentorivin argumenttijärjestelmää manipuloidaksesi yleisiä arvoja ja attribuutteja. Jos olet mallin tekijä, voit lisätä uusia attribuutteja objekteihisi, jolloin käyttäjäsi voivat määrittää ne automaattisesti komentorivijärjestelmän kautta. Jos olet skriptien kirjoittaja, voit lisätä uusia muuttujia komentosarjoihisi ja liittää ne saumattomasti komentorivijärjestelmääsi.

5.3 Jäljitysjärjestelmän käyttö

Koko mallinnuksen tarkoitus on tuottaa tulos jatkotutkimuksia varten, ja ns-3-jäljitysjärjestelmä on päämekanismi tähän. Koska ns-3 on C++-ohjelma, voidaan käyttää tavallisia menetelmiä tulosteen tuottamiseen C++-ohjelmasta:

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

Voit jopa käyttää lokimoduulia lisätäksesi hieman rakennetta ratkaisuasi. Tämän lähestymistavan aiheuttamia tunnettuja ongelmia on monia, ja siksi olemme tarjonneet yleisen tapahtumien jäljitysalijärjestelmän näiden ongelmien ratkaisemiseksi.

ns-3-jäljitysjärjestelmän päätavoitteet ovat:

  • Perustehtäviä varten seurantajärjestelmän pitäisi antaa käyttäjän luoda vakiojäljitys suosituille lähteille ja valita objektit, jotka luovat jäljityksen.

  • Keskitason käyttäjien olisi voitava laajentaa jäljitysjärjestelmää muuttaakseen luotua tulostusmuotoa tai lisätäkseen uusia jäljityslähteitä muuttamatta simulaattorin ydintä;

  • Kokeneet käyttäjät voivat muokata simulaattorin ydintä lisätäkseen uusia jäljityslähteitä ja nieluja. ns-3-seurantajärjestelmä on rakennettu riippumattomien seurantalähteiden ja vastaanottimien periaatteille sekä yhtenäiselle mekanismille lähteiden yhdistämiseksi kuluttajiin.

ns-3-jäljitysjärjestelmä on rakennettu riippumattomien jäljityslähteiden ja vastaanottimien periaatteille sekä yhtenäiselle mekanismille lähteiden yhdistämiseksi vastaanottimiin. Jäljityslähteet ovat objekteja, jotka voivat signaloida simulaatiossa tapahtuvia tapahtumia ja tarjota pääsyn kiinnostaviin taustatietoihin. Jäljityslähde voi esimerkiksi ilmoittaa, milloin verkkolaite on vastaanottanut paketin, ja asettaa paketin sisällön kiinnostuneiden jäljitysvastaanottimien saataville.

Jäljityslähteet yksinään ovat hyödyttömiä, ellei niitä ole "yhdistetty" muihin koodin osiin, jotka todella tekevät jotain hyödyllistä nielun tarjoamilla tiedoilla. Jäljittimet ovat tapahtumien ja jäljityslähteiden toimittaman tiedon käyttäjiä. Voit esimerkiksi luoda jäljitysnielun, joka (kun se on yhdistetty edellisen esimerkin jäljityslähteeseen) tulostaa vastaanotetun paketin kiinnostavat osat.

Syy tälle selkeälle erottelulle on antaa käyttäjille mahdollisuus yhdistää uusia nielutyyppejä olemassa oleviin jäljityslähteisiin ilman, että heidän tarvitsee muokata ja kääntää uudelleen simulaattorin ydintä. Joten yllä olevassa esimerkissä käyttäjä voi määrittää uuden jäljitysohjelman komentosarjaansa ja yhdistää sen olemassa olevaan jäljityslähteeseen, joka on määritetty simulaatioytimessä vain muokkaamalla käyttäjän komentosarjaa.

Tässä opetusohjelmassa käymme läpi joitakin ennalta määritettyjä lähteitä ja nieluja ja näytämme, kuinka ne voidaan määrittää käyttäjän vähimmällä vaivalla. Katso ns-3-käsikirjasta tai ohjeet osioista lisätietoa jäljityksen määrittämisestä, mukaan lukien jäljityksen nimitilan laajentaminen ja uusien jäljityslähteiden luominen.

5.3.1 ASCII-seuranta

ns-3 tarjoaa aputoiminnon, joka tarjoaa matalan tason jäljitysjärjestelmän, joka auttaa sinua määrittäessäsi yksinkertaisia ​​pakettijäljitystä. Jos otat tämän ominaisuuden käyttöön, näet tulosteen ASCII-tiedostoina. Niille, jotka tuntevat ns-2-lähdön, tämän tyyppinen jäljitys on samanlainen out.tr, jonka monet skriptit luovat.

Mennään asiaan ja lisätään ASCII-jäljitystuloksia scratch/myfirst.cc-skriptimme. Juuri ennen soittoa Simulator :: Run (), lisää seuraavat koodirivit:
AsciiTraceHelper ascii;

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

Kuten monet muut ns-3-idiomit, tämä koodi käyttää apuobjektia ASCII-jälkien luomiseen. Toinen rivi sisältää kaksi sisäkkäistä menetelmäkutsua. "Sisällä" menetelmä CreateFileStream() käyttää anonyymin objektin idiomia luodakseen tiedostovirtaobjektin pinoon (ilman objektin nimeä) ja välittää sen kutsutulle menetelmälle. Menemme tähän syvemmälle tulevaisuudessa, mutta tässä vaiheessa sinun tarvitsee vain tietää, että olet luomassa objektia, joka edustaa tiedostoa nimeltä myfirst.tr ja siirrä se ns-3:een. Luotamme ns-3:n hoitamaan luodun objektin koko sen elinkaaren, jonka aikana se ratkaisee ongelmia, jotka aiheutuvat vähän tunnetusta (tahallisesta) rajoituksesta, joka liittyy C++ stream -objektikopiokonstruktoreihin.

Ulkopuhelu OtaAsciiAll() käyttöön kertoo avustajalle, että haluat sisällyttää ASCII-seurannan simulaatioosi kaikille point-to-point-laiteyhteyksille ja että haluat (määritettyjen) jäljitysvastaanottimien tallentavan pakettien liiketiedot ASCII-muodossa.

Niille, jotka tuntevat ns-2:n, seurattavat tapahtumat vastaavat tunnettuja jäljityspisteitä, jotka kirjaavat tapahtumat "+", "-", "d" ja "r".
Nyt voit rakentaa skriptin ja suorittaa sen komentoriviltä:

$ ./waf --run scratch/myfirst

Kuten monta kertaa ennenkin, näet useita viestejä Wafista ja sitten "rakennus on valmis" ja joitain viestejä käynnissä olevasta ohjelmasta.

Kun ohjelma suoritetaan, se luo tiedoston nimeltä myfirst.tr. Työn luonteesta johtuen waf, oletusarvoisesti tiedostoa ei luoda paikalliseen hakemistoon, vaan arkiston ylimmän tason hakemistoon. Jos haluat muuttaa polkua, johon jäljet ​​tallennetaan, voit määrittää sen Waf-parametrilla --cwd. Emme ole tehneet tätä, joten katsoaksemme ASCII-jäljitystiedostoa myfirst.tr suosikkieditorissasi, meidän on siirryttävä arkistomme ylätason hakemistoon.

ASCII-jälkien jäsentäminen

Siellä on paljon tietoa melko tiheässä muodossa, mutta ensimmäinen asia, joka sinun tulee huomata, on, että tiedosto koostuu yksittäisistä riveistä. Tämä näkyy selvästi, jos laajennat katseluikkunaa leveämmäksi.

Jokainen tiedoston rivi vastaa jäljitystapahtumaa. Tässä tapauksessa jäljitämme simulaation kussakin point-to-point-verkkolaitteen lähetysjonon tapahtumia. Lähetysjono on jono, jonka läpi jokaisen paketin on kuljettava point-to-point -linkin kautta. Huomaa, että jokainen jäljitystiedoston rivi alkaa yhdellä merkillä (ja sen jälkeen on välilyönti). Tällä symbolilla on seuraava merkitys:

+: laitejonossa tapahtui jonotustoiminto;
-: laitejonossa tapahtui elementin hakutoiminto;
d: paketti pudotettiin, yleensä siksi, että jono oli täynnä;
r: Verkkolaite vastaanotti paketin.

Tarkastellaanpa tarkemmin jäljitystiedoston ensimmäistä riviä. Puran sen osiin (selvyyden vuoksi sisennyksillä) ja rivin numeroon vasemmalla:

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)

Tämän laajennetun jäljitystapahtuman ensimmäinen osa (rivi 0) on operaatio. Meillä on tässä +-symboli, joka vastaa lähetyksen jonotustoimintoa. Toinen osa (rivi 1) on simulointiaika sekunteina ilmaistuna. Saatat muistaa, mitä kysyimme UdpEchoClientApplication aloittaa pakettien lähettämisen kahdessa sekunnissa. Tässä näemme vahvistuksen, että näin todella tapahtuu.

Jäljitysesimerkin seuraava osa (riviltä 2) näyttää, mikä jäljityslähde loi tämän tapahtuman (ilmaisee nimitilan jäljityksen). Voit ajatella jäljityksen nimiavaruutta aivan kuten tiedostojärjestelmän nimiavaruutta. Nimiavaruuden juuri on NodeList. Tämä vastaa ns-3-pääkoodissa hallittua säilöä. Se sisältää kaikki komentosarjassa luodut solmut. Aivan kuten tiedostojärjestelmässä voi olla hakemistoja juuressaan, NodeList meillä voi olla monia solmuja. Joten rivi /NodeList/0 viittaa NodeListin nollasolmuun, jota yleensä ajattelemme "solmuna 0". Jokaisella solmulla on luettelo asennetuista laitteista. Tämä luettelo sijaitsee nimitilan vieressä. Voit nähdä, että tämä jäljitystapahtuma on peräisin Laitelista/0, joka on solmuun asennettu nollalaite.

Seuraava osamerkkijono, $ ns3 :: PointToPointNetDevice, kertoo mikä laite on nollakohdassa: solmun nolla laiteluettelo. Muista, että riviltä 0 löytyvä +-toiminto merkitsi elementin lisäystä laitteen lähetysjonoon. Tämä näkyy "reittipolun" viimeisissä osissa: TxQueue/Enqueue.

Jäljessä olevien muiden osien tulisi olla melko intuitiivisia. Rivit 3-4 osoittavat, että paketti on kapseloitu point-to-point-protokollaan. Rivit 5-7 osoittavat, että paketilla on IP4-version otsikko ja se on peräisin IP-osoitteesta 10.1.1.1 ja tarkoitettu 10.1.1.2. Rivit 8-9 osoittavat, että tällä paketilla on UDP-otsikko ja lopuksi rivi 10 näyttää, että hyötykuorma on odotettu 1024 tavua.

Jäljitystiedoston seuraava rivi osoittaa, että sama paketti vedettiin lähetysjonosta samassa solmussa.

Jäljitystiedoston kolmas rivi osoittaa, että verkkolaite vastaanotti paketin kaikupalvelimen isännässä. Olen toistanut tapahtuman alla.

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)

Huomaa, että jäljitystoiminto on nyt r ja simulointiaikaa on lisätty 2,25732 sekuntiin. Jos noudatit opetusohjelmaa huolellisesti, tämä tarkoittaa, että jätit verkkolaitteiden DataRate- ja Link Delay -arvot oletusarvoihinsa. Tämän aikamuodon pitäisi olla tuttu, kuten näit edellisessä osiossa.

Jäljityslähteen nimiavaruuden merkintää (rivi 2) on muokattu siten, että tämä tapahtuma on peräisin solmusta 1 (/NodeList/1) ja jäljityslähde vastaanottaa paketin (/MacRx). Sinun pitäisi olla melko helppoa seurata paketin liikettä topologian läpi katsomalla tiedoston jäljellä olevia jälkiä.

5.3.2 PCAP Trace

Ns-3 Device Helpers -apuohjelmia voidaan käyttää myös .pcap-muotoisten jäljitystiedostojen luomiseen. Lyhenne pcap (kirjoitetaan yleensä pienillä kirjaimilla) tarkoittaa pakettien sieppausta ja on itse asiassa API, joka sisältää .pcap-tiedostomuodon määrittämisen. Suosituin ohjelma, joka voi lukea ja näyttää tätä muotoa, on Wireshark (aiemmin ns eteerinen). On kuitenkin monia liikenteen jäljitysanalysaattoreita, jotka käyttävät tätä pakettimuotoa. Kannustamme käyttäjiä käyttämään monia käytettävissä olevia työkaluja pcap-jälkien analysoimiseen. Tässä opetusohjelmassa keskitymme pcap-jälkien katseluun tcpdump.

pcap-seuranta otetaan käyttöön yhdellä koodirivillä.

pointToPoint.EnablePcapAll ("myfirst");

Liitä tämä koodirivi juuri lisäämämme ASCII-seurantakoodin jälkeen scratch/myfirst.cc. Huomaa, että välitimme vain merkkijonon "myfirst", emme "myfirst.pcap" tai mitään vastaavaa. Tämä johtuu siitä, että parametri on etuliite, ei koko tiedostonimi. Simulaation aikana avustaja itse asiassa luo jäljitystiedoston jokaiselle point-to-point-laitteelle. Tiedostojen nimet muodostetaan käyttämällä etuliitettä, solmun numeroa, laitenumeroa ja päätettä ".pcap'.

Esimerkkikomentosarjassamme päädymme näkemään tiedostot nimeltä "myfirst-0-0.pcap"Ja"myfirst-1-0.pcap", jotka ovat pcap-jäljitystä solmulle 0-laite 0 ja solmu 1-laitteelle 0. Kun olet lisännyt koodirivin pcap-seurannan käyttöön ottamiseksi, voit ajaa komentosarjan tavalliseen tapaan:

$ ./waf --run scratch/myfirst

Jos katsot jakelusi ylätason hakemistoa, sinun pitäisi nähdä kolme tiedostoa: ASCII-jäljitystiedosto myfirst.tr, joita olemme aiemmin tutkineet, tiedostot myfirst-0-0.pcap и myfirst-1-0.pcap - uudet pcap-tiedostot, jotka olemme juuri luoneet.

Tulosteen lukeminen tcpdumpilla

Toistaiseksi helpoin tapa tarkastella pcap-tiedostoja on käyttää tcpdumpia.

$ 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

Kaatopaikalla myfirst-0-0.pcap (asiakaslaite) näet, että kaikupaketti on lähetetty 2 sekunnin simulaation jälkeen. Jos katsot toista kaatopaikkaa (myfirst-1-0.pcap), näet, että paketti vastaanotetaan 2,257324 sekunnissa. Näet toisessa vedossa, että paketti palautetaan 2.257324 sekunnissa ja lopuksi, että asiakas vastaanotti paketin takaisin ensimmäisessä vedossa 2.514648 sekunnissa.

Lukutulos Wiresharkin avulla

Jos et ole perehtynyt Wireshark, on verkkosivusto, jolta voit ladata ohjelmia ja asiakirjoja: http://www.wireshark.org/. Wireshark on graafinen käyttöliittymä, jota voidaan käyttää näiden jäljitystiedostojen näyttämiseen. Jos sinulla on Wireshark, voit avata minkä tahansa jäljitystiedostoista ja näyttää sisällön ikään kuin olisit kaapannut paketit pakettihaistimella.

Lähde: will.com

Lisää kommentti