Vodič za ns-3 mrežni simulator. Poglavlje 5

Vodič za ns-3 mrežni simulator. Poglavlje 5
poglavlje 1,2
poglavlje 3
poglavlje 4

5 Podešavanje
5.1 Korištenje modula za evidentiranje
5.1.1 Pregled evidentiranja
5.1.2 Omogućite evidentiranje
5.1.3 Dodavanje evidencije vašem kodu
5.2 Korištenje argumenata komandne linije
5.2.1 Nadjačavanje zadanih vrijednosti atributa
5.2.2 Snimanje vlastitih komandi
5.3 Korišćenje sistema praćenja
5.3.1 ASCII praćenje
Parsing ASCII tragova
5.3.2 PCAP Trace

Poglavlje 5

podešavanje

5.1 Korištenje modula za evidentiranje

Već smo ukratko pogledali ns-3 logging modul gledajući skriptu first.cc. U ovom poglavlju ćemo detaljnije pogledati moguće upotrebe podsistema za evidentiranje.

5.1.1 Pregled evidentiranja

Mnogi veliki sistemi podržavaju neku vrstu mogućnosti evidentiranja poruka, a ns-3 nije izuzetak. U nekim slučajevima, samo poruke o grešci se pišu na "operatorsku konzolu" (koja je obično stderr na sistemima baziranim na Unixu). Na drugim sistemima mogu se prikazati poruke upozorenja kao i detaljnije informacije. U nekim slučajevima, alati za evidentiranje se koriste za izlaz poruka za otklanjanje grešaka koje mogu brzo zamutiti izlaz.

SubHRD koji se koristi u ns-3 pretpostavlja da su svi ovi nivoi sadržaja informacija korisni, a mi pružamo selektivan, slojevit pristup evidentiranju poruka. Evidentiranje se može potpuno onemogućiti, omogućiti na bazi po komponenti ili globalno. U tu svrhu koriste se podesivi nivoi informativnog sadržaja. ns-3 modul za evidentiranje pruža relativno jednostavan način za dobijanje korisnih informacija iz vaše simulacije.

Trebali biste shvatiti da pružamo mehanizam opšte namjene - praćenje - za izdvajanje podataka iz vaših modela, što bi trebao biti preferirani izlaz za simulacije (za više informacija o našem sistemu praćenja, pogledajte odjeljak 5.3 vodiča). Evidentiranje bi trebalo da bude poželjna metoda za dobijanje informacija o otklanjanju grešaka, upozorenja, poruka o greškama ili za brzo slanje poruka iz vaših skripti ili modela u bilo kom trenutku.

Trenutno, sistem definiše sedam nivoa (tipova) dnevnik poruka u rastućem redosledu sadržaja informacija.

  • LOG_ERROR - evidentiranje poruka o greškama (povezani makro: NS_LOG_ERROR);
  • LOG_WARN - Zapišite poruke upozorenja (povezani makro: NS_LOG_WARN);
  • LOG_DEBUG - Zabilježite relativno rijetke posebne poruke za otklanjanje grešaka (povezani makro: NS_LOG_DEBUG);
  • LOG_INFO - registracija informativnih poruka o napretku programa (povezani makro: NS_LOG_INFO);
  • LOG_FUNCTION - Zapisuje poruke koje opisuju svaku pozvanu funkciju (dva povezana makroa: NS_LOG_FUNCTION, koristi se za funkcije člana, i NS_LOG_FUNCTION_NOARGS, koristi se za statičke funkcije);
  • LOG_LOGIC - evidentiranje poruka koje opisuju logički tok unutar funkcije (povezani makro: NS_LOG_LOGIC);
  • LOG_ALL - Zapisuje sve gore navedeno (bez pridruženog makroa).
    Za svaki tip (LOG_TYPE) postoji i LOG_LEVEL_TYPE koji, ako se koristi, dozvoljava da se svi nivoi iznad njega bilježe pored vlastitog nivoa. (Kao posljedica toga, LOG_ERROR i LOG_LEVEL_ERROR, i LOG_ALL i LOG_LEVEL_ALL su funkcionalno ekvivalentni.) Na primjer, omogućavanjem LOG_INFO će se dozvoliti samo poruke koje daje makro NS_LOG_INFO, dok će omogućavanje LOG_LEVEL_INFO uključiti i poruke koje obezbjeđuje macros_RN_DELOGBUGNS_RN_DELOGBUGNS_RNS_ERROR.

Također obezbjeđujemo bezuslovni makro za evidentiranje koji se uvijek prikazuje, bez obzira na nivo evidentiranja ili komponentu odabira.

  • NS_LOG_UNCOND - Bezuslovno evidentiranje povezane poruke (bez pridruženog nivoa evidentiranja).

