Vadnica simulatorja omrežja ns-3. 5. poglavje

Vadnica simulatorja omrežja ns-3. 5. poglavje
poglavje 1,2
poglavje 3
poglavje 4

5 Nastavitve
5.1 Uporaba modula za beleženje
5.1.1 Pregled beleženja
5.1.2 Omogoči beleženje
5.1.3 Dodajanje beleženja vaši kodi
5.2 Uporaba argumentov ukazne vrstice
5.2.1 Preglasitev privzetih vrednosti atributov
5.2.2 Zajem lastnih ukazov
5.3 Uporaba sistema za sledenje
5.3.1 Sledenje ASCII
Razčlenjevanje sledi ASCII
5.3.2 Sled PCAP

Poglavje 5

prilagoditev

5.1 Uporaba modula za beleženje

Na kratko smo si že ogledali modul beleženja ns-3 z ogledom skripta najprej.cc. V tem poglavju si bomo podrobneje ogledali možne uporabe podsistema beleženja.

5.1.1 Pregled beleženja

Številni veliki sistemi podpirajo nekakšno možnost beleženja sporočil in ns-3 ni izjema. V nekaterih primerih se na "operatorsko konzolo" (ki je običajno stderr v sistemih, ki temeljijo na Unixu) zapišejo le sporočila o napakah. V drugih sistemih se lahko prikažejo opozorilna sporočila in podrobnejše informacije. V nekaterih primerih se orodja za beleženje uporabljajo za izpis sporočil o odpravljanju napak, ki lahko hitro zameglijo izpis.

SubHRD, ki se uporablja v ns-3, predpostavlja, da so vse te ravni informacijske vsebine uporabne, in nudimo selektiven, večplasten pristop k beleženju sporočil. Beleženje je mogoče popolnoma onemogočiti, omogočiti za posamezno komponento ali globalno. V ta namen se uporabljajo nastavljive ravni vsebine informacij. Modul za beleženje ns-3 zagotavlja razmeroma preprost način za pridobivanje uporabnih informacij iz vaše simulacije.

Zavedati se morate, da ponujamo mehanizem splošnega namena – sledenje – za pridobivanje podatkov iz vaših modelov, kar bi moral biti prednostni izhod za simulacije (za več informacij o našem sistemu sledenja glejte razdelek 5.3 vadnice). Beleženje bi moralo biti prednostna metoda za pridobivanje informacij o odpravljanju napak, opozoril, sporočil o napakah ali za hitro izpisovanje sporočil iz vaših skriptov ali modelov kadar koli.

Trenutno sistem definira sedem ravni (tipov) dnevniških sporočil v naraščajočem vrstnem redu vsebine informacij.

  • LOG_ERROR - beleženje sporočil o napakah (povezani makro: NS_LOG_ERROR);
  • LOG_WARN – Opozorilna sporočila dnevnika (povezani makro: NS_LOG_WARN);
  • LOG_DEBUG - Beležite relativno redka posebna sporočila o odpravljanju napak (povezani makro: NS_LOG_DEBUG);
  • LOG_INFO - registracija informacijskih sporočil o napredku programa (povezani makro: NS_LOG_INFO);
  • LOG_FUNCTION – Beleži sporočila, ki opisujejo vsako klicano funkcijo (dva povezana makra: NS_LOG_FUNCTION, ki se uporablja za članske funkcije, in NS_LOG_FUNCTION_NOARGS, ki se uporablja za statične funkcije);
  • LOG_LOGIC - beleženje sporočil, ki opisujejo logični tok znotraj funkcije (povezani makro: NS_LOG_LOGIC);
  • LOG_ALL - Beleži vse zgoraj omenjeno (brez povezanega makra).
    Za vsako vrsto (LOG_TYPE) obstaja tudi LOG_LEVEL_TYPE, ki, če je uporabljena, omogoča beleženje vseh ravni nad njo poleg lastne ravni. (Posledično sta LOG_ERROR in LOG_LEVEL_ERROR ter LOG_ALL in LOG_LEVEL_ALL funkcionalno enakovredna.) Na primer, če omogočite LOG_INFO, boste dovolili le sporočila, ki jih posreduje makro NS_LOG_INFO, medtem ko boste z omogočanjem LOG_LEVEL_INFO vključili tudi sporočila, ki jih zagotovijo makri NS_LOG_DEBUG, NS_LOG_WARN in NS_LOG_ERROR.

Ponujamo tudi brezpogojni makro beleženja, ki je vedno prikazan, ne glede na raven beleženja ali izbirno komponento.

  • NS_LOG_UNCOND – Brezpogojno beleženje povezanega sporočila (brez povezane ravni beleženja).

