ns-3 sare-simulatzailearen tutoriala. 5. kapitulua

ns-3 sare-simulatzailearen tutoriala. 5. kapitulua
1,2. kapitulua
3. kapitulua
4. kapitulua

5 Ezarpenak
5.1 Erregistro modulua erabiltzea
5.1.1 Erregistroaren ikuspegi orokorra
5.1.2 Gaitu erregistroa
5.1.3 Zure kodeari saioa gehitzea
5.2 Komando-lerroko argumentuak erabiltzea
5.2.1 Atributu-balio lehenetsiak gainidaztea
5.2.2 Zure komandoak harrapatzea
5.3 Trazadura-sistema erabiltzea
5.3.1 ASCII Trazadura
ASCII arrastoak analizatzea
5.3.2 PCAP Traza

5 kapitulua

doikuntza

5.1 Erregistro modulua erabiltzea

Dagoeneko labur-labur aztertu dugu ns-3 erregistro-modulua scriptari begiratuz lehenengo.cc. Kapitulu honetan, erregistro-azpisistemaren erabilpen posibleak sakonago aztertuko ditugu.

5.1.1 Erregistroaren ikuspegi orokorra

Sistema handi askok mezuak erregistratzeko instalazio mota batzuk onartzen dituzte, eta ns-3 ez da salbuespena. Zenbait kasutan, errore-mezuak soilik idazten dira "operadore kontsolan" (normalean stderr izan ohi da Unix-en oinarritutako sistemetan). Beste sistemetan, abisu-mezuak bistara daitezke, baita informazio zehatzagoa ere. Zenbait kasutan, erregistro-tresnak erabiltzen dira irteera azkar lausotu dezaketen arazketa-mezuak ateratzeko.

ns-3-n erabiltzen den subHRD-k bere gain hartzen du informazio-edukien maila horiek guztiak erabilgarriak direla, eta mezuen erregistroari geruzakako ikuspegi selektiboa eskaintzen diogu. Erregistroa erabat desgaitu daiteke, osagai bakoitzeko gaitu edo globalki. Horretarako, informazio-edukien maila doigarriak erabiltzen dira. ns-3 erregistro moduluak zure simulaziotik informazio baliagarria lortzeko modu nahiko erraz bat eskaintzen du.

Ulertu beharko zenuke helburu orokorreko mekanismo bat eskaintzen dugula - traza - zure ereduetatik datuak ateratzeko, simulazioetarako hobetsitako irteera izan beharko litzatekeena (gure trazatze-sistemari buruzko informazio gehiago lortzeko, ikus tutorialaren 5.3 atala). Erregistratzea izan behar da hobetsitako metodoa arazketa-informazioa, abisuak, errore-mezuak lortzeko edo edozein unetan zure script edo ereduetatik mezuak azkar ateratzeko.

Gaur egun, sistemak zazpi maila (mota) definitzen ditu erregistro-mezuen informazio-edukiaren ordena gero eta handiagoan.

  • LOG_ERROR - erregistroko errore-mezuak (erlazionatutako makroa: NS_LOG_ERROR);
  • LOG_WARN - Erregistratu abisu-mezuak (erlazionatutako makroa: NS_LOG_WARN);
  • LOG_DEBUG - Arazte-mezu bereziak nahiko arraroak erregistratu (erlazionatutako makroa: NS_LOG_DEBUG);
  • LOG_INFO - programaren aurrerapenari buruzko informazio-mezuen erregistroa (erlazionatutako makroa: NS_LOG_INFO);
  • LOG_FUNCTION - Deitutako funtzio bakoitza deskribatzen duten mezuak erregistratzen ditu (erlazionatutako bi makro: NS_LOG_FUNCTION, kide funtzioetarako erabiltzen dena, eta NS_LOG_FUNCTION_NOARGS, funtzio estatikoetarako erabiltzen dena);
  • LOG_LOGIC - funtzio baten fluxu logikoa deskribatzen duten mezuak erregistratzea (erlazionatutako makroa: NS_LOG_LOGIC);
  • LOG_ALL - Goian aipatutako guztia erregistratzen du (lotutako makrorik ez).
    Mota bakoitzerako (LOG_TYPE) LOG_LEVEL_TYPE bat ere badago eta, erabiltzen bada, bere mailaz gain bere gaineko maila guztiak erregistratzeko aukera ematen du. (Ondorioz, LOG_ERROR eta LOG_LEVEL_ERROR, eta LOG_ALL eta LOG_LEVEL_ALL funtzionalki baliokideak dira.) Adibidez, LOG_INFO gaituz gero, NS_LOG_INFO makroak emandako mezuak soilik onartuko dira, eta LOG_LEVEL_INFO gaituz gero, NS_LOGNS_DE_W_LOGARN, eta ERROR_LOGNS_DE_W_LOG makroek emandako mezuak ere sartuko dira.

Era berean, beti bistaratzen den baldintzarik gabeko erregistro-makro bat eskaintzen dugu, erregistro-maila edo hautapen-osagaia edozein dela ere.

  • NS_LOG_UNCOND - Lotutako mezuaren baldintzarik gabeko erregistroa (lotutako erregistro-mailarik gabe).