Svaki nivo se može ispitivati ​​pojedinačno ili kumulativno. Zapisivanje se može konfigurirati korištenjem sh varijable okruženja NS_LOG ili evidentiranjem poziva sistemske funkcije. Kao što je ranije prikazano, sistem evidentiranja ima Doxygen dokumentaciju i sada je pravo vrijeme da je pregledate ako već niste.

Sada kada ste detaljno pročitali dokumentaciju, iskoristimo to znanje da dobijemo neke zanimljive informacije iz primjera skripte scratch/myfirst.cckoje ste već sastavili.

5.1.2 Omogućite evidentiranje

Hajde da koristimo varijablu okruženja NS_LOG da pokrenemo još nekih dnevnika, ali prvo, samo da biste se orijentirali, pokrenite posljednju skriptu kao što ste radili ranije,

$ ./waf --run scratch/myfirst

Trebali biste vidjeti poznati izlaz iz prvog primjera programa ns-3

$ 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

Ispostavilo se da su "poslane" i "primljene" poruke koje vidite iznad zapravo zabilježene poruke od UdpEchoClientApplication и UdpEchoServerApplication. Na primjer, možemo zatražiti od klijentske aplikacije da odštampa dodatne informacije postavljanjem nivoa evidentiranja kroz varijablu okruženja NS_LOG.

Od sada ću pretpostaviti da koristite školjku nalik sh koja koristi sintaksu "VARIABLE=value". Ako koristite ljusku nalik csh, onda ćete morati da konvertujete moje primere u sintaksu "setenv varijabilne vrednosti" koju zahtevaju te ljuske.

Trenutno, UDP echo klijentska aplikacija odgovara na sljedeći red koda scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

Omogućava nivo evidentiranja LOG_LEVEL_INFO. Kada prođemo oznaku nivoa evidentiranja, mi zapravo omogućavamo taj nivo i sve niže nivoe. U ovom slučaju, omogućili smo NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN i NS_LOG_ERROR. Možemo povećati nivo evidentiranja i dobiti više informacija, bez promjena skripte i rekompilacije, postavljanjem NS_LOG varijable okruženja na sljedeći način:

$ export NS_LOG=UdpEchoClientApplication=level_all

Tako smo postavili sh shell varijablu NS_LOG na sljedeću vrijednost,

UdpEchoClientApplication=level_all

Lijeva strana dodjele je ime evidentirane komponente koju želimo konfigurirati, a desna je zastavica koju želimo primijeniti za nju. U ovom slučaju ćemo omogućiti sve nivoe otklanjanja grešaka u aplikaciji. Ako pokrenete skriptu sa NS_LOG postavljenim na ovaj način, ns-3 sistem evidentiranja će prihvatiti promjene i trebali biste vidjeti sljedeći izlaz:

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

Dodatne informacije o otklanjanju grešaka koje daje aplikacija sada su na razini NS_LOG_FUNCTION. Pokazuje svaku instancu poziva funkcije tokom izvršavanja skripte. Kao opšte pravilo, u funkcijama metoda poželjno je koristiti (najmanje)NS_LOG_FUNCTION (this)... Koristi NS_LOG_FUNCTION_NOARGS ()
samo u statičkim funkcijama. Međutim, imajte na umu da ns-3 sistem ne mora podržavati bilo kakvu funkciju evidentiranja. Odluka o tome koliko informacija se snima prepušta se individualnom razvijaču modela. U slučaju eho aplikacija, dostupna je velika količina izlaza evidencije.

Sada možete vidjeti dnevnik poziva funkcija koje je obavila aplikacija. Ako pažljivo pogledate, primijetit ćete dvotočku između reda UdpEchoClientApplication i naziv metode, gdje biste mogli očekivati ​​da vidite C++ operator opsega (: :). Ovo je namerno.

Ovo zapravo nije ime klase, već ime komponente za evidentiranje. Kada postoji podudaranje između izvornog fajla i klase, to je obično ime klase, ali treba da shvatite da to zapravo nije ime klase, i da postoji jedna dvotačka umesto dvostruke dvotačke. Ovo je način da vam pomogne da konceptualno odvojite ime bean-a za evidentiranje od naziva klase na relativno suptilan način.

Međutim, u nekim slučajevima može biti teško odrediti koji metod zapravo generira poruku dnevnika. Ako pogledate gornji tekst, možda ćete se pitati gdje je linija "Received 1024 bytes from 10.1.1.2" Ovaj problem možete riješiti postavljanjem nivoa prefix_func na varijablu okruženja NS_LOG. Pokušajte sljedeće:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

