Priručnik za simulator mreže ns-3. Poglavlje 5

Priručnik za simulator mreže ns-3. Poglavlje 5
glave 1,2
glava 3
poglavlje 4

5 Konfiguracija
5.1 Korištenje modula za zapisivanje
5.1.1 Pregled zapisivanja
5.1.2 Odluke o zapisivanju
5.1.3 Dodavanje zapisivanja u vaš kod
5.2 Korištenje argumenata iz komandne linije
5.2.1 Prepisivanje osnovnih vrijednosti atributa
5.2.2 Hvatanje vlastitih komandi
5.3 Korištenje sustava praćenja
5.3.1 ASCII Praćenje
Parsiranj ASCII praćenja
5.3.2 PCAP praćenje

Poglavlje 5

Podešavanje

5.1 Korištenje modula za zapisivanje

Već smo ukratko razmotrili modul zapisivanja ns‑3 pregledavajući skriptu first.cc. U ovom poglavlju bliže ćemo pogledati moguće načine korištenja podsustava zapisivanja.

5.1.1 Pregled zapisivanja

Mnogi veliki sustavi podržavaju neku vrstu sredstva za registraciju poruka, a ns‑3 nije iznimka. U nekim slučajevima, u 'operaterskoj konzoli' (koja obično predstavlja stderr u Unix temeljenim sustavima) bilježe se samo poruke o pogreškama. U drugim sustavima mogu se ispisivati upozorenja, kao i detaljnije informacije. U nekim slučajevima, alati za zapisivanje koriste se za ispisivanje poruka za ispravljanje grešaka, koje mogu brzo 'zamagliti' ispis.

Pristup koji se koristi u ns‑3 podrazumijeva da su svi ti nivoi informativnosti korisni, i pružamo selektivni, višerazinski pristup registraciji poruka. Zapisivanje može biti potpuno isključeno, uključeno za pojedine komponente ili globalno. Za to su zaduženi prilagodljivi nivoi informativnosti. Modul zapisivanja ns‑3 pruža relativno jednostavan način za dobivanje korisnih informacija iz vaše simulacije.

Trebate razumjeti da pružamo mehanizam opće namjene — praćenje — za vađenje podataka iz vaših modela, koji bi trebao biti preferirani način ispisa prilikom modeliranja (za više informacija o našem sustavu praćenja pogledajte odjeljak tutorijala 5.3). Zapisivanje bi trebalo biti preferirani način za dobivanje informacija za ispravljanje grešaka, upozorenja, poruka o pogreškama ili za brzi ispis poruka iz vaših scenarija ili modela u bilo kojem trenutku.

Trenutno je u sustavu definirano sedam nivoa (tipova) poruka za zapisivanje po rastućoj informativnosti.

  • LOG_ERROR — registracija poruka o greškama (povezani makro: NS_LOG_ERROR);
  • LOG_WARN — registracija upozoravajućih poruka (povezani makro: NS_LOG_WARN);
  • LOG_DEBUG — registracija relativno rijetkih posebnih poruka za debagiranje (povezani makro: NS_LOG_DEBUG);
  • LOG_INFO — registracija informativnih poruka o napretku programa (povezani makro: NS_LOG_INFO);
  • LOG_FUNCTION — registracija poruka koje opisuju svaku pozvanu funkciju (dva povezana makra: NS_LOG_FUNCTION, korišten za član funkcije, i NS_LOG_FUNCTION_NOARGS, korišten za statične funkcije);
  • LOG_LOGIC — registracija poruka koje opisuju logički tok unutar funkcije (povezani makro: NS_LOG_LOGIC);
  • LOG_ALL — registracija svega navedenog iznad (nema povezanog makra).
    Za svaku vrstu (LOG_TYPE) također postoji tip LOG_LEVEL_TYPE, koji, ako se koristi, omogućuje registraciju pored vlastitog nivoa svih nivoa iznad njega. (Kao posljedica, LOG_ERROR i LOG_LEVEL_ERROR, kao i LOG_ALL i LOG_LEVEL_ALL funkcionalno su ekvivalentni.) Na primjer, uključivanje LOG_INFO omogućava samo poruke koje pruža makro NS_LOG_INFO, dok će uključivanje LOG_LEVEL_INFO također uključiti poruke koje pružaju makroi NS_LOG_DEBUG, NS_LOG_WARN i NS_LOG_ERROR.

Također nudimo makro bezuslovnog logiranja, koji se uvijek prikazuje, bez obzira na nivo logiranja ili komponentu izabranog.

  • NS_LOG_UNCOND — bezuslovna registracija povezane poruke (bez povezanog nivoa logiranja).

Svaki nivo može biti tražen pojedinačno ili kumulativno. Logiranje se može podesiti pomoću varijable okruženja sh-NS_LOG ili pozivom funkcije sistema za registraciju. Kao što je ranije prikazano, sistem za logiranje ima Doxygen dokumentaciju i sada je pravo vreme da je pregledate, ako to već niste učinili.

Sada kada ste detaljno pročitali dokumentaciju, iskoristimo ova znanja da izvučemo zanimljive informacije iz primjera skripte scratch/myfirst.cc, koju ste već kompajlirali.

5.1.2 Odluke o zapisivanju

Hajde da koristimo promenjivu okruženja NS_LOG da pokrenemo još nekoliko logova, ali najpre, samo da se orijentiramo, pokrenite poslednji skript kao što ste ranije radili,

$ ./waf --run scratch/myfirst

Trebali biste vidjeti već poznat izlaz prve primjerne ns-3 programa