Za vsako raven je mogoče poizvedovati posamično ali kumulativno. Beleženje je mogoče konfigurirati s spremenljivko okolja sh NS_LOG ali z beleženjem klica sistemske funkcije. Kot je bilo prikazano prej, ima sistem beleženja dokumentacijo Doxygen in zdaj je pravi čas, da jo pregledate, če je še niste.

Zdaj, ko ste zelo podrobno prebrali dokumentacijo, uporabimo to znanje, da pridobimo nekaj zanimivih informacij iz vzorčnega skripta scratch/myfirst.ccki ste jih že sestavili.

5.1.2 Omogoči beleženje

Uporabimo spremenljivko okolja NS_LOG, da zaženemo še nekaj dnevnikov, a najprej, da se orientiramo, zaženimo zadnji skript, kot ste to storili prej,

$ ./waf --run scratch/myfirst

Morali bi videti znani rezultat iz prvega primera 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

Izkazalo se je, da so "poslana" in "prejeta" sporočila, ki ju vidite zgoraj, dejansko zabeležena sporočila UdpEchoClientApplication и UdpEchoServerApplication. Od odjemalske aplikacije lahko na primer zahtevamo, da natisne dodatne informacije, tako da nastavi svojo raven beleženja prek spremenljivke okolja NS_LOG.

Od zdaj naprej bom domneval, da uporabljate lupino, podobno sh, ki uporablja sintakso "VARIABLE=value". Če uporabljate lupino, podobno csh, boste morali pretvoriti moje primere v sintakso "vrednost spremenljivke setenv", ki jo zahtevajo te lupine.

Trenutno se odjemalska aplikacija UDP echo odziva na naslednjo vrstico kode v scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

Omogoča raven beleženja LOG_LEVEL_INFO. Ko posredujemo zastavico ravni beleženja, dejansko omogočimo to raven in vse nižje ravni. V tem primeru smo omogočili NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN in NS_LOG_ERROR. Z nastavitvijo okoljske spremenljivke NS_LOG na naslednji način lahko povečamo raven beleženja in pridobimo več informacij brez sprememb skripta in ponovnega prevajanja:

$ export NS_LOG=UdpEchoClientApplication=level_all

Tako smo nastavili spremenljivko lupine sh NS_LOG na naslednjo vrednost,

UdpEchoClientApplication=level_all

Leva stran dodelitve je ime zabeležene komponente, ki jo želimo konfigurirati, desna stran pa je zastavica, ki jo želimo uporabiti zanjo. V tem primeru bomo v aplikaciji omogočili vse ravni odpravljanja napak. Če zaženete skript s tako nastavljenim NS_LOG, bo sistem beleženja ns-3 sprejel spremembe in videli bi morali naslednje rezultate:

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 odpravljanju napak, ki jih zagotavlja aplikacija, so zdaj na ravni NS_LOG_FUNCTION. Prikazuje vsak primer klica funkcije med izvajanjem skripta. Splošno pravilo je, da je v funkcijah metode bolje uporabiti (vsaj)NS_LOG_FUNCTION (this)... Uporaba NS_LOG_FUNCTION_NOARGS ()
samo v statičnih funkcijah. Vendar upoštevajte, da sistemu ns-3 ni treba podpirati nobene funkcije beleženja. Odločitev o tem, koliko informacij se zabeleži, je prepuščena posameznemu razvijalcu modela. V primeru aplikacij echo je na voljo velika količina izpisa beleženja.

Zdaj si lahko ogledate dnevnik funkcijskih klicev, ki jih je opravila aplikacija. Če pozorno pogledate, boste med črto opazili dvopičje UdpEchoClientApplication in ime metode, kjer lahko pričakujete operator obsega C++ (: :). To je namerno.

To pravzaprav ni ime razreda, ampak ime komponente beleženja. Ko pride do ujemanja med izvorno datoteko in razredom, je to običajno ime razreda, vendar se morate zavedati, da to dejansko ni ime razreda in da je namesto dvojnega dvopičja eno samo dvopičje. To je način, ki vam pomaga konceptualno ločiti ime gradnika beleženja od imena razreda na razmeroma subtilen način.

Vendar je v nekaterih primerih težko ugotoviti, katera metoda dejansko ustvarja sporočilo dnevnika. Če pogledate zgornje besedilo, se morda sprašujete, kje je vrstica "Received 1024 bytes from 10.1.1.2" To težavo lahko rešite tako, da nastavite nivo prefix_func na spremenljivko okolja NS_LOG. Poskusite naslednje:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