Imajte na umu da su navodnici neophodni jer je vertikalna traka koju koristimo da predstavljamo operaciju ILI takođe Unix cevni konektor. Sada ako pokrenete skriptu, vidjet ćete da sistem evidentiranja osigurava da svaka poruka u datom dnevniku ima prefiks imena komponente.

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

Sada možete vidjeti da su sve poruke koje dolaze iz UDP echo klijentske aplikacije identificirane kao takve. Poruka "Received 1024 bytes from 10.1.1.2" sada je jasno identificirano da dolazi iz echo klijentske aplikacije. Preostala poruka mora doći iz aplikacije UDP echo servera. Ovu komponentu možemo omogućiti unošenjem liste komponenti razdvojenih dvotočkama u varijablu okruženja NS_LOG.

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

Upozorenje: U primjeru teksta iznad, morat ćete ukloniti znak novog reda nakon dvotočke (:), koristi se za formatiranje dokumenta. Sada ako pokrenete skriptu, vidjet ćete sve poruke dnevnika iz klijentskih i serverskih eho aplikacija. Možete vidjeti da ovo može biti vrlo korisno prilikom otklanjanja grešaka.

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

Također je ponekad korisno moći vidjeti vrijeme simulacije u kojem je generirana poruka dnevnika. To možete učiniti dodavanjem bita OR prefiks_vrijeme:

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

Opet, morat ćete ukloniti gornji znak novog reda. Ako sada pokrenete skriptu, trebali biste vidjeti sljedeći izlaz:

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

Imajte na umu da je konstruktor za UdpEchoServer je pozvan tokom simulacije 0 sekundi. To se zapravo događa prije početka simulacije, ali vrijeme je prikazano kao nula sekundi. Isto vrijedi i za poruku konstruktora 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()

Podsjetimo da je scenario scratch/first.cc pokrenuo aplikaciju echo servera jednu sekundu prije početka simulacije. Sada možete vidjeti da je metoda StartApplication server je zapravo pozvan u prvoj sekundi. Također možete primijetiti da echo klijent počinje u drugoj sekundi simulacije, kao što smo tražili u skripti.

Sada možete pratiti napredak simulacije na poziv ScheduleTransmit u klijentu koji poziva HandleRead povratni poziv Send u aplikaciji eho servera. Imajte na umu da je proteklo vrijeme za slanje paketa preko veze od tačke do tačke 3,69 milisekundi. Možete vidjeti da echo server evidentira poruku da je odgovorio na paket, a zatim, nakon kašnjenja kanala, vidite da echo klijent prima echo paket u svojoj metodi HandleRead.

U ovoj simulaciji mnogo toga se dešava a da vi to ne primijetite. Ali možete vrlo lako pratiti cijeli proces tako što ćete omogućiti sve komponente za evidentiranje u sistemu. Pokušajte postaviti varijablu NS_LOG na sljedeću vrijednost,

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

Zvjezdica iznad je zamjenski znak za komponentu evidentiranja. Ovo će uključiti sve unose u sve komponente korištene u simulaciji. Ovdje neću reproducirati izlaz (u vrijeme pisanja proizvodi 1265 linija izlaza za jedan eho paket), ali možete preusmjeriti ove informacije u datoteku i pogledati je u svom omiljenom uređivaču.

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

Ja lično koristim ovu izuzetno opširnu verziju logovanja kada imam problem i nemam pojma gdje su stvari pošle po zlu. Mogu vrlo lako pratiti izvršavanje koda bez postavljanja tačaka prekida i prolaska kroz kod u debugeru. Mogu samo urediti izlaz u svom omiljenom uređivaču i potražiti ono što očekujem i vidjeti da se događa nešto što nisam očekivao. Kada dobijem opštu predstavu o tome šta ide po zlu, skačem u program za otklanjanje grešaka da bih detaljnije analizirao problem. Ova vrsta izlaza može biti posebno korisna kada vaša skripta učini nešto potpuno neočekivano. Ako koristite samo program za otklanjanje grešaka, možda ćete potpuno propustiti zaokret. Registracija čini takve okrete uočljivim.

5.1.3 Dodavanje evidencije vašem kodu