$ Waf: Ulazim u direktorij `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
Waf: Napuštam direktorij `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build' 'build'
završeno uspješno (0.413s)
Poslano 1024 bajta na 10.1.1.2
Primljeno 1024 bajta s 10.1.1.1
Primljeno 1024 bajta s 10.1.1.2

Čini se da su «poslane» i «primljene» poruke koje vidite iznad, zapravo registrirane poruke od UdpEchoClientApplication i UdpEchoServerApplication. Na primjer, možemo zatražiti od klijentske aplikacije da ispiše dodatne informacije postavljanjem razine evidencije putem varijable okruženja NS_LOG.

Od ovog trenutka pretpostavit ću da koristite sh-sličnu ljusku koja koristi sintaksu «VARIABLE = value». Ako koristite csh-sličnu ljusku, tada ćete morati pretvoriti moje primjere u sintaksu «setenv varname value» koju zahtijevaju te ljuske.

Trenutno, UDP echo klijent aplikacija odgovara na sljedeći redak koda u scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

Ona aktivira razinu evidencije LOG_LEVEL_INFO. Kada postavimo zastavicu razine evidencije, zapravo uključujemo tu razinu i sve niže razine. U ovom slučaju uključili smo NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN i NS_LOG_ERROR. Možemo povećati razinu evidencije i dobiti više informacija, bez izmjena skripte i ponovne kompilacije, postavljanjem varijable okruženja NS_LOG na sljedeći način:

$ export NS_LOG=UdpEchoClientApplication=level_all

Tako postavljamo sljedeću vrijednost za varijablu NS_LOG u sh-ljusci,

UdpEchoClientApplication=level_all

Lijeva strana dodijeljivanja – to je ime komponenta za inženjering evidencija koje želimo konfigurirati, a desna strana – to je zastava koju želimo primijeniti. U ovom slučaju odlučili smo uključiti sve razine dijagnostike u aplikaciji. Ako pokrenete skriptu s ovako postavljenim NS_LOG, sustav evidencije ns-3 prihvatit će promjene i trebali biste vidjeti sljedeći ishod:

Waf: Ulazim u direktorij `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
Waf: Napuštam direktorij `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
'build' završeno uspješno (0.404s)
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
Poslano 1024 bajta na 10.1.1.2
Primljeno 1024 bajta s 10.1.1.1
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
Primljeno 1024 bajta s 10.1.1.2
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()

Dodatne informacije za ispravljanje pogrešaka koje pruža aplikacija sada odgovaraju razini NS_LOG_FUNCTION. Prikazuje svaki slučaj poziva funkcija tijekom izvođenja skripte. Općenito je preporučljivo koristiti (barem)NS_LOG_FUNCTION (this). Koristite NS_LOG_FUNCTION_NOARGS ()
samo u statičkim funkcijama. Ipak, imajte na umu da u sustavu ns‑3 ne postoji zahtjev za održavanje bilo kakve funkcionalnosti logiranja. Odluka koliko informacija treba zabilježiti prepušta se individualno developeru modela. U slučaju echo aplikacija dostupna su brojna izlazna logiranja.

Sada možete pregledati zapis poziva funkcija koje je aplikacija obavila. Ako pažljivo pogledate, primijetit ćete dvotočku između retka UdpEchoClientApplication i imena metode, na mjestu gdje biste možda očekivali vidjeti C++ operator opsega (::). Ovo je učinjeno namjerno.

Zapravo, to nije ime klase, već ime komponente za logiranje. Kada postoji odgovornost između izvorne datoteke i klase, obično je to ime klase, ali trebate razumjeti da to zapravo nije ime klase, i da je tu jedna dvotočka umjesto dvostruke dvotočke. To je način da vam relativno suptilno pomogne konceptualno odvojiti ime komponente za logiranje od imena klase.

Ipak, u nekim slučajevima teško je odrediti koja metoda zapravo generira poruku loga. Ako pogledate tekst iznad, postavit ćete pitanje otkuda dolazi rečenica "Received 1024 bytes from 10.1.1.2". Ovaj problem možete riješiti postavljanjem razine prefix_func u varijablu okruženja NS_LOG. Pokušajte učiniti sljedeće,

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

Imajte na umu da su navodne oznake potrebne jer je vertikalna crta koju koristimo za označavanje operacije ILI također separatore cjevovoda u Unixu. Sada, ako pokrenete skriptu, vidjet ćete da sustav logiranja jamči da svaka poruka iz danog loga ima prefiks s imenom komponente.

Waf: Ulazak u direktorij `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'\nWaf: Izlazak iz direktorija `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'\n'build' završeno uspješno (0.417s)\nUdpEchoClientApplication:UdpEchoClient()\nUdpEchoClientApplication:SetDataSize(1024)\nUdpEchoClientApplication:StartApplication()\nUdpEchoClientApplication:ScheduleTransmit()\nUdpEchoClientApplication:Send()\nUdpEchoClientApplication:Send(): Poslano 1024 bajta na 10.1.1.2\nPrimljeno 1024 bajta s 10.1.1.1\nUdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)\nUdpEchoClientApplication:HandleRead(): Primljeno 1024 bajta s 10.1.1.2\nUdpEchoClientApplication:StopApplication()\nUdpEchoClientApplication:DoDispose()\nUdpEchoClientApplication:~UdpEchoClient()

Sada možete vidjeti da su sve poruke koje dolaze od UDP echo klijentske aplikacije identificirane kao takve. Poruka „Received 1024 bytes from 10.1.1.2“ sada je jasno definirana kao dolazeća od echo klijentske aplikacije. Ostatak poruke trebao bi dolaziti iz UDP echo server aplikacije. Možemo uključiti ovu komponentu unoseći popis komponenti odvojene dvotočkom u varijabli okruženja NS_LOG.

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