Upoštevajte, da so narekovaji potrebni, ker je navpična vrstica, ki jo uporabljamo za predstavitev operacije ALI, tudi cevni konektor Unix. Zdaj, če zaženete skript, boste videli, da sistem beleženja zagotavlja, da ima vsako sporočilo v danem dnevniku predpono z imenom 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()

Zdaj lahko vidite, da so vsa sporočila, ki prihajajo iz odjemalske aplikacije UDP echo, identificirana kot taka. sporočilo "Received 1024 bytes from 10.1.1.2" je zdaj jasno označeno, da prihaja iz odjemalske aplikacije echo. Preostalo sporočilo mora priti iz strežniške aplikacije UDP echo. To komponento lahko omogočimo tako, da v spremenljivko okolja NS_LOG vnesemo seznam komponent, ločenih z dvopičjem.

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

Opozorilo: V zgornjem primeru besedila boste morali odstraniti znak za novo vrstico za dvopičjem (:), uporablja se za oblikovanje dokumenta. Zdaj, če zaženete skript, boste videli vsa sporočila dnevnika odjemalskih in strežniških aplikacij echo. Vidite lahko, da je to lahko zelo koristno pri odpravljanju napak.

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

Včasih je koristno tudi videti čas simulacije, ko je bilo ustvarjeno sporočilo dnevnika. To lahko storite tako, da dodate bit OR predpona_čas:

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

Spet boste morali odstraniti zgornji znak za novo vrstico. Če zdaj zaženete skript, bi morali videti naslednje rezultate:

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

Upoštevajte, da je konstruktor za UdpEchoServer je bil poklican med simulacijo 0 sekund. To se dejansko zgodi, preden se simulacija začne, vendar je čas prikazan kot nič sekund. Enako velja za sporočilo konstruktorja 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()

Spomnimo se, da je scenarij scratch/first.cc zagnal aplikacijo strežnika echo sekundo pred začetkom simulacije. Zdaj lahko vidite, da je metoda StartApplication strežnik je dejansko poklican v prvi sekundi. Morda boste tudi opazili, da se odjemalec echo zažene v drugi sekundi simulacije, kot smo zahtevali v skriptu.

Zdaj lahko med klicem spremljate potek simulacije ScheduleTransmit v odjemalcu, ki kliče povratni klic HandleRead Send v aplikaciji strežnika echo. Upoštevajte, da je pretekli čas za pošiljanje paketa prek povezave od točke do točke 3,69 milisekunde. Vidite lahko, da strežnik echo zabeleži sporočilo, da se je odzval na paket, nato pa po zakasnitvi kanala vidite, da odjemalec echo prejme paket echo v svoji metodi HandleRead.

V tej simulaciji se marsikaj zgodi, ne da bi opazili. Lahko pa zelo enostavno sledite celotnemu procesu, tako da omogočite vse komponente beleženja v sistemu. Poskusite nastaviti spremenljivko NS_LOG na naslednjo vrednost,

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

Zgornja zvezdica je nadomestni znak za komponento beleženja. To bo vključevalo vse vnose v vseh komponentah, uporabljenih v simulaciji. Tukaj ne bom reproduciral izhoda (v času pisanja ustvari 1265 vrstic izhoda za en paket odmeva), vendar lahko te informacije preusmerite v datoteko in si jih ogledate v svojem najljubšem urejevalniku.

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

Osebno uporabljam to izjemno podrobno različico beleženja, ko imam težave in nimam pojma, kje je šlo narobe. Izvajanje kode lahko spremljam precej enostavno, ne da bi nastavil prekinitvene točke in korakal skozi kodo v razhroščevalniku. Izpis lahko samo uredim v svojem najljubšem urejevalniku in iščem, kar pričakujem, ter vidim, da se zgodi nekaj, česar nisem pričakoval. Ko dobim splošno predstavo o tem, kaj gre narobe, skočim v razhroščevalnik, da se poglobim v težavo. Ta vrsta izhoda je lahko še posebej uporabna, ko vaš skript naredi nekaj povsem nepričakovanega. Če uporabljate samo razhroščevalnik, lahko popolnoma zamudite zasuk. Registracija naredi takšne obrate opazne.

5.1.3 Dodajanje beleženja vaši kodi

Svojim simulacijam lahko dodate nove vnose tako, da pokličete komponento dnevnika iz več makrov. Naredimo to v scenariju mojprvi.cc, ki ga imamo v imeniku “clean”. Spomnimo se, da smo definirali komponento beleženja v tem scenariju:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Zavedate se, da lahko omogočite beleženje vseh sporočil te komponente z nastavitvijo spremenljivke okolja NS_LOG na različnih ravneh. Pojdimo naprej in dodamo nekaj vnosov v skript. Makro, ki se uporablja za dodajanje sporočil na ravni informacij v dnevnik, je NS_LOG_INFO. Dodajmo sporočilo (tik preden začnemo ustvarjati vozlišča), ki vam pove, da je skript v fazi "Ustvarjanje topologije". To se naredi v naslednjem delčku kode,
Odpri scratch/myfirst.cc v svojem priljubljenem urejevalniku in dodajte vrstico,
NS_LOG_INFO ("Creating Topology");
tik pred vrsticami,