Možete dodati nove unose svojim simulacijama pozivanjem komponente dnevnika iz više makroa. Uradimo to u skripti myfirst.cc, koji imamo u "čistom" direktoriju. Podsjetimo da smo definirali komponentu za evidentiranje u ovom scenariju:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Svjesni ste da možete omogućiti evidentiranje svih poruka iz ove komponente tako što ćete postaviti varijablu okruženja NS_LOG na različite nivoe. Hajdemo naprijed i dodajmo neke unose u skriptu. Makro koji se koristi za dodavanje poruka na nivou informacija u dnevnik je NS_LOG_INFO. Hajde da dodamo poruku (neposredno pre nego što počnemo da kreiramo čvorove) koja vam govori da je skripta u fazi "Kreiranja topologije". Ovo se radi u sljedećem isječku koda,
Otvori scratch/myfirst.cc u svom omiljenom uređivaču i dodajte red,
NS_LOG_INFO ("Creating Topology");
neposredno prije redova,

NodeContainer nodes;
nodes.Create (2);

Sada kompajlirajte skriptu koristeći waf, i obrišite varijablu NS_LOG da onemogućite tok evidentiranja koji smo ranije omogućili:

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

Nećete vidjeti novu poruku jer povezana komponenta evidentiranja (FirstScriptExample) nije omogućena. Da biste vidjeli svoju poruku, morate omogućiti komponentu za evidentiranje FirstScriptExample sa nivoom koji nije niži od NS_LOG_INFO. Ako samo želite vidjeti ovaj određeni nivo evidentiranja, možete ga omogućiti ovako,

$ export NS_LOG=FirstScriptExample=info

Ako sada pokrenete skriptu, vidjet ćete novu poruku "Kreiranje topologije",

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 Korištenje argumenata komandne linije

5.2.1 Nadjačavanje zadanih vrijednosti atributa

Drugi način da promijenite ponašanje ns-3 skripti bez uređivanja ili izgradnje je korištenje argumenata komandne linije. Pružamo mehanizam za raščlanjivanje argumenata komandne linije i automatsko postavljanje lokalnih i globalnih varijabli na osnovu rezultata.

Prvi korak u korišćenju sistema argumenata komandne linije je deklarisanje parsera komandne linije. Ovo je prilično lako učiniti (u vašem glavnom programu), kao u sljedećem kodu,

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

Ovaj jednostavan isječak u dva reda je zapravo vrlo koristan sam po sebi. To otvara vrata ns-3 globalnom sistemu varijabli i atributa. Dodajmo dva reda koda na početak glavne funkcije skripte scratch/myfirst.cc. Nastavljamo dalje, kompajliramo skriptu i pokrećemo je, pri pokretanju postavljamo zahtjev za pomoć na sljedeći način,

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

Ova komanda će pitati Waf pokrenuti skriptu scratch/myfirst i proslijedite mu argument komandne linije —PrintHelp. Navodnici su potrebni da naznače za koji program je argument namijenjen. Parser komandne linije će otkriti argument —PrintHelp i prikazaće odgovor,

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.

Pogledajmo sada opciju —PrintAttributes. Već smo spomenuli sistem atributa ns-3 kada smo proučavali first.cc skriptu. Vidjeli smo sljedeće linije koda,

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

i to su rekli DataRate je zapravo atribut PointToPointNetDevice. Koristimo parser argumenata komandne linije za pregled atributa PointToPointNetDevice. Lista pomoći kaže šta moramo pružiti TypeId. Ovo je naziv klase kojoj pripadaju atributi od interesa. U našem slučaju će biti ns3::PointToPointNetDevice. Idemo dalje, uđi,

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

Sistem će ispisati sve atribute ovog tipa mrežnog uređaja. Vidjet ćete da su među atributima na listi,

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

Ovo je zadana vrijednost koju će sistem koristiti prilikom kreiranja objekta PointToPointNetDevice. Ovu zadanu vrijednost ćemo nadjačati pomoću parametra atribut в PointToPointHelper viši. Koristimo zadane vrijednosti za point-to-point uređaje i kanale. Da bismo to učinili, izbrisat ćemo pozive SetDeviceAttribute и SetChannelAttribute из myfirst.cc, koji imamo u čistom direktoriju.

Vaša skripta bi sada trebala jednostavno deklarirati PointToPointHelper i nemojte izvoditi nikakve instalacijske operacije kao što je prikazano u primjeru ispod,

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

Samo naprijed i kreirajte novu skriptu sa Waf (./waff) i vratimo se nazad i uključimo neki unos iz aplikacije UDP echo servera i uključimo vremenski prefiks.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

Ako pokrenete skriptu, trebali biste vidjeti sljedeći izlaz:

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

Podsjetimo da je posljednji put kada smo gledali vrijeme simulacije, u trenutku kada je eho server primio paket, bilo je 2,00369 sekundi.

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