Upozorenje: U gornjem primjeru teksta trebate ukloniti znak novog reda nakon dvotočke (:), koji je korišten za formatiranje dokumenta. Sada, ako pokrenete skriptu, vidjet ćete sve poruke dnevnika klijent aplikacije i server aplikacije za echo. Možda ćete primijetiti da to može biti vrlo korisno prilikom otklanjanja pogrešaka.

Waf: Ulazak u direktorij `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'\nWaf: Izlazak iz direktorija `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'\n'build' završeno uspješno (0.406s)\nUdpEchoServerApplication:UdpEchoServer()\nUdpEchoClientApplication:UdpEchoClient()\nUdpEchoClientApplication:SetDataSize(1024)\nUdpEchoServerApplication:StartApplication()\nUdpEchoClientApplication:StartApplication()\nUdpEchoClientApplication:ScheduleTransmit()\nUdpEchoClientApplication:Send()\nUdpEchoClientApplication:Send(): Poslano 1024 bajta na 10.1.1.2\nUdpEchoServerApplication:HandleRead(): Primljeno 1024 bajta s 10.1.1.1\nUdpEchoServerApplication:HandleRead(): Eho paketa\nUdpEchoClientApplication:HandleRead(0x624920, 0x625160)\nUdpEchoClientApplication:HandleRead(): Primljeno 1024 bajta s 10.1.1.2\nUdpEchoServerApplication:StopApplication()\nUdpEchoClientApplication:StopApplication()\nUdpEchoClientApplication:DoDispose()\nUdpEchoServerApplication:DoDispose()\nUdpEchoClientApplication:~UdpEchoClient()\nUdpEchoServerApplication:~UdpEchoServer()

Također je ponekad korisno imati mogućnost vidjeti vrijeme simulacije u kojem je poruka dnevnika stvorena. To možete učiniti dodavanjem po ILI bita prefix_time:

$ 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 ishod:

Waf: Ulaz u direktorij `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'\nWaf: Izlazak iz direktorija `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'\n'build' završeno uspješno (0.418s)\n0s UdpEchoServerApplication:UdpEchoServer()\n0s UdpEchoClientApplication:UdpEchoClient()\n0s UdpEchoClientApplication:SetDataSize(1024)\n1s UdpEchoServerApplication:StartApplication()\n2s UdpEchoClientApplication:StartApplication()\n2s UdpEchoClientApplication:ScheduleTransmit()\n2s UdpEchoClientApplication:Send()\n2s UdpEchoClientApplication:Send(): Poslano 1024 bajta na 10.1.1.2\n2.00369s UdpEchoServerApplication:HandleRead(): Primljeno 1024 bajta od 10.1.1.1\n2.00369s UdpEchoServerApplication:HandleRead(): Eho paketa\n2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)\n2.00737s UdpEchoClientApplication:HandleRead(): Primljeno 1024 bajta od 10.1.1.2\n10s UdpEchoServerApplication:StopApplication()\n10s UdpEchoClientApplication:StopApplication()\nUdpEchoClientApplication:DoDispose()\nUdpEchoServerApplication:DoDispose()\nUdpEchoClientApplication:~UdpEchoClient()\nUdpEchoServerApplication:~UdpEchoServer()

Napomena: konstruktor za UdpEchoServer pozvan je tokom simulacije od 0 sekundi. To se zapravo događa prije početka simulacije, ali se to vreme prikazuje kao nula sekundi. Isto važi i za poruku konstruktor UdpEchoClient.

Waf: Ulaz u direktorij `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'\nWaf: Izlazak iz direktorija `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'\n'build' završeno uspješno (0.418s)\n0s UdpEchoServerApplication:UdpEchoServer()\n0s UdpEchoClientApplication:UdpEchoClient()\n0s UdpEchoClientApplication:SetDataSize(1024)\n1s UdpEchoServerApplication:StartApplication()\n2s UdpEchoClientApplication:StartApplication()\n2s UdpEchoClientApplication:ScheduleTransmit()\n2s UdpEchoClientApplication:Send()\n2s UdpEchoClientApplication:Send(): Poslano 1024 bajta na 10.1.1.2\n2.00369s UdpEchoServerApplication:HandleRead(): Primljeno 1024 bajta od 10.1.1.1\n2.00369s UdpEchoServerApplication:HandleRead(): Eho paketa\n2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)\n2.00737s UdpEchoClientApplication:HandleRead(): Primljeno 1024 bajta od 10.1.1.2\n10s UdpEchoServerApplication:StopApplication()\n10s UdpEchoClientApplication:StopApplication()\nUdpEchoClientApplication:DoDispose()\nUdpEchoServerApplication:DoDispose()\nUdpEchoClientApplication:~UdpEchoClient()\nUdpEchoServerApplication:~UdpEchoServer()

Podsećamo da je skripta scratch\/first.cc pokrenula aplikaciju eho servera jednu sekundu pre početka simulacije. Sada možete videti da se metoda StartApplication servera zapravo poziva u prvoj sekundi. Takođe možete primetiti da se eho klijent pokreće u drugoj sekundi simulacije, kako smo to tražili u skripti.

Sada možete pratiti tok simulacije pozivanjem ScheduleTransmit u klijentu, koji poziva Send povratni poziv HandleRead u aplikaciji eho servera. Obratite pažnju da je vreme potrebno za slanje paketa preko dvopoint veze 3,69 milisekundi. Vidljivo je da eho server beleži poruku da se odazvao na paket, a zatim, nakon kašnjenja kanala, možete videti da eho klijent prima eho paket u svojoj metodi HandleRead.