NodeContainer nodes;
nodes.Create (2);

Zdaj prevedite skript z uporabo WAFin počistite spremenljivko NS_LOG, da onemogočite tok beleženja, ki smo ga omogočili prej:

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

Novega sporočila ne boste videli, ker povezana komponenta beleženja (FirstScriptExample) ni bila omogočena. Če želite videti svoje sporočilo, morate omogočiti komponento beleženja FirstScriptExample z nivojem, ki ni nižji od NS_LOG_INFO. Če želite samo videti to posebno raven beleženja, jo lahko omogočite takole,

$ export NS_LOG=FirstScriptExample=info

Če zdaj zaženete skript, boste videli novo sporočilo "Ustvarjanje 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 Uporaba argumentov ukazne vrstice

5.2.1 Preglasitev privzetih vrednosti atributov

Drug način za spreminjanje obnašanja skriptov ns-3 brez urejanja ali gradnje je uporaba argumentov ukazne vrstice. Ponujamo mehanizem za razčlenjevanje argumentov ukazne vrstice in samodejno nastavitev lokalnih in globalnih spremenljivk na podlagi rezultatov.

Prvi korak pri uporabi sistema argumentov ukazne vrstice je deklaracija razčlenjevalnika ukazne vrstice. To je zelo enostavno narediti (v vašem glavnem programu), kot v naslednji kodi,

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

Ta preprost dvovrstični izrezek je pravzaprav zelo uporaben sam po sebi. Odpira vrata v sistem globalnih spremenljivk in atributov ns-3. Dodajmo dve vrstici kode na začetek funkcije glavnega skripta scratch/myfirst.cc. Nadaljujemo, prevedemo skript in ga zaženemo, pri zagonu naredimo zahtevo za pomoč, kot sledi,

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

Ta ukaz bo vprašal Waf zaženi skript scratch/myfirst in mu posredujte argument ukazne vrstice —PrintHelp. Narekovaji so potrebni za navedbo, kateremu programu je argument namenjen. Razčlenjevalnik ukazne vrstice bo zaznal argument —PrintHelp in bo prikazal 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.

Zdaj pa poglejmo možnost —PrintAttributes. Sistem atributov ns-3 smo že omenili, ko smo preučevali skript first.cc. Videli smo naslednje vrstice kode,

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

in to so rekli Hitrost prenosa podatkov je pravzaprav atribut PointToPointNetDevice. Za ogled atributov uporabimo razčlenjevalnik argumentov ukazne vrstice PointToPointNetDevice. Na seznamu pomoči piše, kaj moramo zagotoviti TypeId. To je ime razreda, ki mu pripadajo zanimivi atributi. V našem primeru bo tako ns3::PointToPointNetDevice. Gremo naprej, vstopimo,

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

Sistem bo natisnil vse atribute te vrste omrežne naprave. Videli boste, da so med atributi na seznamu,

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

To je privzeta vrednost, ki jo bo sistem uporabil pri ustvarjanju predmeta PointToPointNetDevice. To privzeto vrednost bomo preglasili s parametrom Lastnost в PointToPointHelper višji. Uporabimo privzete vrednosti za naprave in kanale od točke do točke. Da bi to naredili, bomo izbrisali klice SetDeviceAttribute и SetChannelAttribute z dne mojprvi.cc, ki ga imamo v čistem imeniku.

Vaš skript bi moral zdaj preprosto izjaviti PointToPointHelper in ne izvajajte nobenih operacij namestitve, kot je prikazano v spodnjem primeru,

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

Nadaljujte in ustvarite nov skript z Waf (./ vaf) in pojdimo nazaj in vključimo nekaj vnosa iz aplikacije strežnika UDP echo ter vključimo časovno predpono.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

Če zaženete skript, bi morali videti naslednje rezultate:

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

Spomnimo se, da je zadnjič, ko smo pogledali čas simulacije, v trenutku, ko je paket prejel strežnik echo, znašal 2,00369 sekunde.

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