Sada prima paket za 2.25732 sekunde. To je zato što jednostavno resetujemo brzinu podataka PointToPointNetDevice sa pet megabita u sekundi na zadanu vrijednost, koja je 32768 bita u sekundi. Ako bismo zamijenili novi DataRate pomoću komandne linije, mogli bismo ponovo ubrzati našu simulaciju. To ćemo učiniti na sljedeći način, prema formuli koju implicira element pomoći:

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

Ovo će vratiti atribut DataRate na njegovu zadanu vrijednost od pet megabita u sekundi. Jeste li iznenađeni rezultatom? Ispostavilo se da da bismo vratili originalno ponašanje skripte, također moramo podesiti kašnjenje kanala tako da odgovara brzini svjetlosti. Možemo tražiti od sistema komandne linije da ispiše atribute kanala, baš kao što smo uradili za mrežni uređaj:

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

Otkrit ćemo da je atribut kašnjenja kanala postavljen na sljedeći način:

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

Tada možemo, kroz sistem komandne linije, postaviti obje ove zadane vrijednosti.

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

u ovom slučaju vraćamo vrijeme koje smo imali kada smo eksplicitno postavili DataRate i Delay u skriptu:

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

Imajte na umu da server ponovo prima paket nakon 2,00369 sekundi. Na ovaj način bismo zapravo mogli postaviti bilo koji od atributa koji se koriste u skripti. Konkretno, mogli bismo postaviti atribute MaxPackets na vrijednosti koje nisu jedna UdpEchoClient.

Kako biste ga iskoristili? Pokušati. Zapamtite da morate prokomentirati mjesto gdje poništavamo zadanu vrijednost atributa i eksplicitno postavljamo MaxPackets u scenariju. Zatim morate ponovo izgraditi skriptu. Također možete koristiti komandnu liniju da dobijete pomoć u sintaksi za postavljanje nove zadane vrijednosti atributa. Kada ovo shvatite, možete kontrolirati broj paketa koji se prikazuju na komandnoj liniji. Pošto smo mi marljivi ljudi, naša komandna linija bi trebala izgledati otprilike ovako:

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

Prirodno pitanje koje se postavlja u ovom trenutku je kako znati o postojanju svih ovih atributa. Opet, sistem komandne linije ima funkciju pomoći po ovom pitanju. Ako zatražimo pomoć od komandne linije, trebali bismo vidjeti:

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

Ako odaberete argument "PrintGroups", trebali biste vidjeti listu svih registrovanih grupa TypeId. Imena grupa su u skladu s imenima modula u izvornom direktoriju (iako su napisana velikim slovima). Štampanje svih informacija odjednom bi bilo previše obimno, tako da je dostupan dodatni filter za štampanje informacija po grupama. Dakle, ponovo fokusiranje na modul point-to-point:

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

Ovdje možete pronaći dostupna TypeId imena za traženje atributa, na primjer u
--PrintAttributes = ns3 :: PointToPointChannelkao što je prikazano iznad.

Drugi način da naučite o atributima je putem Doxygen ns‑3. Postoji stranica koja navodi sve atribute registrirane u simulatoru.

5.2.2 Snimanje vlastitih komandi

Također možete dodati svoje vlastite kuke preko sistema komandne linije. Ovo se radi vrlo jednostavno pomoću metode parsera komandne linije AddValue.
Koristimo ovu funkciju da odredimo broj paketa koji će biti prikazani na potpuno drugačiji način. Dodajmo lokalnu varijablu pod nazivom nPaketi u funkciju glavni. Postavit ćemo ga na jedan da odgovara našem prethodnom zadanom ponašanju. Da bismo dozvolili parseru komandne linije da promijeni ovu vrijednost, moramo uhvatiti ovu vrijednost u parseru. To radimo dodavanjem poziva AddValue. Idi i promijeni skriptu scratch/myfirst.cc pa da počnemo sa sljedećim kodom,

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

Pomerite se do tačke u skripti gde postavljamo atribut MaxPackets i menjamo ga tako da bude postavljen na varijablu nPackets umesto na konstantu 1, kao što je prikazano ispod.

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

Sada ako pokrenete skriptu i dostavite argument -PrintHelp, trebali biste vidjeti novi argument korisnika. navedeno na ekranu pomoći. uđi,

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

Ako želite promijeniti broj paketa koji se prenose, to možete učiniti postavljanjem argumenta komandne linije - -nPackets.

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

Sada bi trebalo da vidite

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