U ovoj simulaciji se mnogo toga događa neprimetno za vas. Ali možete vrlo lako pratiti ceo proces uključivanjem svih komponenti logovanja u sistemu. Pokušajte postaviti varijablu NS_LOG na sledeću vrednost,

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

Zvezdica iznad je zamenski simbol komponente logovanja. To će uključiti sve zapise u svim komponentama koje se koriste u simulaciji. Neću ponavljati izlaz ovde (u vreme pisanja članka generiše 1265 linija izlaza za jedan eho paket), ali možete preusmeriti ove informacije u datoteku i pregledati je u vašem omiljenom uređivaču,

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

Osobno koristim ovu izuzetno opširnu verziju vođenja dnevnika kada se suočim s problemom i nemam pojma gdje je nešto pošlo po zlu. Mogu relativno lako pratiti izvršenje koda bez postavljanja prekida i korak po korak u debuggeru. Jednostavno mogu urediti izlaz u svom omiljenom uređivaču i tražiti ono što očekujem, a zatim vidjeti što se događa što nisam očekivao. Kada imam opću ideju što ne ide, prelazim na debugger za detaljno ispitivanje problema. Ovaj tip izlaza može biti posebno koristan kada vaš skript radi nešto potpuno neočekivano. Ako koristite samo debugger, možete potpuno propustiti neočekivani obrat. Vođenje dnevnika čini takve obrate uočljivima.

5.1.3 Dodavanje zapisivanja u vaš kod

Možete dodati nove unose u svoje simulacije pozivajući komponentu log iz nekoliko makrosa. Učinimo to u skripti myfirst.cc, koju imamo u "čistoj" direktoriji. Podsjećamo, definirali smo u ovoj skripti komponentu vođenja dnevnika:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Znate da možete uključiti vođenje dnevnika svih poruka ove komponente postavljanjem varijable okruženja NS_LOG na različitim razinama. Nastavimo i dodajmo neke unose u skriptu. Makros koji se koristi za dodavanje poruka informativne razine u dnevnik je NS_LOG_INFO. Dodajmo poruku (odmah prije nego što počnemo kreirati čvorove) koja vam govori da se skripta nalazi na fazi kreiranja topologije ("Creating Topology"). To se radi u sljedećem fragmentu koda,
Otvorite scratch/myfirst.cc u svom omiljenom uređivaču i dodajte redak,
NS_LOG_INFO ("Creating Topology");
odmah prije redaka,

NodeContainer nodes;
nodes.Create (2);

Sada kompajlirajte skriptu koristeći waf, i očistite varijablu NS_LOG kako biste onemogućili tok vođenja dnevnika koji smo ranije uključili:

$ ./waf
$ export NS_LOG=
Sada, ako pokrenete skriptu,
$ ./waf --run scratch/myfirst

nećete vidjeti novu poruku, budući da povezana komponenta vođenja dnevnika (FirstScriptExample) nije bila uključena. Da biste vidjeli vašu poruku, trebate uključiti komponentu vođenja dnevnika FirstScriptExample s razinom ne manjom od NS_LOG_INFO. Ako želite vidjeti samo ovu određenu razinu vođenja dnevnika, možete je uključiti ovako,

$ export NS_LOG=FirstScriptExample=info

Ako sada pokrenete skriptu, vidjet ćete novu poruku 'Creating Topology'.

Waf: Ulazim u direktorij `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Napuštam direktorij `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' završeno uspješno (0.404s)
Kreiranje topologije
Poslano 1024 bajta na 10.1.1.2
Primljeno 1024 bajta od 10.1.1.1
Primljeno 1024 bajta od 10.1.1.2

5.2 Korištenje argumenata iz komandne linije

5.2.1 Prepisivanje osnovnih vrijednosti atributa

Drugi način za promjenu ponašanja ns-3 skripti bez uređivanja i izgradnje je korištenje argumenata naredbene linije. Pružamo mehanizam za analiziranje argumenata naredbene linije i automatsko postavljanje lokalnih i globalnih varijabli na temelju rezultata.

Prvi korak u korištenju sustava argumenata naredbene linije je deklaracija parsera za naredbenu liniju. To je prilično jednostavno 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 jednostavni dvocrtni fragment zapravo je vrlo koristan sam po sebi. Otvara vrata globalnoj varijabli ns-3 i sustavu atributa. Dodajmo dvije linije koda na početak glavne funkcije skripte scratch/myfirst.cc. Nastavljajući dalje, kompiliramo skriptu i pokrećemo je, pri pokretanju tražeći pomoć na sljedeći način,

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

Ova naredba traži Waf da pokrene skriptu scratch/myfirst i da joj proslijedi argument naredbene linije --PrintHelp. Navodnici su potrebni da bi pokazali za koji program je argument namijenjen. Parser naredbene linije će prepoznati argument --PrintHelp i dati odgovor,

Waf: Ulazim u direktorij `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Napuštam direktorij `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' završeno uspješno (0.413s)
TcpL4Protocol:TcpStateMachine()
CommandLine:HandleArgument(): Obradi ime argumenata=PrintHelp vrijednost=
--PrintHelp: Ispisuje ovu poruku pomoći.
--PrintGroups: Ispisuje popis grupa.
--PrintTypeIds: Ispisuje sve TypeIds.
--PrintGroup=[group]: Ispisuje sve TypeIds od grupe.
--PrintAttributes=[typeid]: Ispisuje sve atribute typeid-a.
--PrintGlobals: Ispisuje popis globalnih varijabli.

Sada da razmotrimo opciju --PrintAttributes. Već smo spomenuli sustav atributa ns-3, prilikom istraživanja skripte first.cc. Vidjeli smo sljedeće linije koda,

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