Sedaj prejme paket v 2.25732 sekunde. To je zato, ker preprosto ponastavimo podatkovno hitrost PointToPointNetDevice s pet megabitov na sekundo na privzeto vrednost, ki je 32768 bitov na sekundo. Če bi zamenjali novo DataRate z uporabo ukazne vrstice, bi lahko spet pospešili našo simulacijo. To bomo storili na naslednji način v skladu s formulo, ki jo implicira element pomoči:

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

To bo vrnilo privzeti atribut DataRate na pet megabitov na sekundo. Ste presenečeni nad rezultatom? Izkazalo se je, da moramo za vrnitev izvirnega obnašanja skripta nastaviti tudi zakasnitev kanala, da se ujema s svetlobno hitrostjo. Od sistema ukazne vrstice lahko zahtevamo, da natisne atribute kanala, tako kot smo naredili za omrežno napravo:

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

Ugotovili bomo, da je atribut zakasnitve kanala nastavljen na naslednji način:

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

Nato lahko prek sistema ukazne vrstice nastavimo obe privzeti vrednosti.

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

v tem primeru obnovimo čas, ki smo ga imeli, ko smo izrecno nastavili DataRate in Delay v 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()

Upoštevajte, da strežnik znova prejme paket po 2,00369 sekunde. Na ta način bi dejansko lahko nastavili kateri koli atribut, uporabljen v skriptu. Zlasti bi lahko nastavili atribute MaxPackets na vrednosti, ki niso ena UdpEchoClient.

Kako bi ga uporabili? Poskusi. Ne pozabite, da morate komentirati mesto, kjer preglasimo privzeto vrednost atributa in jo izrecno nastavimo MaxPackets v scenariju. Potem morate znova sestaviti skript. Uporabite lahko tudi ukazno vrstico, da dobite sintaktično pomoč za nastavitev nove privzete vrednosti atributa. Ko to razumete, lahko nadzorujete število paketov, prikazanih v ukazni vrstici. Ker smo marljivi ljudje, bi morala naša ukazna vrstica izgledati nekako takole:

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

Naravno vprašanje, ki se pojavi na tej točki, je, kako vedeti za obstoj vseh teh lastnosti. Ponovno ima sistem ukazne vrstice funkcijo pomoči za to zadevo. Če prosimo ukazno vrstico za pomoč, bi morali videti:

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

Če izberete argument »PrintGroups«, bi morali videti seznam vseh registriranih skupin TypeId. Imena skupin so skladna z imeni modulov v izvornem imeniku (čeprav z veliko začetnico). Tiskanje vseh informacij naenkrat bi bilo preobsežno, zato je na voljo dodaten filter za tiskanje informacij po skupinah. Torej, spet se osredotočamo na modul od točke do točke:

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

Tukaj lahko najdete razpoložljiva imena TypeId za iskanje atributov, na primer v
--PrintAttributes = ns3 :: PointToPointChannelkot je prikazano zgoraj.

Drug način za učenje o atributih je prek Doxygen ns‑3. Obstaja stran, na kateri so navedeni vsi atributi, registrirani v simulatorju.

5.2.2 Zajem lastnih ukazov

Prav tako lahko dodate svoje lastne kljuke prek sistema ukazne vrstice. To se naredi preprosto z uporabo metode razčlenjevalnika ukazne vrstice AddValue.
Uporabimo to funkcijo, da določimo število paketov, ki bodo prikazani na povsem drugačen način. Dodajmo lokalno spremenljivko, imenovano nPackets v funkcijo Glavni. Nastavili ga bomo na eno, da bo ustrezal prejšnjemu privzetemu vedenju. Če želimo omogočiti razčlenjevalniku ukazne vrstice, da spremeni to vrednost, moramo to vrednost zajeti v razčlenjevalniku. To storimo tako, da dodamo klic AddValue. Pojdi in spremeni scenarij scratch/myfirst.cc torej za začetek z naslednjo kodo,

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

Pomaknite se navzdol do točke v skriptu, kjer smo nastavili atribut MaxPackets, in ga spremenite tako, da bo nastavljen na spremenljivko nPackets namesto na konstanto 1, kot je prikazano spodaj.

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

Zdaj, če zaženete skript in podate argument -PrintHelp, bi morali videti argument novega uporabnika. naveden na zaslonu pomoči. Vnesite,

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

Če želite spremeniti število poslanih paketov, lahko to storite tako, da v ukazni vrstici nastavite argument - -nPackets.

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

Zdaj bi morali videti

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

Zdaj ste poslali dva paketa. Precej preprosto, kajne?
Vidite lahko, da lahko kot uporabnik ns-3 uporabite sistem argumentov ukazne vrstice za manipulacijo globalnih vrednosti in atributov. Če ste avtor modela, lahko svojim objektom dodate nove atribute in uporabnikom bodo samodejno na voljo za konfiguracijo prek sistema ukazne vrstice. Če ste avtor skripta, lahko svojim skriptom dodate nove spremenljivke in jih brezhibno vključite v sistem ukazne vrstice.