Sada ste poslali dva paketa. Prilično jednostavno, zar ne?
Možete vidjeti da kao ns-3 korisnik možete koristiti sistem argumenata komandne linije za manipulaciju globalnim vrijednostima i atributima. Ako ste autor modela, možete dodati nove atribute svojim objektima i oni će automatski biti dostupni za konfiguraciju od strane vaših korisnika kroz sistem komandne linije. Ako ste autor skripte, možete dodati nove varijable svojim skriptama i neprimetno ih priključiti u sistem komandne linije.

5.3 Korišćenje sistema praćenja

Čitava svrha modeliranja je da se generiše izlaz za dalje proučavanje, a ns-3 sistem praćenja je glavni mehanizam za to. Pošto je ns-3 C++ program, mogu se koristiti standardna sredstva za generisanje izlaza iz C++ programa:

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

Možete čak koristiti i modul za evidentiranje da dodate malo strukture svom rješenju. Mnogo je poznatih problema uzrokovanih ovim pristupom, i stoga smo obezbijedili opći podsistem praćenja događaja za rješavanje ovih problema.

Glavni ciljevi ns-3 sistema praćenja su:

  • Za osnovne zadatke, sistem praćenja treba da omogući korisniku da generiše standardni trag za popularne izvore i izabere objekte koji generišu trag;

  • Srednji korisnici bi trebali biti u mogućnosti da prošire sistem praćenja kako bi promijenili generirani izlazni format ili ubacili nove izvore praćenja, bez modifikacije jezgra simulatora;

  • Napredni korisnici mogu modificirati jezgro simulatora kako bi dodali nove izvore tragova i ponore. Sistem praćenja ns-3 izgrađen je na principima nezavisnog praćenja izvora i prijemnika, kao i jedinstvenog mehanizma za povezivanje izvora sa potrošačima.

Sistem praćenja ns-3 izgrađen je na principima nezavisnog praćenja izvora i prijemnika, kao i jedinstvenog mehanizma za povezivanje izvora sa prijemnicima. Izvori praćenja su objekti koji mogu signalizirati događaje koji se dešavaju u simulaciji i omogućiti pristup osnovnim podacima od interesa. Na primjer, izvor praćenja može naznačiti kada je mrežni uređaj primio paket i učiniti sadržaj paketa dostupnim zainteresiranim primaocima praćenja.

Izvori praćenja sami po sebi su beskorisni osim ako nisu "upareni" s drugim dijelovima koda koji zapravo rade nešto korisno s informacijama koje pruža sink. Tragači su potrošači događaja i podataka dobijenih od izvora praćenja. Na primjer, možete kreirati trace sink koji će (kada je povezan s izvorom praćenja iz prethodnog primjera) ispisati dijelove od interesa u primljenom paketu.

Obrazloženje za ovo eksplicitno razdvajanje je omogućiti korisnicima da povežu nove tipove ponora na postojeće izvore praćenja bez potrebe za uređivanjem i ponovnim kompajliranjem jezgre simulatora. Dakle, u gornjem primjeru, korisnik može definirati novi tragač u svojoj skripti i povezati ga s postojećim izvorom praćenja definiranim u jezgri simulacije samo uređivanjem korisničke skripte.

U ovom vodiču ćemo proći kroz neke od unaprijed definiranih izvora i ponora i pokazati kako se mogu konfigurirati uz najmanji napor korisnika. Pogledajte ns-3 priručnik ili odjeljke s uputama za informacije o naprednoj konfiguraciji praćenja, uključujući proširenje imenskog prostora praćenja i kreiranje novih izvora praćenja.

5.3.1 ASCII praćenje

ns-3 pruža pomoćnu funkcionalnost koja pruža sistem praćenja niskog nivoa koji će vam pomoći sa detaljima prilikom postavljanja jednostavnih praćenja paketa. Ako omogućite ovu funkciju, vidjet ćete izlaz u ASCII datotekama. Za one koji su upoznati sa ns-2 izlazom, ovaj tip traga je sličan out.tr, koju generiraju mnoge skripte.

Hajdemo na posao i dodati neke rezultate ASCII praćenja našoj scratch/myfirst.cc skripti. Neposredno prije poziva Simulator :: Run (), dodajte sljedeće linije koda:
AsciiTraceHelper ascii;

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

Kao i mnogi drugi ns-3 idiomi, ovaj kod koristi pomoćni objekat za kreiranje ASCII tragova. Drugi red sadrži dva ugniježđena poziva metoda. Metoda "iznutra". CreateFileStream() koristi idiom anonimnog objekta za kreiranje objekta toka datoteka na steku (bez imena objekta) i prosljeđuje ga pozvanoj metodi. Ići ćemo dublje u ovo u budućnosti, ali sve što trebate znati u ovom trenutku je da kreirate objekat koji predstavlja datoteku pod nazivom myfirst.tr i prebacite ga na ns-3. Povjeravamo ns-3 da se brine o kreiranom objektu tokom cijelog njegovog životnog vijeka, tokom kojeg rješava probleme uzrokovane malo poznatim (namjernim) ograničenjem povezanim sa C++ stream konstruktorima kopiranja objekata.