i rekli smo da je DataRate u stvari atribut PointToPointMrežniUređaj. Primijenimo parser argumenata naredbene linije za pregled atributa. PointToPointMrežniUređajPopis pomoći kaže da trebamo pružiti TypeId. To je naziv klase kojoj pripadaju relevantne atribute. U našem slučaju to će biti ns3::PointToPointNetDevice. Nastavimo dalje, unesite

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

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

--ns3::PointToPointNetDevice::DataRate=[32768bps]:
Zadnja brzina prijenosa za point-to-point veze

Ova vrijednost je zadana i koristiće se u sistemu prilikom kreiranja objekta. PointToPointMrežniUređaj. Prebrisat ćemo ovu zadanu vrijednost pomoću parametra Atribut u PointToPointHelper iznad. Koristimo zadane vrijednosti za point-to-point uređaje i kanale. Da bismo to postigli, uklonit ćemo pozive SetDeviceAttribute i SetChannelAttribute iz myfirst.cc, koji imamo u čistoj direktoriji.

Vaš skript bi sada samo trebao deklarirati PointToPointHelper i ne izvršavati nikakve postavke, kao što je prikazano u donjem primjeru,

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

Nastavite i stvorite novi skript sa Waf (./waf) i vratimo se unazad i uključimo neko bilježenje iz UDP echo-aplikacije servera i uključimo vremenski prefiks.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

Ako pokrenete skript, trebali biste vidjeti sljedeći ispis:

Waf: Ulazak u direktorij `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Napustanje direktorija `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' završio uspješno (0.405s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Poslano 1024 bajta na 10.1.1.2
2.25732s Primljeno 1024 bajta od 10.1.1.1
2.25732s Echoing paket
Primljeno 1024 bajta od 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

Podsjetimo, prošli put kada smo gledali vreme simulacije, trenutak kada je echo-server primio paket je bio 2,00369 sekundi.

2.00369s UdpEchoServerApplication:HandleRead(): Primljeno 1024 bajta od 10.1.1.1

Sada paket dobija u 2.25732 sekunde. To je zbog toga što smo jednostavno smanjili brzinu prijenosa PointToPointNetDevice sa pet megabita u sekundi na zadanu vrijednost od 32768 bitova u sekundi. Da smo unijeli novu DataRate putem komandne linije, mogli bismo ponovo ubrzati našu simulaciju. To ćemo učiniti na sljedeći način, prema formuli koja proizlazi iz elementa pomoći:

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

Kao rezultat toga, zadana vrijednost atributa DataRate će se vratiti na pet megabita u sekundi. Jeste li iznenađeni rezultatom? Pokazuje se da, kako bismo vratili izvorno ponašanje skripte, moramo također postaviti odgodu kanala koja odgovara brzini svjetlosti. Možemo zatražiti od komandne linije da ispiše atribute kanala, kao što smo to radili za mrežni uređaj:

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

Otkrio bi da je atribut odgode kanala postavljen na sljedeći način:

--ns3::PointToPointChannel::Delay=[0ns]:
Odgađanje prenosa kroz kanal

Zatim možemo putem 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 skripti:

Waf: Ulazak u direktorij `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'\nWaf: Napuštanje direktorija `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'\n'build' je uspješno završen (0.417s)\n0s UdpEchoServerApplication:UdpEchoServer()\n1s UdpEchoServerApplication:StartApplication()\nPoslano 1024 bajta na 10.1.1.2\n2.00369s Primljeno 1024 bajta od 10.1.1.1\n2.00369s Ponovno šalje paket\nPrimljeno 1024 bajta od 10.1.1.2\n10s UdpEchoServerApplication:StopApplication()\nUdpEchoServerApplication:DoDispose()\nUdpEchoServerApplication:~UdpEchoServer()

Obratite pažnju na to da je paket ponovno primljen od strane servera nakon 2,00369 sekundi. Ustvari, mogli bismo na ovaj način postaviti bilo koji od atributa korištenih u skripti. Konkretno, mogli bismo postaviti vrijednosti atributa MaxPackets koje su različite od jedan. UdpEchoClient.

Kako biste to iskoristili? Pokušajte. Zapamtite, morate komentirati mjesto gdje ponovno definiramo zadanu vrijednost atributa i jasno postaviti MaxPackets u skripti. Zatim biste trebali ponovo izgraditi skriptu. Također možete putem komandne linije dobiti pomoć o sintaksi za postavljanje nove zadane vrijednosti atributa. Kada savladate ovo, moći ćete upravljati brojem paketa koji se prikazuju na komandnoj liniji. Kako smo 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 ovdje postavlja jest kako saznati o postojanju svih ovih atributa. Ponovno, komandna linija ima funkciju pomoći u tom pitanju. Ako zatražimo pomoć iz komandne linije, trebali bismo vidjeti:

$ ./waf --run "scratch/myfirst --PrintHelp"
myfirst [Program Arguments] [General Arguments]
General Arguments:
--PrintGlobals: Ispisuje popis globalnih varijabli.
--PrintGroups: Ispisuje popis grupa.
--PrintGroup=[group]: Ispisuje sve TypeId-e u grupi.
--PrintTypeIds: Ispisuje sve TypeId-e.
--PrintAttributes=[typeid]: Ispisuje sve atribute za typeid.
--PrintHelp: Ispisuje ovu poruku pomoći.

Ako odaberete argument "PrintGroups", trebali biste vidjeti popis svih registriranih grupa. TypeId. Imena grupa podudaraju se s imenima modula u izvornoj direktoriji (iako s velikim početnim slovom). Ispisivanje svih informacija istovremeno će biti preopširno, stoga je dostupan dodatni filtar za ispis informacija po grupama. Tako, ponovno se fokusirajući na modul „točka-točka“:

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