5.3 Uporaba sistema za sledenje

Bistvo modeliranja je ustvarjanje rezultatov za nadaljnje študije, sistem sledenja ns-3 pa je glavni mehanizem za to. Ker je ns-3 program C++, je mogoče uporabiti standardna sredstva za generiranje izhoda iz programa C++:

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

Uporabite lahko celo modul za beleženje, da svoji rešitvi dodate malo strukture. Obstaja veliko znanih težav, ki jih povzroča ta pristop, zato smo zagotovili podsistem splošnega sledenja dogodkom za rešitev teh težav.

Glavni cilji sistema sledenja ns-3 so:

  • Za osnovne naloge mora sistem sledenja uporabniku omogočati ustvarjanje standardne sledi za priljubljene vire in izbiro predmetov, ki ustvarjajo sled;

  • Vmesni uporabniki morajo imeti možnost razširiti sistem sledenja, da spremenijo ustvarjeni izhodni format ali vstavijo nove vire sledenja, ne da bi spremenili jedro simulatorja;

  • Napredni uporabniki lahko spremenijo jedro simulatorja, da dodajo nove vire sledenja in ponore. Sistem sledenja ns-3 je zgrajen na principih neodvisnih sledilnih virov in sprejemnikov ter enotnega mehanizma za povezovanje virov s potrošniki.

Sledilni sistem ns-3 je zgrajen na principih neodvisnega sledenja virov in sprejemnikov ter enotnega mehanizma za povezavo virov s sprejemniki. Viri sledenja so objekti, ki lahko signalizirajo dogodke, ki se zgodijo v simulaciji, in omogočijo dostop do osnovnih podatkov, ki vas zanimajo. Na primer, vir sledenja lahko pokaže, kdaj je omrežna naprava prejela paket, in da vsebino paketa na voljo zainteresiranim prejemnikom sledenja.

Viri sledenja sami po sebi so neuporabni, razen če so "povezani" z drugimi deli kode, ki dejansko naredijo nekaj koristnega z informacijami, ki jih zagotovi ponor. Sledilci so porabniki dogodkov in podatkov, ki jih zagotavljajo viri sledenja. Ustvarite lahko na primer ponor sledenja, ki bo (če je povezan z virom sledenja iz prejšnjega primera) natisnil zanimive dele prejetega paketa.

Utemeljitev za to eksplicitno ločitev je omogočiti uporabnikom, da nove vrste ponorov povežejo z obstoječimi viri sledenja, ne da bi morali urejati in znova prevajati jedro simulatorja. Tako lahko v zgornjem primeru uporabnik definira nov sledilnik v svojem skriptu in ga poveže z obstoječim virom sledenja, definiranim v jedru simulacije, samo z urejanjem uporabniškega skripta.

V tej vadnici bomo šli skozi nekaj vnaprej določenih virov in ponorov ter pokazali, kako jih je mogoče konfigurirati z najmanj truda s strani uporabnika. Za informacije o napredni konfiguraciji sledenja, vključno z razširitvijo imenskega prostora sledenja in ustvarjanjem novih virov sledenja, glejte priročnik ns-3 ali razdelke z navodili.

5.3.1 Sledenje ASCII

ns-3 ponuja funkcijo pomočnika, ki zagotavlja nizkonivojski sistem sledenja, ki vam pomaga pri podrobnostih pri nastavljanju enostavnega sledenja paketom. Če omogočite to funkcijo, boste videli izpis v datotekah ASCII. Za tiste, ki poznajo izhod ns-2, je ta vrsta sledenja podobna out.tr, ki ga ustvari veliko skriptov.

Lotimo se posla in dodamo nekaj rezultatov sledenja ASCII našemu skriptu scratch/myfirst.cc. Tik pred klicem Simulator :: Run (), dodajte naslednje vrstice kode:
AsciiTraceHelper ascii;

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

Kot mnogi drugi idiomi ns-3 tudi ta koda uporablja pomožni objekt za ustvarjanje sledi ASCII. Druga vrstica vsebuje dva ugnezdena klica metode. Metoda "znotraj". CreateFileStream() uporablja idiom anonimnega objekta za ustvarjanje objekta datotečnega toka na skladu (brez imena objekta) in ga posreduje klicani metodi. V prihodnje se bomo poglobili v to, vendar morate na tej točki vedeti le, da ustvarjate objekt, ki predstavlja datoteko z imenom moj prvi.tr in ga prenesite v ns-3. Zaupamo ns-3, da skrbi za ustvarjeni objekt za njegovo celotno življenjsko dobo, med katero rešuje težave, ki jih povzroča malo znana (namerna) omejitev, povezana s konstruktorji kopije tokovnega objekta C++.

Zunanji klic OmogočiAsciiAll() pove pomočniku, da želite vključiti sledenje ASCII v vašo simulacijo za vse povezave naprav od točke do točke in da želite, da (določeni) sprejemniki sledenja beležijo informacije o gibanju paketov v formatu ASCII.

Za tiste, ki poznajo ns-2, so sledeni dogodki enakovredni znanim točkam sledenja, ki beležijo dogodke "+", "-", "d" in "r".
Zdaj lahko sestavite skript in ga zaženete iz ukazne vrstice:

$ ./waf --run scratch/myfirst

Kot že velikokrat prej, boste videli več sporočil Wafa, nato pa "'gradnja' uspešno končana" z nekaj sporočili delujočega programa.

Med zagonom bo program ustvaril datoteko z imenom moj prvi.tr. Zaradi narave dela Waf, datoteka privzeto ni ustvarjena v lokalnem imeniku, temveč v imeniku najvišje ravni repozitorija. Če želite spremeniti pot, kamor se shranjujejo sledi, jo lahko določite s parametrom Waf --cwd. Tega nismo storili, zato se bomo morali za ogled datoteke sledenja ASCII myfirst.tr v vašem najljubšem urejevalniku pomakniti do imenika najvišje ravni našega skladišča.

Razčlenjevanje sledi ASCII

Tam je veliko informacij v precej zgoščeni obliki, vendar morate najprej opaziti, da je datoteka sestavljena iz posameznih vrstic. To bo postalo jasno vidno, če razširite okno za ogled širše.

Vsaka vrstica v datoteki ustreza dogodku sledenja. V tem primeru sledimo dogodkom v prenosni čakalni vrsti, ki je prisotna v vsaki omrežni napravi od točke do točke v simulaciji. Čakalna vrsta za prenos je čakalna vrsta, skozi katero mora preiti vsak paket za povezavo od točke do točke. Upoštevajte, da se vsaka vrstica v datoteki sledenja začne z enim znakom (in ima za njim presledek). Ta simbol bo imel naslednji pomen:

+: v čakalni vrsti naprave je prišlo do operacije čakalne vrste;
-: v čakalni vrsti naprave je prišlo do operacije pridobivanja elementa;
d: paket je bil izpuščen, običajno zato, ker je bila čakalna vrsta polna;
r: Paket je prejela omrežna naprava.

Oglejmo si podrobneje prvo vrstico v datoteki sledenja. Razdelil ga bom na dele (z vdolbinami zaradi jasnosti) in številko vrstice na levi:

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 del tega razširjenega dogodka sledenja (vrstica 0) je operacija. Tukaj imamo simbol +, ki ustreza operaciji čakalne vrste za prenos. Drugi del (vrstica 1) je čas simulacije, izražen v sekundah. Morda se spomnite, kaj smo vprašali UdpEchoClientApplication začnite pošiljati pakete v dveh sekundah. Tukaj vidimo potrditev, da se to res dogaja.

Naslednji razdelek primera sledenja (iz 2. vrstice) prikazuje, kateri vir sledenja je ustvaril ta dogodek (nakazuje sled imenskega prostora). Imenski prostor sledenja si lahko predstavljate podobno kot imenski prostor datotečnega sistema. Koren imenskega prostora je NodeList. To ustreza vsebniku, ki se upravlja v glavni kodi ns-3. Vsebuje vsa vozlišča, ki so ustvarjena v skriptu. Tako kot ima lahko datotečni sistem imenike v korenu, NodeList lahko imamo veliko vozlišč. Torej se vrstica /NodeList/0 nanaša na ničelno vozlišče v seznamu vozlišč, ki ga običajno pojmujemo kot "vozlišče 0". Vsako vozlišče ima seznam naprav, ki so bile nameščene. Ta seznam se nahaja naslednji v imenskem prostoru. Vidite lahko, da ta dogodek sledenja izvira iz Seznam naprav/0, ki je ničelna naprava, nameščena v vozlišču.

Naslednji podniz, $ ns3 :: PointToPointNetDevice, pove, katera naprava je na položaju nič: seznam naprav vozlišča nič. Spomnimo se, da je operacija + v vrstici 0 pomenila, da je bil element dodan v čakalno vrsto za prenos naprave. To se odraža v zadnjih segmentih "tirne poti": TxQueue/Enqueue.