Eksterni poziv EnableAsciiAll() govori pomoćniku da želite da uključite ASCII praćenje u svoju simulaciju za sve veze uređaja od tačke do tačke i da želite da (specificirani) prijemnici praćenja snimaju informacije o kretanju paketa u ASCII formatu.

Za one koji su upoznati sa ns-2, praćeni događaji su ekvivalentni poznatim tačkama praćenja koje evidentiraju događaje "+", "-", "d" i "r".
Sada možete napraviti skriptu i pokrenuti je iz komandne linije:

$ ./waf --run scratch/myfirst

Kao i mnogo puta ranije, vidjet ćete nekoliko poruka od Waf-a, a zatim "'building' finished successfully" sa nekim porukama iz pokrenutog programa.

Prilikom pokretanja, program će kreirati datoteku pod nazivom myfirst.tr. Zbog prirode posla Waf, po defaultu datoteka nije kreirana u lokalnom direktoriju, već u direktoriju najviše razine spremišta. Ako želite promijeniti putanju na kojoj se pohranjuju tragovi, tada možete koristiti parametar Waf da to odredite --cwd. Nismo ovo uradili, tako da da pogledamo ASCII datoteku praćenja myfirst.tr u vašem omiljenom uređivaču, moraćemo da odemo do direktorijuma najvišeg nivoa našeg spremišta.

Parsing ASCII tragova

Tamo ima puno informacija u prilično gustom obliku, ali prva stvar koju trebate primijetiti je da se datoteka sastoji od pojedinačnih redova. Ovo će postati jasno vidljivo ako proširite prozor za gledanje.

Svaki red u datoteci odgovara događaju praćenja. U ovom slučaju pratimo događaje u redu prijenosa koji su prisutni u svakom mrežnom uređaju point-to-point u simulaciji. Red prijenosa je red kroz koji svaki paket mora proći za vezu od točke do točke. Imajte na umu da svaki red u datoteci praćenja počinje jednim znakom (i ima razmak iza njega). Ovaj simbol će imati sljedeće značenje:

+: operacija čekanja se dogodila na redu čekanja uređaja;
-: operacija preuzimanja elementa dogodila se u redu uređaja;
d: paket je odbačen, obično zato što je red bio pun;
r: Mrežni uređaj je primio paket.

Pogledajmo bliže prvi red u datoteci praćenja. Podijelit ću ga na dijelove (sa udubljenjima radi jasnoće) i brojem reda na lijevoj strani:

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)

Prvi dio ovog proširenog događaja praćenja (red 0) je operacija. Ovdje imamo simbol +, koji odgovara operaciji čekanja za prijenos. Drugi dio (red 1) je vrijeme simulacije, izraženo u sekundama. Možda se sećate šta smo pitali UdpEchoClientApplication početi slati pakete za dvije sekunde. Ovdje vidimo potvrdu da se to zaista dešava.

Sljedeći odjeljak primjera praćenja (iz reda 2) pokazuje koji je izvor praćenja generirao ovaj događaj (ukazujući na trag prostora imena). Možete razmišljati o imenskom prostoru praćenja slično kao o imenskom prostoru sistema datoteka. Koren imenskog prostora je Lista čvorova. Ovo odgovara kontejneru kojim se upravlja u glavnom ns-3 kodu. Sadrži sve čvorove koji su kreirani u skripti. Baš kao što sistem datoteka može imati direktorije u svom korijenu, Lista čvorova možemo imati mnogo čvorova. Dakle, linija /NodeList/0 se odnosi na nulti čvor u listi NodeList, koji obično smatramo "čvorom 0". Svaki čvor ima listu uređaja koji su instalirani. Ova lista se nalazi sljedeće u imenskom prostoru. Možete vidjeti da ovaj događaj praćenja dolazi iz DeviceList/0, što je nulti uređaj instaliran u čvoru.

Sljedeći podniz, $ ns3 :: PointToPointNetDevice, govori koji je uređaj na poziciji nula: lista uređaja nultog čvora. Podsjetimo da je operacija + pronađena u redu 0 značila da je element dodan u red za prijenos uređaja. To se odražava u posljednjim segmentima "puta staze": TxQueue/Enqueue.