Ovdje možete pronaći dostupna imena TypeId za pretraživanje atributa, na primjer, u
--PrintAttributes = ns3::PointToPointChannel, kao što je prikazano gore.

Još jedan način da saznate o atributima je kroz Doxygen ns-3. Tamo postoji stranica koja nabraja sve registrirane atribute u simulatoru.

5.2.2 Hvatanje vlastitih komandi

Također možete dodati vlastite hookove putem sustava naredbene linije. Ovo se prilično lako radi koristeći metodu parsiranja naredbene linije. AddValue.
Iskoristimo ovu mogućnost da navedemo broj paketa koji trebaju biti prikazani, potpuno na drugačiji način. Dodajmo lokalnu varijablu nazvanu nPackets u funkciju main. Postavit ćemo je na jedan kako bismo se uskladili s našim prethodnim zadanim ponašanjem. Da bismo omogućili parseru naredbene linije da promijeni ovu vrijednost, trebamo uhvatiti ovu vrijednost u parseru. To radimo dodavanjem poziva AddValue. Idite i promijenite skriptu scratch/myfirst.cc tako da započne s sljedećim kodom,

int
main (int argc, char *argv[])
{
uint32_t nPackets = 1;
CommandLine cmd;
cmd.AddValue("nPackets", "Broj paketa za eho", nPackets);
cmd.Parse (argc, argv);
...

Pomaknite se dolje do točke u skripti gdje postavljamo atribut MaxPackets i promijenite ga da bude postavljen na varijablu nPackets umjesto na konstantu 1, kao što je prikazano u nastavku.

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

Sada, ako pokrenete skriptu i unesete argument --PrintHelp, trebali biste vidjeti novi korisnički argument kako se navodi u prikazu pomoći. Unesite,

$ ./waf --run "scratch/myfirst --PrintHelp"
Waf: Ulazim u direktorij `home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Napuštam direktorij `home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' završeno uspješno (0.403s)
--PrintHelp: Ispisuje ovu pomoćnu poruku.
--PrintGroups: Ispisuje popis grupa.
--PrintTypeIds: Ispisuje sve TypeIds.
--PrintGroup=[grupa]: Ispisuje sve TypeIds unutar grupe.
--PrintAttributes=[typeid]: Ispisuje sve atribute za typeid.
--PrintGlobals: Ispisuje popis globalnih vrijednosti.
Korisnički argumenti:
--nPackets: Broj paketa za echo

Ako želite promijeniti broj prenesenih paketa, možete to učiniti postavljanjem argumenta -nPackets u komandnoj liniji.

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

Sada biste trebali vidjeti

Waf: Ulazim u direktorij `home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Napuštam direktorij `home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' završeno uspješno (0.404s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Poslano 1024 bajta na 10.1.1.2
2.25732s Primljeno 1024 bajta s 10.1.1.1
2.25732s Echoing packet
Primljeno 1024 bajta s 10.1.1.2
Poslano 1024 bajta na 10.1.1.2
3.25732s Primljeno 1024 bajta s 10.1.1.1
3.25732s Echoing packet
Primljeno 1024 bajta s 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 korisnik ns‑3 možete koristiti sustav argumenata komandne linije za upravljanje globalnim vrijednostima i atributima. Ako ste autor modela, možete dodati nove atribute svojim objektima, i oni će automatski biti dostupni za podešavanje vašim korisnicima putem sustava komandne linije. Ako ste autor skripte, možete dodavati nove varijable u svoje skripte i bezbolno ih povezati sa sustavom komandne linije.

5.3 Korištenje sustava praćenja

Cjelokupna svrha modeliranja je generirati izlazne podatke za daljnju analizu, a sustav praćenja ns‑3 je osnovni mehanizam za to. Budući da je ns‑3 program napisan u C++, mogu se koristiti standardni alati za generiranje izlaznih podataka za programe pisane u C++:

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

Možete čak koristiti modul za dnevnik kako biste dodali malu strukturu u svoje rješenje. Poznato je mnogo problema koji proizlaze iz takvog pristupa i zato smo za rješavanje tih problema pružili opću podsustav praćenja događaja.

Glavni ciljevi sustava praćenja ns‑3:

  • Za osnovne zadatke, sustav praćenja trebao bi korisniku omogućiti generiranje standardnog praćenja za popularne izvore te odabrati objekte koji generiraju praćenje;

  • Intermediate users should be able to extend the tracing system to modify the generated output format or to insert new tracing sources without modifying the core of the simulator.

  • Experienced users can modify the core of the simulator to add new tracing sources and receivers. The ns-3 tracing system is built on the principles of independent tracing sources and receivers, as well as a unified mechanism for connecting sources to consumers.

The ns-3 tracing system is based on the principles of independent tracing sources and receivers, as well as a unified mechanism for connecting sources to receivers. Tracing sources are objects that can signal events occurring in the simulation and provide access to relevant underlying data. For example, a tracing source may indicate when a network device has received a packet and provide access to the packet's contents for interested tracing receivers.

Tracing sources are useless by themselves unless they are 'linked' to other parts of the code that actually do something useful with the information provided by the receiver. Tracers are consumers of events and data provided by tracing sources. For example, a tracing receiver can be created that, when connected to the previously mentioned tracing source, will print out the interested parts of the received packet.

The reasonable basis for such an explicit separation is to allow users to connect new types of receivers to existing tracing sources without the need to edit and recompile the core of the simulator. Thus, in the above example, the user can define a new tracer in their script and connect it to an existing tracing source defined in the simulation core by only editing their custom script.

U ovom vodiču ćemo proći kroz neke unaprijed definirane izvore i odredišta i pokazati kako ih postaviti s minimalnim naporom korisnika. Pogledajte vodič ns-3 ili odjeljke s uputama za informacije o naprednoj konfiguraciji praćenja, uključujući proširenje imenskog prostora praćenja i stvaranje novih izvora praćenja.

5.3.1 ASCII Praćenje

ns-3 pruža pomoćnu funkcionalnost koja nudi niskorazinsku sistemsku praćenje kako bi vam pomogla s detaljima prilikom postavljanja jednostavnih praćenja paketa. Ako uključite ovu funkciju, vidjet ćete izlaze u ASCII datotekama. Za one koji su upoznati s izlazom ns-2, ova vrsta praćenja je analogna out.tr, koja je generirana brojnim skriptama.

Krenimo dalje i dodajmo neke rezultate ASCII praćenja u naš skript scratch/myfirst.cc. Neposredno prije poziva Simulator :: Run (), dodajte sljedeće redove koda:
AsciiTraceHelper ascii;

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

Kao i u mnogim drugim idiomima ns-3, ovaj kod koristi pomoćni objekt za stvaranje ASCII praćenja. Drugi red sadrži dva ugniježđena poziva metoda. Metoda 'unutar' CreateFileStream () koristi idiom anonimnog objekta za stvaranje objekta toka datoteke na stogu (bez imena objekta) i predaje ga pozvanom metodu. U budućnosti ćemo se dublje pozabaviti ovim pitanjem, ali sve što trebate znati u ovoj fazi je to da stvarate objekt koji predstavlja datoteku naziva myfirst.tr i predajete ga ns-3. Prepuštamo ns-3 brigu o stvorenom objektu tijekom cijelog njegovog životnog vijeka, tijekom kojeg se rješavaju problemi uzrokovani malo poznatom (namjernom) ograničenjem vezanim uz kopirajuće konstruktore objekata toka C++.

Vanjski poziv EnableAsciiAll() izvještava pomoćnika da želite uključiti ASCII praćenje za sve veze točka-točka u vašoj simulaciji i da želite da (navedena) odredišta praćenja zabilježe informacije o kretanju paketa u ASCII formatu.

Za one koji su upoznati s ns-2, praćeni događaji su ekvivalentni poznatim točkama praćenja koje bilježe događaje '+' , '-' , 'd' i 'r'.
Sada možete sastaviti skriptu i pokrenuti ju iz naredbenog retka:

$ ./waf --run scratch/myfirst

Kao i mnogo puta do sada, vidjet ćete nekoliko poruka od Wafa, a zatim "‘build’ finished successfully" (izgradnja je završena uspješno) s nekoliko poruka od aktivnog programa.

Dok radi, program će kreirati datoteku pod imenom myfirst.tr. Zbog specifičnosti rada Waf, prema zadanim postavkama datoteka se ne stvara u lokalnom direktoriju, već u direktoriju na najvišoj razini spremišta. Ako želite promijeniti putanju na kojoj se spremaju tragovi, možete koristiti za Waf parametar --cwd. To nismo učinili, pa da bismo pogledali ASCII trag myfirst.tr u vašem omiljenom uređivaču, morat ćemo otići u direktorij na najvišoj razini našeg spremišta.

Parsiranj ASCII praćenja

Tu ima puno informacija u prilično kompaktnom obliku, ali prvo na što treba obratiti pažnju je da se datoteka sastoji od odvojenih redaka. To će postati očito ako proširite prozor za pregled.

Svaki redak u datoteci odgovara događaju traganja. U ovom slučaju tragamo događaje u redu za prijenos, prisutnom u svakom mrežnom uređaju točka-točka u simulaciji. Red za prijenos je redak kroz koji svaki paket mora proći za točku-točka vezu. Primijetite da svaki redak u datoteci traganja počinje s jednim simbolom (i ima razmak nakon njega). Ovaj simbol će imati sljedeće značenje:

+: u redu uređaja došlo je do operacije stavljanja u red;
-: u redu uređaja došlo je do operacije uklanjanja elementa;
d: paket je odbijen, obično zato što je red pun;
r: paket je primljen od strane mrežnog uređaja.

Pogledajmo detaljnije prvi redak u datoteci traganja. Raspodijelit ću ga na dijelove (s uvlačenjem za preglednost) i brojem retka s lijeve strane:

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 odjeljak ovog proširenog događaja traganja (redak 0) - to je operacija. Imamo ovdje simbol +, što odgovara operaciji stavljanja u red za prijenos. Drugi odjeljak (redak 1) - vrijeme simulacije, izraženo u sekundama. Možete se sjetiti da smo tražili UdpEchoClientApplication započeti slanje paketa za dvije sekunde. Ovdje vidimo potvrdu da se to zaista događa.

U sljedećem dijelu primjera praćenja (od drugog retka) pokazuje se koji izvor praćenja je izazvao ovaj događaj (navodi se prostor imena praćenja). Možete zamisliti prostor imena praćenja otprilike kao prostor imena datotečnog sustava. Korijen prostora imena je NodeList. To odgovara kontejneru kojim upravlja glavni kod ns-3. U njemu su svi čvorovi koji se stvaraju u skripti. Kao što datotečni sustav može imati direktorije u svojoj korijenskoj strukturi, u NodeList možemo imati mnogo čvorova. Tako retak \/NodeList\/0 upućuje na nulti čvor u NodeListu, koji obično razumijemo kao 'čvor 0'. Svaki čvor ima popis uređaja koji su postavljeni. Ova lista se nalazi sljedeća u prostoru imena. Možete vidjeti da ovaj događaj praćenja dolazi iz DeviceList\/0, koji je nulti uređaj postavljen u čvoru.

Sljedeći podniz, $ ns3 :: PointToPointNetDevice, navodi koji se uređaj nalazi na nultom mjestu: popisa uređaja nultog čvora. Podsjetimo da je operacija +, koja se nalazila u prvom retku, značila da je došlo do dodavanja elementa u red za prijenos uređaja. To je odraženo u posljednjim segmentima 'puta praćenja': TxQueue\/Enqueue.

Ostatak dijelova u praćenju trebao bi biti dovoljno intuitivan. Retci 3-4 ukazuju da je paket enkapsuliran u protokolu točka-točka. Retci 5-7 pokazuju da paket ima naslov verzije IP4 i da je nastao na IP adresi 10.1.1.1 i namijenjen je 10.1.1.2. Retci 8-9 pokazuju da ovaj paket ima naslov UDP, a konačno, retka 10 pokazuje da je korisni teret - očekivanih 1024 bajta.

Sljedeći redak u datoteci praćenja pokazuje da je isti paket izvađen iz reda za prijenos na istom čvoru.

Treći redak u datoteci praćenja pokazuje da je paket primljen od mrežnog uređaja na čvoru s echo poslužiteljem. Ovo sam ponovno reproducirao 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     duljina: 1052 10.1.1.1 > 10.1.1.2)
6     ns3::UdpHeader (
7       duljina: 1032 49153 > 9)
8       Teret (veličina=1024)