Maila bakoitza banaka edo metatua egin daiteke. Erregistroa sh ingurune-aldagaia erabiliz konfigura daiteke NS_LOG edo sistemaren funtzio-dei bat erregistratuz. Lehen erakutsi bezala, erregistro-sistemak Doxygen dokumentazioa du eta orain une egokia da hura berrikusteko, oraindik egin ez baduzu.

Dokumentazioa xehetasun handiz irakurri duzunez, erabil ditzagun ezagutza hori adibideko scriptetik informazio interesgarria lortzeko scratch/myfirst.ccdagoeneko bildu duzuna.

5.1.2 Gaitu erregistroa

Erabili dezagun NS_LOG ingurune-aldagaia erregistro gehiago exekutatzeko, baina lehenik eta behin, zure errodamenduak lortzeko, exekutatu azken script-a lehenago egin zenuen bezala,

$ ./waf --run scratch/myfirst

Lehen ns-3 adibideko programaren irteera ezaguna ikusi beharko zenuke

$ 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

Ematen du goian ikusten dituzun "bidalitako" eta "jasotako" mezuak benetan erregistratutako mezuak direla. UdpEchoClientApplication ΠΈ UdpEchoServerApplication. Adibidez, bezeroaren aplikazioari informazio gehigarria inprimatzeko eska diezaiokegu bere erregistro-maila ezarriz NS_LOG ingurune-aldagaiaren bidez.

Hemendik aurrera, "ALDAGAIA=balioa" sintaxia erabiltzen duen sh itxurako shell bat erabiltzen ari zarela suposatuko dut. Csh antzeko shell bat erabiltzen ari bazara, orduan nire adibideak shell horiek eskatzen duten "setenv variable value" sintaxira bihurtu beharko dituzu.

Gaur egun, UDP echo bezeroaren aplikazioak hurrengo kode-lerroari erantzuten dio scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

LOG_LEVEL_INFO erregistro-maila gaitzen du. Erregistro-mailako bandera pasatzen dugunean, maila hori eta beheko maila guztiak gaitzen ditugu. Kasu honetan, NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN eta NS_LOG_ERROR gaitu ditugu. Erregistro-maila handitu eta informazio gehiago lor dezakegu, script aldaketarik eta birkonpilaziorik gabe, NS_LOG ingurune-aldagaia honela ezarriz:

$ export NS_LOG=UdpEchoClientApplication=level_all

Beraz, sh shell aldagaia NS_LOG balio honetara ezarri dugu,

UdpEchoClientApplication=level_all

Esleipenaren ezkerreko aldea konfiguratu nahi dugun erregistratutako osagaiaren izena da, eta eskuinekoa horretarako aplikatu nahi dugun bandera. Kasu honetan, aplikazioan arazketa maila guztiak gaituko ditugu. Scripta NS_LOG modu honetan ezarrita exekutatzen baduzu, ns-3 erregistro-sistemak aldaketak onartuko ditu eta irteera hau ikusi beharko zenuke:

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

Aplikazioak emandako arazketa-informazio gehigarria NS_LOG_FUNCTION mailan dago orain. Funtzio-dei baten instantzia guztiak erakusten ditu script exekuzioan zehar. Arau orokor gisa, metodo funtzioetan hobe da erabiltzea (gutxienez)NS_LOG_FUNCTION (this). Erabili NS_LOG_FUNCTION_NOARGS ()
funtzio estatikoetan bakarrik. Hala ere, kontuan izan ns-3 sistema ez dela beharrezkoa erregistro-funtzionalitaterik onartzeko. Zenbat informazio erregistratzen den erabakia ereduaren garatzaile indibidualaren esku geratzen da. Echo aplikazioen kasuan, erregistro-irteera kopuru handia dago eskuragarri.

Orain aplikazioak egin dituen funtzio-deien erregistroa ikus dezakezu. Arretaz begiratuz gero, bi puntu bat nabarituko duzu lerro artean UdpEchoClientApplication eta metodoaren izena, non espero dezakezun C++ esparruko operadorea (: :). Hau nahita da.

Hau ez da benetan klasearen izena, erregistroko osagaiaren izena baizik. Iturburu-fitxategi baten eta klase baten artean bat-etortze bat dagoenean, klasearen izena izan ohi da, baina konturatu beharko zenuke ez dela benetan klasearen izena, eta bi puntu bikoitzaren ordez bi puntu bakarra daudela. Logging bean izena eta klasearen izena kontzeptualki modu nahiko sotil batean bereizten laguntzeko modu bat da hau.

Hala ere, zenbait kasutan zaila izan daiteke zein metodo benetan sortzen duen erregistro-mezua zehaztea. Goiko testuari begiratzen badiozu, baliteke lerroa non dagoen galdetzen ari zarena.Received 1024 bytes from 10.1.1.2" Arazo hau konpon dezakezu maila ezarriz aurrizki_funt NS_LOG ingurune-aldagaira. Saiatu honako hau:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

Kontuan izan komatxoak beharrezkoak direla, EDO eragiketa adierazteko erabiltzen dugun barra bertikala ere Unix-en kanalizazio-konektorea delako. Orain script-a exekutatzen baduzu, ikusiko duzu erregistro-sistemak ziurtatzen duela erregistro jakin bateko mezu bakoitza osagaiaren izenaren aurrizkia duela.

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

Orain ikus dezakezu UDP echo bezeroaren aplikaziotik datozen mezu guztiak horrela identifikatuta daudela. Mezua "Received 1024 bytes from 10.1.1.2" orain argi eta garbi identifikatzen da echo bezeroaren aplikaziotik datorrela. Gainerako mezuak UDP echo zerbitzariaren aplikaziotik etorri behar du. Osagai hau NS_LOG ingurune-aldagaian bi puntuz bereizitako osagaien zerrenda bat sartuz gaitu dezakegu.

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

Abisua: goiko adibideko testuan, bi puntuen (:) ondoren lerro berriko karakterea kendu beharko duzu, dokumentua formateatzeko erabiltzen da. Orain scripta exekutatzen baduzu, bezeroaren eta zerbitzariaren oihartzunaren aplikazioen erregistro-mezu guztiak ikusiko dituzu. Ikusten duzu hori oso erabilgarria izan daitekeela arazketan.

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

Era berean, batzuetan erabilgarria da erregistro-mezua sortu zen simulazio-ordua ikusi ahal izatea. Hau egin dezakezu OR bit gehituz aurrizkia_ordua:

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

Berriz ere, goiko lerro berriko karakterea kendu beharko duzu. Orain scripta exekutatzen baduzu, irteera hau ikusi beharko zenuke:

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

Kontuan izan for eraikitzailea dela UdpEchoServer 0 segundoko simulazioan deitu zen. Hau simulazioa hasi baino lehen gertatzen da, baina denbora zero segundo gisa erakusten da. Gauza bera gertatzen da eraikitzailearen mezuarekin 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()

Gogoratu gidoia urratu/lehen.cc simulazioa hasi baino segundo bat lehenago oihartzun zerbitzariaren aplikazioa abiarazi zuen. Orain metodo hori ikus dezakezu Hasi aplikazioa zerbitzariari benetan deitzen zaio lehenengo segundoan. Echo bezeroa simulazioaren bigarren segundoan hasten dela ere nabarituko duzu, scriptean eskatu genuen bezala.

Orain simulazioaren aurrerapena deian jarrai dezakezu ScheduleTransmit HandleRead callback deitzen duen bezeroan Bidali oihartzun zerbitzariaren aplikazioan. Kontuan izan puntuz puntuko estekaren bidez pakete bat bidaltzeko igarotako denbora 3,69 milisegundokoa dela. Ikus dezakezu oihartzun zerbitzariak paketeari erantzun dion mezu bat erregistratzen duela, eta gero, kanalaren atzerapen baten ondoren, ikusiko duzu echo bezeroak oihartzun paketea jasotzen duela bere HandleRead metodoan.

Simulazio honetan, asko gertatzen da zu ohartu gabe. Baina prozesu osoa oso erraz jarrai dezakezu sistemako erregistro-osagai guztiak gaituz. Saiatu NS_LOG aldagaia ondoko balioarekin ezartzen,

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

Goiko izartxoa erregistro-osagaiaren komodin karaktere bat da. Honek simulazioan erabilitako osagai guztietan sartuko ditu sarrera guztiak. Ez dut irteera hemen erreproduzituko (idazteko unean 1265 lerro sortzen ditu oihartzun pakete bakarrerako), baina informazio hau fitxategi batera birbideratu dezakezu eta zure editore gogokoenean ikus dezakezu.

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

Pertsonalki, arazoren bat dudanean eta gauzak oker non dauden ez dudanean erabiltzen dut saioaren bertsio oso zehatza. Kodearen exekuzioa nahiko erraz jarraitu dezaket eten-puntuak ezarri gabe eta arazketa-kodea urratsez urrats egin gabe. Irteera nire editore gogokoenean edita dezaket eta espero dudana bilatu eta espero ez nuen zerbait gertatzen dela ikusi. Oker dagoenaren ideia orokorra dudanean, arazketara salto egiten dut arazoa sakontzeko. Irteera mota hau bereziki erabilgarria izan daiteke zure gidoiak ustekabeko zerbait egiten duenean. Araztailea soilik erabiltzen baduzu, baliteke bira bat guztiz galtzea. Erregistratzeak halako birak nabaritzen ditu.

5.1.3 Zure kodeari saioa gehitzea

Sarrera berriak gehi ditzakezu zure simulazioetan erregistro-osagaiari deiak eginez hainbat makroetatik. Egin dezagun gidoi batean nirelehena.cc, "garbi" direktorioan daukaguna. Gogoratu agertoki honetan erregistro-osagai bat definitu genuela:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Badakizu osagai honen mezu guztien erregistroa gaitu dezakezula NS_LOG ingurune-aldagaia maila ezberdinetan ezarriz. Goazen eta gehitu gidoiari sarrera batzuk. Erregistroan informazio-mailako mezuak gehitzeko erabiltzen den makroa NS_LOG_INFO da. Gehitu dezagun mezu bat (nodoak sortzen hasi baino lehen) scripta "Topologia sortzea" fasean dagoela esaten dizuna. Hau kode zati honetan egiten da,
Ireki scratch/myfirst.cc zure editore gogokoenean eta gehitu lerroa,
NS_LOG_INFO ("Creating Topology");
lerroen aurretik,

NodeContainer nodes;
nodes.Create (2);

Orain konpilatu scripta erabiliz waf, eta garbitu NS_LOG aldagaia lehenago gaitu dugun erregistro-korrontea desgaitzeko:

$ ./waf
$ export NS_LOG=
Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли Π²Ρ‹ запуститС скрипт,
$ ./waf --run scratch/myfirst

Ez duzu mezu berria ikusiko erlazionatutako erregistro-osagaia (FirstScriptExample) ez dagoelako gaituta. Zure mezua ikusteko erregistro-osagaia gaitu behar duzu FirstScriptExample NS_LOG_INFO baino maila txikiagoa ez duena. Erregistro-maila zehatz hau ikusi nahi baduzu, honela gaitu dezakezu,

$ export NS_LOG=FirstScriptExample=info

Scripta orain exekutatzen baduzu, "Topologia sortzen" mezu berri bat ikusiko duzu.

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 Komando-lerroko argumentuak erabiltzea

5.2.1 Atributu-balio lehenetsiak gainidaztea

ns-3 scripten portaera aldatzeko beste modu bat editatu edo eraiki gabe komando lerroko argumentuak erabiltzea da. Komando-lerroko argumentuak analizatzeko eta emaitzetan oinarrituta aldagai lokalak eta globalak automatikoki ezartzeko mekanismo bat eskaintzen dugu.

Komando-lerroko argumentu-sistema erabiltzeko lehen urratsa komando-lerroko analizatzaile bat deklaratzea da. Hau nahiko erraza da egiteko (zure programa nagusian), hurrengo kodean bezala,

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

Bi lerroko zati sinple hau oso erabilgarria da berez. ns-3 aldagai eta atributu sistema globalari ateak irekitzen dizkio. Gehi ditzagun bi kode-lerro script funtzio nagusiaren hasieran scratch/myfirst.cc. Aurrera, script-a konpilatu eta exekutatzen dugu, exekutatzen denean laguntza eskaera bat egiten dugu honela,

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

Komando honek galdetuko du Waf exekutatu gidoia urratu/nirelehena eta pasatu komando-lerroko argumentu bat β€”Inprimatu Laguntza. Komatxoak behar dira argumentua zein programari zuzenduta dagoen adierazteko. Komando-lerroko analizatzaileak argumentua detektatuko du β€”Inprimatu Laguntza eta erantzuna erakutsiko du,

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.

Orain ikus dezagun aukera β€”Inprimatu atributuak. Lehen.cc script-a aztertzerakoan ns-3 atributu-sistema aipatu dugu. Kode lerro hauek ikusi ditugu,

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

eta hori esan zuten Datu-tasa benetan atributu bat da PointToPointNetDevice. Erabili dezagun komando-lerroko argumentuen analizatzailea atributuak ikusteko PointToPointNetDevice. Laguntza zerrendak zer eman behar dugun esaten du TypeId. Hau da intereseko atributuak dagozkion klasearen izena. Gure kasuan hala izango da ns3::PointToPointNetDevice. Jarrai dezagun aurrera, sartu,

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

Sistemak sareko gailu mota honen atributu guztiak inprimatuko ditu. Ikusiko duzu zerrendako atributuen artean daudela:

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

Hau da objektua sortzean sistemak erabiliko duen balio lehenetsia PointToPointNetDevice. Lehenetsitako balio hau parametroa erabiliz gainidatziko dugu Attribute Π² PointToPointHelper gorago. Erabili ditzagun puntuz puntuko gailu eta kanaletarako balio lehenetsiak. Horretarako, deiak ezabatuko ditugu EzarriDeviceAttribute ΠΈ EzarriChannelAttribute - nirelehena.cc, direktorio garbi batean daukaguna.

Zure script-ak orain besterik gabe deklaratu beharko luke PointToPointHelper eta ez egin instalazio-eragiketarik beheko adibidean erakusten den moduan,

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

Aurrera eta sortu gidoi berri bat Waf (./waff) eta itzul gaitezen eta sar gaitezen UDP oihartzun zerbitzariaren aplikazioko sarreraren bat eta sar dezagun denbora-aurrizkia.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

Scripta exekutatzen baduzu, irteera hau ikusi beharko zenuke:

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

Gogoratu simulazio-denbora aztertu genuen azken aldian, paketea oihartzun zerbitzariak jaso zuen momentuan, 2,00369 segundokoa izan zela.

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

Orain 2.25732 segundotan jasotzen du paketea. Hau da, PointToPointNetDevice datu-tasa berrezartzen dugulako bost megabit segundoko balio lehenetsira, hau da, 32768 bit segundoko. Komando-lerroa erabiliz DataRate berri bat ordezkatuko bagenu, gure simulazioa berriro bizkortu genezake. Honela egingo dugu, laguntza-elementuak inplikatzen duen formularen arabera:

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

Honek DataRate atributua segundoko bost megabit-eko balio lehenetsira itzuliko du. Harrituta al zaude emaitzarekin? Gertatzen da gidoiaren jatorrizko portaera itzultzeko, kanalaren atzerapena ere argiaren abiadurarekin bat etortzeko ezarri behar dugula. Komando-lerroko sistemari eska diezaiokegu kanalaren atributuak inprimatzeko, sareko gailuarekin egin genuen bezala:

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

Kanalaren atzerapenaren atributua honela ezarrita dagoela ikusiko dugu:

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

Orduan, komando-lerroko sistemaren bidez, balio lehenetsi horiek bi ezarri ditzakegu.

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

kasu honetan, DataRate eta Delay espresuki ezarri genituenean izan genuen denbora berreskuratuko dugu scriptean:

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

Kontuan izan paketea zerbitzariak berriro jasotzen duela 2,00369 segundo igaro ondoren. Gidoian erabilitako atributuetako edozein ezarri genezake horrela. Bereziki, MaxPackets atributuak bat ez diren balioetan ezar genitzake UdpEchoClient.

Nola erabiliko zenuke? Probatu. Gogoratu atributu-balio lehenetsia gainidazten eta esplizituki ezarri dugun lekua iruzkin behar duzula MaxPackets gidoian. Ondoren, gidoia berreraiki behar duzu. Komando-lerroa ere erabil dezakezu sintaxiaren laguntza lortzeko atributu-balio lehenetsi berri bat ezartzeko. Hori ulertzen duzunean, komando lerroan bistaratzen diren pakete kopurua kontrola dezakezu. Pertsona jakintsuak garenez, gure komando-lerroak honelako itxura izan beharko luke:

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

Puntu honetan sortzen den galdera naturala atributu horien guztien existentzia nola jakin da. Berriz ere, komando-lerroko sistemak laguntza funtzio bat du gai honetarako. Komando-lerroari laguntza eskatzen badiogu, ikusi beharko genuke:

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

"PrintGroups" argumentua hautatzen baduzu, erregistratutako talde guztien zerrenda ikusiko duzu TypeId. Taldeen izenak koherenteak dira iturburu-direktorioko moduluen izenekin (maiuskulaz idatzita egon arren). Informazio guztia aldi berean inprimatzea handiegia litzateke, beraz, iragazki gehigarri bat dago eskuragarri informazioa taldeka inprimatzeko. Beraz, berriro puntuz puntuko moduluan zentratuz:

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

Hemen erabilgarri dauden TypeId izenak aurki ditzakezu atributuen bilaketetarako, adibidez
--PrintAttributes = ns3 :: PointToPointChannelgoian erakusten den bezala.

Atributuak ezagutzeko beste modu bat Doxygen ns-3 bidez da. Simulagailuan erregistratutako atributu guztiak zerrendatzen dituen orrialde bat dago.

5.2.2 Zure komandoak harrapatzea

Zure amu propioak ere gehi ditzakezu komando lerroko sistemaren bidez. Hau besterik gabe egiten da komando lerroko analizatzaile metodoa erabiliz GehituBalioa.
Erabili dezagun funtzio hau guztiz beste modu batean bistaratu beharreko pakete kopurua zehazteko. Gehitu dezagun izeneko aldagai lokal bat nPaketeak funtzio batean sartu nagusia. Bat ezarriko dugu gure aurreko portaera lehenetsiarekin bat etor dadin. Komando-lerroko analizatzaileari balio hori alda dezan, balio hori analizatzailean jaso behar dugu. Dei bat gehituz egiten dugu GehituBalioa. Joan eta aldatu gidoia scratch/myfirst.cc beraz, hurrengo kodearekin hasteko,

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

Joan behera MaxPackets atributua ezartzen dugun script-aren punturaino eta aldatu nPackets aldagaian ezarrita egon dadin 1 konstantearen ordez, behean erakusten den moduan.

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

Orain script-a exekutatzen baduzu eta -PrintHelp argumentua ematen baduzu, erabiltzailearen argumentu berria ikusi beharko zenuke. laguntza pantailan agertzen dira. Sartu,

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

Igorritako pakete kopurua aldatu nahi baduzu, komando-lerroko argumentua ezarriz egin dezakezu -nPackets.

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

Orain ikusi beharko zenuke

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

Orain bi pakete bidali dituzu. Nahiko sinplea, ezta?
Ikus dezakezu ns-3 erabiltzaile gisa, komando lerroko argumentu sistema erabil dezakezula balio eta atributu globalak manipulatzeko. Ereduaren egilea bazara, atributu berriak gehi ditzakezu zure objektuei eta automatikoki erabilgarri egongo dira zure erabiltzaileek komando lerroko sistemaren bidez konfiguratzeko. Script-egilea bazara, aldagai berriak gehi ditzakezu zure scriptetan eta ezin hobeto konektatu zure komando-lerroko sisteman.

5.3 Trazadura-sistema erabiltzea

Modelizazioaren helburu osoa azterketa gehiagorako irteera sortzea da, eta ns-3 traza sistema da horretarako mekanismo nagusia. ns-3 C++ programa denez, C++ programa batetik irteera sortzeko bitarteko estandarrak erabil daitezke:

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

Erregistro-modulu bat ere erabil dezakezu zure soluzioari egitura txiki bat gehitzeko. Ikuspegi honek eragindako arazo ezagun asko daude, eta, horregatik, gertaeren trazadura azpisistema orokor bat eskaini dugu arazo hauek konpontzeko.

ns-3 trazatze sistemaren helburu nagusiak hauek dira:

  • Oinarrizko zereginetarako, trazatze-sistemak erabiltzaileari traza estandar bat sortzeko aukera eman behar dio iturri ezagunetarako eta arrastoa sortzen duten objektuak hautatzeko;

  • Bitarteko erabiltzaileek trazamendu-sistema hedatu ahal izango dute sortutako irteera-formatua aldatzeko edo arrasto-iturri berriak txertatzeko, simulagailuaren nukleoa aldatu gabe;

  • Erabiltzaile aurreratuek simulagailuaren nukleoa alda dezakete arrasto-iturri eta konketa berriak gehitzeko. ns-3 trazatze-sistema jarraipen-iturri eta hargailu independenteen printzipioetan eraikita dago, baita iturriak kontsumitzaileei konektatzeko mekanismo bateratu batean ere.

ns-3 trazatze-sistema trazamendu-iturri eta hargailu independenteen printzipioetan eraikita dago, baita iturriak hargailuetara konektatzeko mekanismo bateratu batean ere. Aztarna-iturriak simulazioan gertatzen diren gertaerak seinalezta ditzaketen objektuak dira eta azpian dauden datu interesgarrietarako sarbidea eman dezakete. Esate baterako, arrasto-iturburu batek sareko gailu batek pakete bat noiz jaso duen adieraz dezake eta paketearen edukia aztarna-hartzaile interesdunen eskura jarri dezake.

Aztarna iturriek berez ez dute ezertarako balio, kodeak emandako informazioarekin benetan zerbait erabilgarria egiten duten kodearen beste zati batzuekin "konbinatuta" ez badaude. Trazatzaileak aztarna iturriek emandako gertaeren eta datuen kontsumitzaileak dira. Adibidez, jasotako paketearen interes-zatiak inprimatuko dituen (aurreko adibideko arrasto-iturburura konektatuta dagoenean) arrasto-hustu bat sor dezakezu.

Bereizketa esplizitu honen arrazoia erabiltzaileei konketa mota berriak lehendik dauden arrasto-iturrietara konektatzea da, simulagailuaren nukleoa editatu eta birkonpilatu beharrik gabe. Beraz, goiko adibidean, erabiltzaileak trazatzaile berri bat definitu dezake bere scriptean eta simulazio nukleoan definitutako lehendik dagoen arrasto-iturburu batera konektatu erabiltzailearen script-a editatuz soilik.

Tutorial honetan, aurrez zehaztutako iturri eta konketa batzuk aztertuko ditugu eta erabiltzailearen esfortzu txikienarekin nola konfigura daitezkeen erakutsiko dugu. Ikus ns-3 eskuliburua edo nola egin atalak aztarnaren konfigurazio aurreratuari buruzko informazioa lortzeko, traza izen-espazioa zabaltzea eta arrasto-iturburu berriak sortzea barne.

5.3.1 ASCII Trazadura

ns-3-k maila baxuko trazamendu-sistema eskaintzen duen laguntzaile funtzionaltasuna eskaintzen du, paketeen arrasto sinpleak konfiguratzen dituzunean xehetasunekin laguntzeko. Ezaugarri hau gaitzen baduzu, irteera ASCII fitxategietan ikusiko duzu. ns-2 irteera ezagutzen dutenentzat, arrasto mota hau antzekoa da kanpoan.tr, script askok sortzen dutena.

Jar gaitezen lanean eta gehi ditzagun ASCII trazamenduaren emaitza batzuk gure scratch/myfirst.cc script-ari. Deia baino lehen Simulator :: Run (), gehitu kode lerro hauek:
AsciiTraceHelper ascii;

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

Beste ns-3 esamolde askok bezala, kode honek objektu laguntzaile bat erabiltzen du ASCII arrastoak sortzeko. Bigarren lerroak bi metodo-dei habiaratu ditu. "Barruan" metodoa SortuFileStream() objektu anonimoa erabiltzen du pilan fitxategi-korrontearen objektu bat sortzeko (objektu-izenik gabe) eta deitutako metodora pasatzen du. Etorkizunean sakonduko dugu, baina une honetan jakin behar duzun guztia da izeneko fitxategi bat adierazten duen objektu bat sortzen ari zarela. nirelehena.tr eta transferitu ns-3ra. Ns-3-ri agintzen diogu sortutako objektua bere bizitza osoan zaintzea, eta C++ korronteko objektuen kopia eraikitzaileekin lotutako muga gutxi ezagutzen (nahita) eragindako arazoak konpontzen ditu.

Kanpoko deia EnableAsciiAll() laguntzaileari esaten dio zure simulazioan ASCII traza sartu nahi duzula puntuz puntuko gailu konexio guztietarako eta (zehaztutako) traza-hartzaileek paketeen mugimenduaren informazioa ASCII formatuan grabatzea nahi duzula.

Ns-2 ezagutzen dutenentzat, jarraipenaren gertaerak "+", "-", "d" eta "r" gertaerak erregistratzen dituzten aztarna-puntu ezagunen baliokideak dira.
Orain script-a eraiki dezakezu eta komando-lerrotik exekutatu:

$ ./waf --run scratch/myfirst

Lehen askotan bezala, Waf-en hainbat mezu ikusiko dituzu, eta "'eraikitzea' arrakastaz amaitu da" exekutatzen ari den programaren mezu batzuekin.

Exekutatzen denean, programak izeneko fitxategi bat sortuko du nirelehena.tr. Lanaren izaera dela eta Waf, lehenespenez fitxategia ez da direktorio lokalean sortzen, biltegiaren goi-mailako direktorioan baizik. Aztarnak gordetzen diren bidea aldatu nahi baduzu, Waf parametroa erabil dezakezu hura zehazteko --cwd. Ez dugu hau egin, beraz, zure gogoko editorean myfirst.tr ASCII aztarna-fitxategia ikusteko, gure biltegiko goi-mailako direktoriora nabigatu beharko dugu.

ASCII arrastoak analizatzea

Informazio asko dago hor forma nahiko trinko batean, baina konturatu behar duzun lehenengo gauza da fitxategia lerro bakarrez osatuta dagoela. Hau argi eta garbi ikusiko da ikusteko leihoa zabaltzen baduzu.

Fitxategiko lerro bakoitza arrasto-gertaera bati dagokio. Kasu honetan, simulazioan puntuz puntuko sareko gailu bakoitzean dagoen transmisio-ilarako gertaerak jarraitzen ditugu. Transmisio-ilara pakete bakoitzak puntuz puntuko lotura baterako igaro behar duen ilara da. Kontuan izan traza-fitxategiko lerro bakoitza karaktere bakar batekin hasten dela (eta zuriune bat duela ondoren). Ikur honek esanahi hau izango du:

+: ilara-eragiketa bat gertatu da gailuaren ilaran;
-: elementua berreskuratzeko eragiketa bat gertatu da gailuaren ilaran;
d: paketea bota egin zen, normalean ilara beteta zegoelako;
r: paketea sareko gailu batek jaso du.

Ikus dezagun hurbilagotik traza fitxategiko lehen lerroa. Zatitan banatuko dut (argitasunerako koskarekin) eta ezkerreko lerroaren zenbakia:

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)

Aztarna-gertaera hedatu honen lehenengo atala (0 lerroa) eragiketa da. + ikurra dugu hemen, transmisiorako ilaran jartzeko eragiketari dagokiona. Bigarren atala (1. lerroa) simulazio-denbora da, segundotan adierazita. Galdetu genuena gogoratuko duzu UdpEchoClientApplication hasi paketeak bi segundotan bidaltzen. Hemen hau egiaz gertatzen ari dela baieztatzea ikusten dugu.

Traza adibidearen hurrengo atalean (2. lerrotik) gertaera hau zein arrasto-iturburuk sortu duen erakusten du (izenen espazioaren arrastoa adieraziz). Traza izen-espazioan pentsa dezakezu fitxategi-sistemaren izen-espazio bat bezala. Izen-eremuaren erroa da NodoenLista. Hau ns-3 kode nagusian kudeatutako edukiontziari dagokio. Scriptean sortzen diren nodo guztiak ditu. Fitxategi-sistema batek bere erroan direktorioak izan ditzakeen bezala, NodoenLista nodo asko izan ditzakegu. Beraz, /NodeList/0 lerroak NodeList-eko nodo nuluari egiten dio erreferentzia, normalean "0 nodoa" dela uste duguna. Nodo bakoitzak instalatutako gailuen zerrenda dauka. Zerrenda hau izen-eremuan dago ondoan. Aztarna-gertaera hau batetik datorrela ikus dezakezu GailuenLista/0, hau da, nodoan instalatutako gailu nulua.

Hurrengo azpikatea, $ ns3 :: PointToPointNetDevice, zein gailu dagoen zero posizioan esaten du: zero nodoaren gailuen zerrenda. Gogoratu 0 lerroan aurkitutako + eragiketak esan nahi zuela elementu bat gehitu zela gailuaren transmisio-ilarara. Hau "track-bidearen" azken zatietan islatzen da: TxQueue/Enqueue.

Trazako gainerako atalek nahiko intuitiboak izan behar dute. 3-4 lerroek paketea puntuz puntuko protokolo batean kapsulatu dela adierazten dute. 5-7 lerroek erakusten dute paketeak IP4 bertsioaren goiburua duela eta IP helbidean du jatorria 10.1.1.1 eta zuzenduta dago 10.1.1.2. 8-9 lerroek pakete honek UDP goiburua duela erakusten du eta azkenik 10. lerroak erakusten du karga karga espero den 1024 byte dela.

Traza-fitxategiko hurrengo lerroak pakete bera nodo bereko transmisio-ilaratik atera zela erakusten du.

Traza-fitxategiko hirugarren lerroak paketea oihartzun zerbitzariaren ostalari sareko gailu batek jaso duela erakusten du. Gertaera behean erreproduzitu dut.

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)

Kontuan izan traza-eragiketa orain r dela eta simulazio-denbora 2,25732 segundora igo dela. Tutoriala arretaz jarraitu baduzu, horrek esan nahi du sareko gailuen DataRate eta Link Delay bere balio lehenetsietan utzi dituzula. Denbora hau ezaguna izan behar da, aurreko atalean ikusi duzun bezala.

Traza-iturburuko izen-espazioko sarrera (2. lerroa) aldatu egin da gertaera hau 1. nodotik datorrela islatzeko (/NodoenLista/1) eta paketea aztarna iturriak jasotzen du (/MacRx). Nahiko erraza izan beharko zenuke paketearen mugimendua topologian jarraitzea fitxategian geratzen diren arrastoei begiratuz.

5.3.2 PCAP Traza

ns-3 Device Helpers ere erabil daiteke .pcap formatuan traza fitxategiak sortzeko. Akronimoa pkap (normalean minuskulaz idatzita) paketeen harrapaketa adierazten du eta .pcap fitxategi formatua definitzen duen API bat da. Formatu hau irakurri eta bistaratu dezakeen programa ezagunena da Wireshark (aurretik deitua etereo). Hala ere, asko dira pakete-formatu hau erabiltzen duten trafiko-aztarnak aztertzaile. Erabiltzaileei gomendatzen diegu eskuragarri dauden tresna ugari erabil ditzatela pcap arrastoak aztertzeko. Tutorial honetan pcap arrastoak erabiliz ikustera bideratuko gara tcpdump.

pcap trazamendua gaitzea kode lerro batekin egiten da.

pointToPoint.EnablePcapAll ("myfirst");

Itsatsi kode-lerro hau gehitu berri dugun ASCII traza-kodearen ondoren scratch/myfirst.cc. Kontuan izan "myfirst" katea bakarrik pasatu dugula, ez "myfirst.pcap" edo antzekorik. Hau da, parametroa aurrizki bat delako, ez fitxategi-izen osoa. Simulazioan zehar, laguntzaileak puntuz puntuko gailu bakoitzeko arrasto-fitxategi bat sortuko du. Fitxategi-izenak aurrizkia, nodo-zenbakia, gailu-zenbakia eta atzizkia erabiliz eraikiko dira.pkap'.

Gure adibideko script-erako, azkenean " izeneko fitxategiak ikusiko ditugumyfirst-0-0.pcap"Eta"myfirst-1-0.pcap", pcap arrastoak 0-gailu nodoaren 0 eta 1-gailuaren nodoaren 0 hurrenez hurren. Kode-lerroa gehitu ondoren pcap trazamendua gaitzeko, script-a ohiko moduan exekutatu dezakezu:

$ ./waf --run scratch/myfirst

Zure banaketaren goi-mailako direktoriora begiratzen baduzu, hiru fitxategi ikusiko dituzu: ASCII traza fitxategia nirelehena.tr, aurretik aztertu ditugunak, fitxategiak myfirst-0-0.pcap ΠΈ myfirst-1-0.pcap - Sortu berri ditugun pcap fitxategi berriak.

Irteera irakurtzen tcpdump-rekin

Oraingoz, pcap fitxategiak ikusteko modurik errazena tcpdump erabiltzea da.

$ 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

Zabortegian myfirst-0-0.pcap (bezeroaren gailua) oihartzun paketea 2 segundo simulazioaren ondoren bidaltzen dela ikus dezakezu. Bigarren zabortegiari erreparatzen badiozu (myfirst-1-0.pcap), paketea 2,257324 segundotan jasotzen dela ikusiko duzu. Bigarren zabortegian ikusiko duzu paketea 2.257324 segundotan itzultzen dela eta, azkenik, paketea bezeroak 2.514648 segundotan jaso duela lehengo zabortegian.

Irteera irakurtzea Wireshark-ekin

Ez baduzu ezagutzen Wireshark, programak eta dokumentazioa deskargatzeko webgune bat dago: http://www.wireshark.org/. Wireshark arrasto-fitxategi hauek bistaratzeko erabil daitekeen GUI bat da. Wireshark baduzu, edozein arrasto-fitxategi ireki dezakezu eta edukia bistaratu paketeen sniffer bat erabiliz paketeak harrapatuko balitu bezala.

Iturria: www.habr.com

Gehitu iruzkin berria