Preostale sekcije u praćenju treba da budu prilično intuitivni. Redovi 3-4 označavaju da je paket enkapsuliran u protokol od tačke do tačke. Redovi 5-7 pokazuju da paket ima zaglavlje IP4 verzije i da potiče iz IP adrese 10.1.1.1 i namijenjen je za 10.1.1.2. Redovi 8-9 pokazuju da ovaj paket ima UDP zaglavlje i konačno red 10 pokazuje da je korisni teret očekivanih 1024 bajta.

Sljedeći red u datoteci praćenja pokazuje da je isti paket izvučen iz reda prijenosa na istom čvoru.

Treći red u datoteci praćenja pokazuje da je paket primio mrežni uređaj na hostu eho servera. Reproducirao sam događaj u nastavku.

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)

Imajte na umu da je operacija praćenja sada r i da je vrijeme simulacije povećano na 2,25732 sekunde. Ako ste pažljivo pratili tutorijal, to znači da ste ostavili DataRate i Link Delay mrežnih uređaja na njihovim zadanim vrijednostima. Ovo vrijeme bi trebalo biti poznato, kao što ste vidjeli u prethodnom dijelu.

Unos prostora imena izvora praćenja (red 2) je modificiran da odražava da ovaj događaj potiče iz čvora 1 (/Lista čvorova/1) i paket je primljen od strane izvora praćenja (/MacRx). Trebalo bi vam biti prilično lako pratiti kretanje paketa kroz topologiju gledajući preostale tragove u datoteci.

5.3.2 PCAP Trace

ns-3 Device Helpers se takođe mogu koristiti za kreiranje datoteka praćenja u .pcap formatu. Akronim pcap (obično se piše malim slovima) označava hvatanje paketa i zapravo je API koji uključuje definiranje .pcap formata datoteke. Najpopularniji program koji može čitati i prikazati ovaj format je Wireshark (prethodno zvao Ethereal). Međutim, postoji mnogo analizatora tragova saobraćaja koji koriste ovaj format paketa. Podstičemo korisnike da koriste mnoge dostupne alate za analizu pcap tragova. U ovom vodiču ćemo se fokusirati na gledanje pcap tragova pomoću tcpdump.

Omogućavanje praćenja pcap vrši se sa jednom linijom koda.

pointToPoint.EnablePcapAll ("myfirst");

Zalijepite ovu liniju koda iza ASCII koda za praćenje koji smo upravo dodali scratch/myfirst.cc. Imajte na umu da smo proslijedili samo string "myfirst", ne "myfirst.pcap" ili bilo šta slično. To je zato što je parametar prefiks, a ne puno ime datoteke. Tokom simulacije, pomoćnik će zapravo kreirati datoteku praćenja za svaki uređaj od tačke do tačke. Imena datoteka će se konstruirati koristeći prefiks, broj čvora, broj uređaja i sufiks ".pcap".

Za naš primjer skripte, na kraju ćemo vidjeti datoteke pod nazivom "myfirst-0-0.pcap"I"myfirst-1-0.pcap", koji su pcap tragovi za čvor 0-uređaj 0 i čvor 1-uređaj 0 respektivno. Nakon što dodate liniju koda da omogućite praćenje pcap, možete pokrenuti skriptu na uobičajeni način:

$ ./waf --run scratch/myfirst

Ako pogledate u direktorij najvišeg nivoa vaše distribucije, trebali biste vidjeti tri datoteke: ASCII datoteku praćenja myfirst.tr, koje smo prethodno proučavali, datoteke myfirst-0-0.pcap и myfirst-1-0.pcap - nove pcap datoteke koje smo upravo generirali.

Čitanje izlaza pomoću tcpdump

Za sada, najlakši način za pregled pcap datoteka je korištenje 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

Na smetlištu myfirst-0-0.pcap (klijentski uređaj) možete vidjeti da se eho paket šalje nakon 2 sekunde simulacije. Ako pogledate drugu deponiju (myfirst-1-0.pcap), videćete da je paket primljen na 2,257324 sekundi. U drugom dumpu ćete vidjeti da je paket vraćen na 2.257324 sekundi, i konačno da je paket primio nazad od strane klijenta u prvom dumpu u 2.514648 sekundi.

Očitavanje izlaza sa Wiresharkom

Ako niste upoznati sa Wireshark, postoji web stranica sa koje možete preuzeti programe i dokumentaciju: http://www.wireshark.org/. Wireshark je GUI koji se može koristiti za prikaz ovih datoteka praćenja. Ako imate Wireshark, možete otvoriti bilo koju datoteku praćenja i prikazati sadržaj kao da ste uhvatili pakete pomoću njuškala za pakete.

izvor: www.habr.com

Dodajte komentar