Napomena: operacija praćenja sada je r, a vrijeme simulacije produženo na 2,25732 sekundi. Ako ste pažljivo slijedili upute iz vodiča, to znači da ste ostavili DataRate mrežnih uređaja i kašnjenje kanala na njihovim zadanim vrijednostima. Ovo vrijeme bi vam trebalo biti poznato, kao što ste već vidjeli u prethodnom odjeljku.

Unos imenskog prostora izvora praćenja (linija 2) je izmijenjen kako bi odražavao da ovaj događaj dolazi sa čvora 1 (\/NodeList/1) и пакет принят источником трассировки (/MacRx). Trebalo bi vam biti prilično lako pratiti kretanje paketa kroz topologiju, pregledavajući preostale informacije u datoteci praćenja.

5.3.2 PCAP praćenje

Pomoćnici uređaja ns-3 također se mogu koristiti za generiranje datoteka praćenja u .pcap formatu. Akronim pcap (obično pisan malim slovima) označava snimanje paketa i zapravo predstavlja API koji uključuje definiciju .pcap formata datoteke. Najpopularniji program koji može čitati i prikazivati ovaj format je Wireshark (ranije poznat kao Ethereal). Međutim, postoji mnogo alata za analizu praćenja prometa koji koriste ovaj format paketa. Preporučujemo korisnicima da koriste razne alate dostupne za analizu pcap praćenja. U ovom vodiču fokusirat ćemo se na pregled pcap praćenja pomoću tcpdump.