Preostali deli v sledi bi morali biti dokaj intuitivni. Vrstice 3-4 kažejo, da je paket enkapsuliran v protokolu od točke do točke. Vrstice 5–7 kažejo, da ima paket glavo različice IP4 in izvira iz naslova IP 10.1.1.1 in je namenjen za 10.1.1.2. Vrstice 8-9 prikazujejo, da ima ta paket glavo UDP, in nazadnje vrstica 10 kaže, da je koristni tovor pričakovanih 1024 bajtov.

Naslednja vrstica v datoteki sledenja kaže, da je bil isti paket potegnjen iz čakalne vrste prenosa na istem vozlišču.

Tretja vrstica v datoteki sledenja kaže, da je paket prejela omrežna naprava na gostitelju strežnika echo. Spodaj sem ponovil dogodek.

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)

Upoštevajte, da je operacija sledenja zdaj r in da je bil čas simulacije povečan na 2,25732 sekunde. Če ste natančno sledili vadnici, to pomeni, da ste pustili DataRate in Link Delay omrežnih naprav na privzetih vrednostih. Ta čas bi vam moral biti znan, kot ste videli v prejšnjem razdelku.

Vnos imenskega prostora vira sledenja (vrstica 2) je bil spremenjen tako, da odraža, da ta dogodek izvira iz vozlišča 1 (/NodeList/1) in paket prejme vir sledenja (/MacRx). Slediti gibanju paketa skozi topologijo bi moralo biti dokaj enostavno, če pogledate preostale sledi v datoteki.

5.3.2 Sled PCAP

Pomočnike za naprave ns-3 lahko uporabite tudi za ustvarjanje datotek sledenja v formatu .pcap. akronim pcap (običajno napisano z malimi črkami) pomeni zajem paketov in je pravzaprav API, ki vključuje definiranje oblike datoteke .pcap. Najbolj priljubljen program, ki lahko prebere in prikaže ta format, je Wireshark (prej imenovano Ethereal). Vendar pa obstaja veliko analizatorjev sledenja prometa, ki uporabljajo to obliko paketa. Uporabnike spodbujamo k uporabi številnih razpoložljivih orodij za analizo sledi pcap. V tej vadnici se bomo osredotočili na ogled sledi pcap z uporabo tcpdump.

Omogočanje sledenja pcap se izvede z eno vrstico kode.

pointToPoint.EnablePcapAll ("myfirst");

Prilepite to vrstico kode za kodo za sledenje ASCII, ki smo jo pravkar dodali scratch/myfirst.cc. Upoštevajte, da smo posredovali samo niz "myfirst", ne "myfirst.pcap" ali kaj podobnega. To je zato, ker je parameter predpona in ne polno ime datoteke. Med simulacijo bo pomočnik dejansko ustvaril datoteko sledi za vsako napravo od točke do točke. Imena datotek bodo sestavljena s predpono, številko vozlišča, številko naprave in pripono ".pcap".

Za naš primer skripta bomo na koncu videli datoteke z imenom "moj prvi-0-0.pcap"In"moj prvi-1-0.pcap", ki so sledi pcap za vozlišče 0-naprava 0 oziroma vozlišče 1-naprava 0. Ko dodate vrstico kode za omogočanje sledenja pcap, lahko zaženete skript na običajen način:

$ ./waf --run scratch/myfirst

Če pogledate v imenik najvišje ravni vaše distribucije, bi morali videti tri datoteke: datoteko sledenja ASCII moj prvi.tr, ki smo jih prej preučevali, datoteke moj prvi-0-0.pcap и moj prvi-1-0.pcap - nove datoteke pcap, ki smo jih pravkar ustvarili.

Branje izhoda s tcpdump

Za zdaj je najlažji način za ogled datotek pcap uporaba 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 smetišču moj prvi-0-0.pcap (odjemalska naprava) lahko vidite, da je paket odmeva poslan po 2 sekundah simulacije. Če pogledate drugo smetišče (moj prvi-1-0.pcap), videli boste, da je paket prejet pri 2,257324 sekunde. V drugem izpisu boste videli, da je paket vrnjen pri 2.257324 sekunde in končno, da je paket prejel nazaj odjemalec v prvem izpisu pri 2.514648 sekundah.

Branje izhodnih podatkov z Wiresharkom

Če niste seznanjeni z Wireshark, obstaja spletna stran, s katere lahko prenesete programe in dokumentacijo: http://www.wireshark.org/. Wireshark je GUI, ki se lahko uporablja za prikaz teh datotek sledenja. Če imate Wireshark, lahko odprete katero koli datoteko sledenja in prikažete vsebino, kot da bi pakete zajeli z vohanjem paketov.

Vir: www.habr.com

Dodaj komentar