Uključivanje pcap praćenja izvodi se jednom linijom koda.

pointToPoint.EnablePcapAll ("myfirst");

Umetnite ovu liniju koda nakon ASCII koda praćenja koji smo upravo dodali u scratch/myfirst.cc. Imajte na umu da smo proslijedili samo oznaku 'myfirst', a ne 'myfirst.pcap' ili nešto slično. To je zato što je parametar prefiks, a ne potpuno ime datoteke. Tijekom simulacije, pomoćnik će zapravo stvoriti datoteku praćenja za svaki uređaj točka-točka. Imena datoteka bit će izgrađena korištenjem prefiksa, broja čvora, broja uređaja i sufiksa 'pcap».

Za naš primjer scenarija na kraju ćemo vidjeti datoteke s imenima 'myfirst-0-0.pcap» i «myfirst-1-0.pcap', koje su pcap praćenja za čvor 0-uređaj 0 i čvor 1-uređaj 0, redom. Nakon što ste dodali liniju koda za uključivanje pcap praćenja, možete pokrenuti skriptu na uobičajen način:

$ ./waf --run scratch/myfirst

Ako pogledate u direktorij najvišeg nivoa vašeg distribucijskog paketa, trebali biste vidjeti tri datoteke: datoteku ASCII praćenja myfirst.tr, koju smo prethodno ispitali, datoteke myfirst-0-0.pcap i myfirst-1-0.pcap — nove pcap datoteke koje smo upravo generirali.

Čitanje ispisa putem tcpdumpa

Trenutno je najlakše koristiti tcpdump za pregled pcap datoteka.

$ 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

U dumpu myfirst-0-0.pcap (klijentski uređaj) možete vidjeti da se echo paket šalje nakon 2 sekunde simulacije. Ako pogledate drugi dump (myfirst-1-0.pcap), vidjet ćete da paket stiže u trenutku 2,257324 sekunde. Vidjet ćete u drugom dumpu da se paket vraća u trenutku 2,257324 sekunde, a konačno da je paket primljen natrag od strane klijenta u prvom dumpu u trenutku 2,514648 sekundi.

Čitanje ispisa putem Wiresharka

Ako niste upoznati s Wireshark, postoji web stranica s koje možete preuzeti programe i dokumentaciju: http://www.wireshark.org/. Wireshark — to je grafičko korisničko sučelje koje možete koristiti za prikaz ovih datoteka praćenja. Ako imate Wireshark, možete otvoriti bilo koju od datoteka praćenja i prikazati sadržaj kao da ste snimili pakete koristeći analitičar paketa.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster