okokufundisa kwesilingisi senethiwekhi ye-ns-3. Isahluko 5

okokufundisa kwesilingisi senethiwekhi ye-ns-3. Isahluko 5
Isahluko 1,2
Isahluko 3
Isahluko 4

5 Izilungiselelo
5.1 Ukusebenzisa imojula yokungena
5.1.1 Uhlolojikelele lokugawulwa kwemithi
5.1.2 Vumela ukugawulwa kwemithi
5.1.3 Ukwengeza ukungena kwikhodi yakho
5.2 Ukusebenzisa izimpikiswano zomugqa womyalo
5.2.1 Ukweqa amanani ezibaluli ezimisiwe
5.2.2 Ukuthwebula eyakho imiyalo
5.3 Ukusebenzisa uhlelo lokulandela umkhondo
5.3.1 Ukulandelela i-ASCII
Ukuhlaziya imikhondo ye-ASCII
5.3.2 I-PCAP Trace

Isahluko 5

Yenza ngokwezifiso

5.1 Ukusebenzisa imojula yokungena

Sesivele sibheke kafushane imojula yokungena ye-ns-3 ngokubheka umbhalo kuqala.cc. Kulesi sahluko, sizobhekisisa ukuthi kungenzeka kusetshenziswe kanjani isistimu engaphansi yokugawulwa kwemithi.

5.1.1 Uhlolojikelele lokugawulwa kwemithi

Amasistimu amaningi amakhulu asekela uhlobo oluthile lokungena kwemiyalezo, futhi i-ns-3 iyafana. Kwezinye izimo, imilayezo yephutha kuphela ebhalwa "ku-opharetha console" (okuvame ukuba yi-stderr kumasistimu asekelwe ku-Unix). Kwamanye amasistimu, imilayezo eyisixwayiso ingase iboniswe kanye nolwazi oluningiliziwe. Kwezinye izimo, amathuluzi okuloga asetshenziselwa ukukhipha imilayezo yokususa iphutha engafiphalisa ngokushesha okukhiphayo.

I-subHRD esetshenziswe ku-ns-3 ithatha ngokuthi wonke la mazinga wokuqukethwe kolwazi awusizo, futhi sinikeza indlela ekhethiwe, enezingqimba ekungeneni komlayezo. Ukungena ngemvume kungakhutshazwa ngokuphelele, kunikwe amandla ngokwesisekelo sengxenye ngayinye, noma emhlabeni jikelele. Ngale njongo, kusetshenziswa amazinga alungisekayo wokuqukethwe kolwazi. Imojula ye-ns-3 yokugawula ihlinzeka ngendlela elula yokuthola ulwazi oluwusizo ekulingiseni kwakho.

Kufanele uqonde ukuthi sinikeza indlela yenhloso evamile - ukulandelela - yokukhipha idatha kumamodeli akho, okufanele kube okukhiphayo okuncanyelwayo kokulingisa (ukuthola ulwazi olwengeziwe ngesistimu yethu yokulandelela, bheka isigaba sokufundisa 5.3). Ukungena ngemvume kufanele kube indlela ekhethwayo yokuthola ulwazi lokulungisa iphutha, izexwayiso, imilayezo yamaphutha, noma ukukhipha ngokushesha imilayezo evela kumbhalo wakho noma amamodeli nganoma yisiphi isikhathi.

Okwamanje, isistimu ichaza amaleveli ayisikhombisa (izinhlobo) zemilayezo yokungena ngohlelo olukhulayo lokuqukethwe kolwazi.

  • LOG_ERROR - imilayezo yephutha lokungena (i-macro ehlobene: NS_LOG_ERROR);
  • LOG_WARN - Imilayezo yesexwayiso yelogi (i-macro ehlobene: NS_LOG_WARN);
  • LOG_DEBUG - Faka imilayezo ekhethekile yokususa iphutha eyivelakancane (i-macro ehlobene: NS_LOG_DEBUG);
  • LOG_INFO - ukubhaliswa kwemiyalezo yolwazi mayelana nokuqhubeka kohlelo (i-macro ehlobene: NS_LOG_INFO);
  • LOG_FUNCTION - Imilayezo yamalogu echaza umsebenzi ngamunye obizwa (amamakhro amabili ahlobene: NS_LOG_FUNCTION, asetshenziselwa imisebenzi yamalungu, kanye ne-NS_LOG_FUNCTION_NOARGS, esetshenziselwa imisebenzi emile);
  • LOG_LOGIC - imilayezo yokungena echaza ukugeleza okunengqondo ngaphakathi komsebenzi (i-macro ehlobene: NS_LOG_LOGIC);
  • LOG_ALL - Ifaka yonke into eshiwo ngenhla (ayikho imakhro ehlobene).
    Ohlotsheni ngalunye (LOG_TYPE) kukhona ne-LOG_LEVEL_TYPE okuthi, uma isetshenziswa, ivumele wonke amaleveli angaphezulu kwayo ukuthi afakwe ngaphezu kweleveli yawo. (Ngakho-ke, LOG_ERROR kanye ne-LOG_LEVEL_ERROR, kanye ne-LOG_ALL kanye ne-LOG_LEVEL_ALL ziyalingana ngokusebenza.) Ngokwesibonelo, ukunika amandla i-LOG_INFO kuzovumela kuphela imilayezo ehlinzekwe yi-NS_LOG_INFO macro, kuyilapho inika amandla i-LOG_LEVEL_INFO izophinda ihlanganise imilayezo ehlinzekwe yi-LOG_LOGGRN_BUNS_BURNS.

Siphinde futhi sinikeze ngemakhro yokugawulwa kwemithi engenamibandela ehlala iboniswa, kungakhathaliseki izinga lokungena noma ingxenye yokukhetha.

  • NS_LOG_UNCOND - Ukungena ngemvume okungenamibandela komlayezo ohlobene (alikho izinga lokungena elihlobene).

Ileveli ngayinye ingabuzwa ngayodwa noma ngokuqoqeka. Ukungena ngemvume kungalungiselelwa kusetshenziswa okuguquguqukayo kwemvelo okuthi sh NS_LOG noma ngokungena ucingo lomsebenzi wesistimu. Njengoba kubonisiwe ekuqaleni, uhlelo lokugawula lunemibhalo ye-Doxygen futhi manje yisikhathi esihle sokuyibuyekeza uma ungakakwenzi.

Manje njengoba usuwafunde ngokuningiliziwe amadokhumenti, masisebenzise lolo lwazi ukuze sithole ulwazi oluthakazelisayo oluvela kuskripthi esiyisibonelo. scratch/myfirst.ccosuvele uyihlanganisile.

5.1.2 Vumela ukugawulwa kwemithi

Masisebenzise i-NS_LOG eguquguqukayo yemvelo ukuze siqhube amanye amalogi, kodwa okokuqala, ukuze uthole ama-bearings akho, sebenzisa umbhalo wokugcina njengoba wenzile ekuqaleni,

$ ./waf --run scratch/myfirst

Kufanele ubone okukhiphayo okuvamile kuhlelo lokuqala lwesibonelo lwe-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

Kuvele ukuthi imilayezo "ethunyelwe" kanye "neyamukelwe" oyibona ngenhla iyimiyalezo engeniwe evela ku UdpEchoClientApplication и UdpEchoServerApplication. Isibonelo, singacela uhlelo lokusebenza lweklayenti ukuthi liphrinte ulwazi olwengeziwe ngokusetha ileveli yalo yokungena ngokuhlukahluka kwemvelo ye-NS_LOG.

Kusukela manje kuqhubeke, ngizocabanga ukuthi usebenzisa igobolondo elifana no-sh esebenzisa i-syntax ethi "VARIABLE=value". Uma usebenzisa igobolondo elifana ne-csh, kuzodingeka ukuthi uguqule izibonelo zami zibe i-syntax ethi "setenv variable value" edingwa yilawo magobolondo.

Okwamanje, isicelo seklayenti le-UDP echo siphendula kulayini olandelayo wekhodi ku scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

Inika amandla ileveli yokungena engu-LOG_LEVEL_INFO. Uma sidlula ifulegi lezinga lokungena, empeleni sivumela lelo zinga nawo wonke amazinga aphansi. Kulesi simo, sivumele i-NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN kanye ne-NS_LOG_ERROR. Singakwazi ukukhuphula izinga lokungena futhi sithole ulwazi olwengeziwe, ngaphandle koshintsho lweskripthi nokuhlanganiswa kabusha, ngokusetha ukuguquguquka kwemvelo ye-NS_LOG ngale ndlela elandelayo:

$ export NS_LOG=UdpEchoClientApplication=level_all

Ngakho-ke sibeka i-sh shell variable NS_LOG kunani elilandelayo,

UdpEchoClientApplication=level_all

Uhlangothi lwesobunxele lomsebenzi ozokwenziwa yigama lengxenye efakiwe esifuna ukuyilungisa, futhi uhlangothi lwesokudla yifulegi esifuna ukulifaka isicelo. Kulokhu, sizovumela wonke amazinga okulungisa iphutha kuhlelo lokusebenza. Uma usebenzisa iskripthi nge-NS_LOG esethwe ngale ndlela, isistimu yokungena ye-ns-3 izokwamukela izinguquko futhi kufanele ubone okukhiphayo okulandelayo:

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

Ulwazi olwengeziwe lokususa iphutha olunikezwe uhlelo lokusebenza manje lusezingeni NS_LOG_FUNCTION. Ibonisa zonke izenzakalo zekholi yomsebenzi ngesikhathi sokwenziwa kombhalo. Njengomthetho ojwayelekile, emisebenzini yendlela kungcono ukuyisebenzisa (okungenani)NS_LOG_FUNCTION (this)... Sebenzisa NS_LOG_FUNCTION_NOARGS ()
kuphela emisebenzini emile. Nokho, qaphela ukuthi isistimu ye-ns-3 ayidingekile ukuze isekele noma yimuphi umsebenzi wokugawula. Isinqumo mayelana nokuthi lungakanani ulwazi olurekhodiwe sishiyelwa kunjiniyela wemodeli ngayinye. Endabeni yezinhlelo zokusebenza ze-echo, inani elikhulu lokuphuma kwemithi liyatholakala.

Manje usungabuka ilogi yezingcingo ezisebenzayo ezenziwe uhlelo lokusebenza. Uma ubhekisisa, uzobona ikholoni phakathi komugqa UdpEchoClientApplication kanye negama lendlela, lapho ongalindela khona ukubona u-opharetha wesikophu se-C++ (: :). Lokhu ngamabomu.

Leli akulona igama lekilasi empeleni, kodwa igama lengxenye yokugawula. Uma kunokufana phakathi kwefayela lomthombo nekilasi, ngokuvamile igama lekilasi, kodwa kufanele uqaphele ukuthi empeleni akulona igama lekilasi, futhi kunekholoni eyodwa esikhundleni sekholoni ekabili. Lena indlela yokukusiza ukuthi uhlukanise ngokomqondo igama likabhontshisi wokugawula egameni lekilasi ngendlela ecashile uma kuqhathaniswa.

Nokho, kwezinye izimo kungase kube nzima ukunquma ukuthi iyiphi indlela ekhiqiza umlayezo welogi. Uma ubheka umbhalo ongenhla, kungenzeka uyazibuza ukuthi ulayini "Received 1024 bytes from 10.1.1.2" Ungakwazi ukuxazulula le nkinga ngokusetha izinga isiqalo_func kokuguquguquka kwemvelo kwe-NS_LOG. Zama lokhu okulandelayo:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

Qaphela ukuthi izimpawu zokucaphuna ziyadingeka ngoba ibha eqondile esiyisebenzisayo ukumela umsebenzi NOMA futhi iyisixhumi sepayipi le-Unix. Manje uma usebenzisa iskripthi, uzobona ukuthi uhlelo lokungena luqinisekisa ukuthi wonke umlayezo kulogi enikeziwe unesiqalo negama lengxenye.

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

Manje ungabona ukuthi yonke imilayezo evela kuhlelo lokusebenza lweklayenti le-UDP ihlonzwa kanjalo. Umlayezo "Received 1024 bytes from 10.1.1.2"Manje ikhonjwa ngokusobala njengevela kuhlelo lokusebenza lweklayenti le-echo. Umlayezo osele kufanele uvele kuhlelo lokusebenza lweseva ye-UDP echo. Singanika le ngxenye amandla ngokufaka uhlu oluhlukaniswe ngekholoni lwezingxenye kokuhlukahluka kwemvelo kwe-NS_LOG.

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

Isexwayiso: Embhalweni oyisibonelo ongenhla, uzodinga ukukhipha uhlamvu lomugqa omusha ngemva kwekholoni (:), lusetshenziselwa ukufometha idokhumenti. Manje uma usebenzisa iskripthi, uzobona yonke imilayezo yelogi evela kuklayenti nezinhlelo zokusebenza ze-echo zeseva. Ungabona ukuthi lokhu kungaba usizo kakhulu lapho ususa iphutha.

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

Kuyasiza futhi kwesinye isikhathi ukukwazi ukubona isikhathi sokulingisa lapho umlayezo welogi owenziwe khona. Ungakwenza lokhu ngokungeza i-OR bit isiqalo_isikhathi:

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

Futhi, kuzodingeka ususe uhlamvu lomugqa omusha olungenhla. Uma manje usebenzisa iskripthi kufanele ubone okukhiphayo okulandelayo:

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

Sicela uqaphele ukuthi umakhi we UdpEchoServer yabizwa ngesikhathi sokulingisa imizuzwana engu-0. Lokhu kwenzeka ngempela ngaphambi kokuqala kokulingisa, kodwa isikhathi siboniswa njengemizuzwana eyiziro. Kungokufanayo nangomlayezo womakhi 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()

Khumbula ukuthi iskripthi scratch/first.cc iqale uhlelo lokusebenza lweseva ye-echo umzuzwana owodwa ngaphambi kokuqala kokulingisa. Manje usuyabona ukuthi le ndlela StartApplication iseva empeleni ibizwa ngesekhondi lokuqala. Ungase futhi uqaphele ukuthi iklayenti le-echo liqala ngomzuzwana wesibili wokulingisa, njengoba sibuze embhalweni.

Manje usungakwazi ukulandela inqubekelaphambili yokulingisa ocingweni HlelaTransmit kuklayenti elishayela i-HandleRead callback Thumela uhlelo lweseva ye-echo. Qaphela ukuthi isikhathi esidlulile sokuthumela iphakethe ngesixhumanisi sephoyinti nephoyinti singama-millisecond angu-3,69. Ungabona ukuthi iseva ye-echo ifaka umlayezo owuphendulile ephaketheni, bese, ngemva kokubambezeleka kwesiteshi, ubona ukuthi iklayenti le-echo lithola iphakethe le-echo ngendlela yalo ye-HandleRead.

Kulesi sifaniso, kuningi okwenzekayo ngaphandle kokuqaphela. Kodwa ungakwazi ukulandelela yonke inqubo kalula kakhulu ngokunika amandla zonke izingxenye zokungena ohlelweni. Zama ukusetha i-NS_LOG eguquguqukayo enanini elilandelayo,

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

Inkanyezi engenhla iwuhlamvu lwe-wildcard lwengxenye yokungena. Lokhu kuzobandakanya konke okufakiwe kuzo zonke izingxenye ezisetshenziswa ekufanisweni. Ngeke ngikhiqize kabusha okukhiphayo lapha (ngesikhathi sokubhala ikhiqiza imigqa yokukhipha engu-1265 yephakethe elilodwa le-echo), kodwa ungakwazi ukuqondisa kabusha lolu lwazi efayeleni futhi ulibuke kumhleli owuthandayo.

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

Mina mathupha ngisebenzisa le nguqulo ye-verbose kakhulu yokugawulwa kwemithi lapho nginenkinga futhi ngingazi ukuthi izinto zonakale kuphi. Ngingakwazi ukulandela ukukhishwa kwekhodi kalula ngaphandle kokusetha izindawo zokunqamuka kanye nokudlula ikhodi kusikhiphi. Ngingavele ngihlele okukhiphayo kusihleli sami esiyintandokazi futhi ngibheke engikulindele futhi ngibone kwenzeka okuthile engangingakulindele. Uma senginombono ojwayelekile wokuthi kwenzakalani, ngigxumela ku-debugger ukuze ngingene enkingeni. Lolu hlobo lokukhiphayo lungaba usizo ikakhulukazi uma iskripthi sakho senza okuthile obekungalindelwe nhlobo. Uma usebenzisa i-debugger kuphela, ungase uphuthelwe i-twist ngokuphelele. Ukubhalisa kwenza ukujika okunjalo kubonakale.

5.1.3 Ukwengeza ukungena kwikhodi yakho

Ungangeza okufakiwe okusha ezilinganisweni zakho ngokwenza izingcingo engxenyeni yelogi kusuka kumamakhro amaningi. Masikwenze embhalweni myfirst.cc, esinalo kuhla lwemibhalo "elihlanzekile". Khumbula ukuthi sichaze ingxenye yokugawulwa kwemithi kulesi simo:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Uyazi ukuthi ungakwazi ukunika amandla ukungena kuyo yonke imilayezo evela kule ngxenye ngokusetha i-NS_LOG eguquguqukayo yemvelo kumazinga ahlukene. Asiqhubeke futhi sengeze okunye okufakiwe embhalweni. Imakhro esetshenziswa ukwengeza imilayezo yezinga lolwazi kulogi ithi NS_LOG_INFO. Ake sengeze umlayezo (ngaphambi nje kokuthi siqale ukudala amanodi) okutshela ukuthi umbhalo usesigabeni "sokudala i-Topology". Lokhu kwenziwa kumazwibela ekhodi alandelayo,
Vula scratch/myfirst.cc kumhleli wakho owuthandayo bese wengeza umugqa,
NS_LOG_INFO ("Creating Topology");
ngaphambi kwemigqa,

NodeContainer nodes;
nodes.Create (2);

Manje hlanganisa iskripthi usebenzisa waf, futhi usule okuhlukile kwe-NS_LOG ukuze ukhubaze ukusakaza kokungena esikunikeze amandla ngaphambili:

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

Ngeke uwubone umlayezo omusha ngoba ingxenye yokungena ehlobene (FirstScriptExample) ayinikiwe amandla. Ukuze ubone umlayezo wakho udinga ukunika amandla ingxenye yokungena FirstScriptExample ngezinga elingekho ngaphansi kuka-NS_LOG_INFO. Uma nje ufuna ukubona leli zinga elithile lokungena, ungalivumela kanje,

$ export NS_LOG=FirstScriptExample=info

Uma usebenzisa iskripthi manje, uzobona umlayezo omusha "Ukudala I-Topology",

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.404s)
Creating Topology
Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
Received 1024 bytes from 10.1.1.2

5.2 Ukusebenzisa izimpikiswano zomugqa womyalo

5.2.1 Ukweqa amanani ezibaluli ezimisiwe

Enye indlela yokuguqula ukuziphatha kwemibhalo ye-ns-3 ngaphandle kokuhlela noma ukwakha ukusebenzisa izimpikiswano zomugqa womyalo. Sihlinzeka ngendlela yokuhlaziya ama-agumenti emugqa womyalo futhi simise ngokuzenzakalelayo okuguquguqukayo kwasendaweni nokomhlaba ngokusekelwe emiphumeleni.

Isinyathelo sokuqala ekusebenziseni i-agumenti yomugqa womyalo ukumemezela umhlaseli womugqa womyalo. Lokhu kulula kakhulu ukukwenza (kuhlelo lwakho oluyinhloko), njengakukhodi elandelayo,

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

Lawa mazwibela alula anemigqa emibili empeleni awusizo kakhulu ngokwawo. Ivula umnyango we-ns-3 global variable kanye nesistimu yesibaluli. Ake sengeze imigqa emibili yekhodi ekuqaleni komsebenzi weskripthi oyinhloko scratch/myfirst.cc. Ukuqhubekela phambili, sihlanganisa umbhalo bese siwusebenzisa, lapho sisebenza senza isicelo sosizo kanje,

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

Lo myalo uzobuza I-Waf sebenzisa iskripthi ukuklwebha/kwami ​​kuqala bese uyidlulisa ingxabano yomugqa womyalo -PrintHelp. Izimpawu zokucaphuna ziyadingeka ukuze kuboniswe ukuthi i-agumenti ihloselwe yiluphi uhlelo. Umhlahleli womugqa womyalo uzobona impikiswano -PrintHelp futhi sizobonisa impendulo,

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.

Manje ake sibheke inketho -PrintAttributes. Sesivele siyishilo ngohlelo lwesibaluli se-ns-3 lapho sifunda umbhalo wokuqala.cc. Sibone imigqa yekhodi elandelayo,

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

basho lokho DataRate empeleni iyisibaluli I-PointToPointNetDevice. Masisebenzise i-agumenti yomugqa womyalo ukuze sibuke izici I-PointToPointNetDevice. Uhlu losizo lusho lokho okufanele sikunikeze I-TypeId. Leli igama lesigaba lapho izibaluli zentshisekelo ziyingxenye yaso. Esimeni sethu kuzoba njalo ns3::PointToPointNetDevice. Asiqhubeke siye phambili, ngena,

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

Isistimu izophrinta zonke izibaluli zalolu hlobo lwedivayisi yenethiwekhi. Uzobona ukuthi phakathi kwezimfanelo ezisohlwini kukhona,

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

Leli inani elizenzakalelayo elizosetshenziswa isistimu lapho udala into I-PointToPointNetDevice. Sizokhipha leli nani elizenzakalelayo sisebenzisa ipharamitha izimfanelo в I-PointToPointHelper ngaphezulu. Masisebenzise amanani azenzakalelayo kumadivayisi wephoyinti nephoyinti namashaneli. Ukuze senze lokhu, sizosusa amakholi SetDeviceAttribute и SetChannelAttribute kusuka ku myfirst.cc, esinalo kuhla lwemibhalo oluhlanzekile.

Isikripthi sakho manje kufanele sivele sisho I-PointToPointHelper futhi ungenzi noma yimiphi imisebenzi yokufaka njengoba kukhonjisiwe esibonelweni esingezansi,

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

Qhubeka udale iskripthi esisha nge I-Waf (./waf) futhi masibuyele emuva futhi sifake okunye okufakwayo okuvela kuhlelo lokusebenza lweseva ye-UDP futhi sihlanganise nesiqalo sesikhathi.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

Uma usebenzisa iskripthi kufanele ubone okukhiphayo okulandelayo:

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

Khumbula ukuthi ngesikhathi sokugcina sibheka isikhathi sokulingisa, lapho iphakethe litholwa yiseva ye-echo, kwakuyimizuzwana engu-2,00369.

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

Manje uthola iphakethe ngemizuzwana 2.25732. Lokhu kungenxa yokuthi simane sisethe kabusha izinga ledatha le-PointToPointNetDevice lisuka kumamegabhithi amahlanu ngomzuzwana liye kunani elimisiwe, elingamabhithi angu-32768 ngomzuzwana. Uma besingashintsha i-DataRate entsha sisebenzisa umugqa womyalo, singasheshisa ukulingisa kwethu futhi. Sizokwenza lokhu ngendlela elandelayo, ngokuya ngefomula eshiwo isici sosizo:

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

Lokhu kuzobuyisela isibaluli seDathaRate enanini layo elizenzakalelayo lamamegabhithi amahlanu ngomzuzwana. Ingabe uyamangala ngomphumela? Kuvele ukuthi ukuze sibuyisele ukuziphatha kwasekuqaleni kweskripthi, sidinga futhi ukusetha ukulibaziseka kwesiteshi ukuze kufane nesivinini sokukhanya. Singacela isistimu yomugqa womyalo ukuthi iphrinte izibaluli zesiteshi, njengoba senzile kudivayisi yenethiwekhi:

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

Sizothola ukuthi isibaluli sokulibaziseka kwesiteshi simiswe kanje:

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

Khona-ke, ngohlelo lomugqa womyalo, singakwazi ukusetha womabili lawa manani azenzakalelayo.

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

kulokhu sibuyisela isikhathi ebesinaso lapho sibeka ngokusobala i-DataRate kanye nokubambezeleka embhalweni:

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

Qaphela ukuthi iphakethe litholwa iseva futhi ngemva kwamasekhondi angu-2,00369. Empeleni singasetha noma yiziphi izibaluli ezisetshenziswe kuskripthi ngale ndlela. Ikakhulukazi, singasetha izibaluli ze-MaxPackets kumanani angewona awodwa UdpEchoClient.

Ungayisebenzisa kanjani? Izame. Khumbula ukuthi kufanele ubeke amazwana endaweni lapho sibhala ngaphezulu inani lesibaluli esimisiwe futhi simiswe ngokusobala Ama-MaxPackets embhalweni. Bese kufanele wakhe kabusha iskripthi. Ungasebenzisa futhi umugqa womyalo ukuze uthole usizo lwe-syntax lokusetha inani lesibaluli elizenzakalelayo elisha. Uma usuqonda lokhu, ungakwazi ukulawula inani lamaphakheji aboniswa kulayini womyalo. Njengoba singabantu abazimisele ukufunda, umugqa wethu womyalo kufanele ubukeke kanje:

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

Umbuzo wemvelo ophakamayo kuleli phuzu ukuthi ukwazi kanjani ngobukhona bazo zonke lezi zimfanelo. Futhi, uhlelo lomugqa womyalo lunomsebenzi wosizo walolu daba. Uma sicela usizo kulayini womyalo, kufanele sibone:

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

Uma ukhetha ukungqubuzana kwe-"PrintGroups" kufanele ubone uhlu lwawo wonke amaqembu abhalisiwe I-TypeId. Amagama eqembu ahambisana namagama amamojula ohlwini lwemibhalo lomthombo (nakuba osonhlamvukazi). Ukuphrinta lonke ulwazi ngesikhathi esisodwa kungaba namandla kakhulu, ngakho-ke isihlungi esengeziwe siyatholakala ukuze uphrinte ulwazi ngamaqembu. Ngakho-ke, futhi ukugxila kumojula yephoyinti-kuya-iphuzu:

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

Lapha ungathola amagama e-TypeId atholakalayo wokubheka isibaluli, isibonelo ku
--PrintAttributes = ns3 :: PointToPointChannelnjengoba kuboniswe ngenhla.

Enye indlela yokufunda ngezimfanelo ngokusebenzisa i-Doxygen ns-3. Kukhona ikhasi elibonisa zonke izici ezibhaliswe kusifanisi.

5.2.2 Ukuthwebula eyakho imiyalo

Ungakwazi futhi ukwengeza izingwegwe zakho ngesistimu yomugqa womyalo. Lokhu kwenziwa kalula nje kusetshenziswa indlela yokuhlaziya umugqa womyalo EngezaValue.
Masisebenzise lesi sici ukuze sicacise inani lamaphakheji azoboniswa ngendlela ehluke ngokuphelele. Ake sengeze okuguquguqukayo kwendawo okubizwa ngokuthi nPackets abe umsebenzi main. Sizoyisetha ukuze ifane nokuziphatha kwethu okuzenzakalelayo kwangaphambilini. Ukuvumela umhlahleli womugqa womyalo ukuthi uguqule leli nani, sidinga ukuthwebula leli nani kusihlahleli. Lokhu sikwenza ngokungeza ucingo EngezaValue. Hamba futhi ushintshe iskripthi scratch/myfirst.cc ngakho-ke ukuqala ngekhodi elandelayo,

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

Skrolela phansi endaweni yeskripthi lapho sibeka khona isibaluli se-MaxPackets futhi siyishintshe ukuze isethelwe kokuguquguqukayo kwe-nPackets esikhundleni sika-1 ongashintshi, njengoba kukhonjisiwe ngezansi.

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

Manje uma usebenzisa iskripthi futhi unikeza i-agumenti -PrintHelp, kufanele ubone i-agumenti entsha yomsebenzisi. ezisohlwini lwesibonisi sosizo. Ngena,

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

Uma ufuna ukushintsha inani lamaphakethe adlulisiwe, ungakwenza lokho ngokusetha impikiswano yomugqa womyalo - -nPackets.

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

Manje kufanele ubone manje

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

Manje usuthumele amaphakheji amabili. Pretty elula, akunjalo?
Ungabona ukuthi njengomsebenzisi we-ns-3, ungasebenzisa isistimu ye-agumenti yomugqa womyalo ukukhohlisa amanani omhlaba nezibaluli. Uma ungumbhali oyimodeli, ungangeza izici ezintsha ezintweni zakho futhi zizotholakala ngokuzenzakalelayo ukuze zicushwe abasebenzisi bakho ngohlelo lomugqa womyalo. Uma ungumbhali weskripthi, ungakwazi ukwengeza okuguquguqukayo okusha kumaskripthi akho futhi uwaxhume ngaphandle komthungo ohlelweni lwakho lomugqa womyalo.

5.3 Ukusebenzisa uhlelo lokulandela umkhondo

Iphuzu eliphelele lokumodela ukukhiqiza okuphumayo ukuze kuqhutshekwe nesifundo, futhi i-ns-3 trace system iyindlela eyinhloko yalokhu. Njengoba i-ns-3 kuwuhlelo lwe-C++, izindlela ezijwayelekile zokukhiqiza ophumayo ohlelweni lwe-C++ zingasetshenziswa:

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

Ungasebenzisa ngisho nemojula yokugawula ukuze ungeze isakhiwo esincane esixazululweni sakho. Kunezinkinga eziningi ezaziwayo ezibangelwa yile ndlela, ngakho-ke sinikeze uhlelo olungaphansi lokulandelela umcimbi ukuze kuxazululwe lezi zinkinga.

Imigomo esemqoka yesistimu yokulandela i-ns-3 yilezi:

  • Ngemisebenzi eyisisekelo, isistimu yokulandelela kufanele ivumele umsebenzisi ukuthi akhiqize ukulandelela okujwayelekile kwemithombo edumile futhi akhethe izinto ezikhiqiza umkhondo;

  • Abasebenzisi abamaphakathi kufanele bakwazi ukunweba isistimu yokulandelela ukuze baguqule ifomethi ekhiqiziwe yokukhiphayo noma bafake imithombo yokulandela emisha, ngaphandle kokulungisa umongo wesifanisi;

  • Abasebenzisi abathuthukile bangashintsha umongo wesifanisi ukuze bengeze imithombo emisha yokulandela kanye nosinki. Isistimu yokulandelela ye-ns-3 yakhelwe phezu kwezimiso zemithombo yokulandelela ezimele nabamukeli, kanye nendlela ehlanganisiwe yokuxhuma imithombo kubathengi.

Isistimu yokulandelela ye-ns-3 yakhelwe phezu kwezimiso zemithombo yokulandelela ezimele nabamukeli, kanye nendlela ehlanganisiwe yokuxhuma imithombo kubamukeli. Imithombo yokulandelela yizinto ezingabonisa izehlakalo ezenzeka ekulingiseni futhi zinikeze ukufinyelela kudatha eyisisekelo yentshisakalo. Isibonelo, umthombo wokulandela umkhondo ungakhombisa lapho idivayisi yenethiwekhi ithola iphakethe futhi wenze okuqukethwe kwephakethe kutholakale kubamukeli abanentshisekelo yokulandela umkhondo.

Imithombo yokulandelela ngokwayo ayinamsebenzi ngaphandle kokuthi "ihlanganiswe" nezinye izingxenye zekhodi empeleni ezenza okuthile okuwusizo ngolwazi olunikezwe usinki. Abalandeleli bangabathengi bemicimbi nedatha enikezwe imithombo yokulandela umkhondo. Isibonelo, ungakha usinki wokulandela umkhondo ozo (uma uxhumeke kumthombo wokulandela wesibonelo sangaphambilini) uphrinte izingxenye zentshisekelo ephaketheni elitholiwe.

Isizathu salokhu kwahlukaniswa okusobala ukuvumela abasebenzisi ukuthi baxhume izinhlobo ezintsha zikasinki emithonjeni ekhona yokulandelela ngaphandle kokuthi bahlele futhi bahlanganise kabusha umongo wesifanisi. Ngakho esibonelweni esingenhla, umsebenzisi angachaza i-tracer entsha kusikripthi sakhe futhi asixhume kumthombo wokulandelela okhona ochazwe kumongo wokulingisa kuphela ngokuhlela umbhalo womsebenzisi.

Kulesi sifundo, sizodlula kweminye yemithombo echazwe ngaphambilini nosinki futhi sibonise ukuthi ingalungiselelwa kanjani ngenani elincane lomzamo engxenyeni yomsebenzisi. Bona Imanuwali ye-ns-3 noma izigaba zendlela yokwenza ukuze uthole ulwazi mayelana nokucushwa kokulandelela okuthuthukile, okuhlanganisa nokwandisa indawo yamagama okulandelela nokudala imithombo emisha yokulandela umkhondo.

5.3.1 Ukulandelela i-ASCII

I-ns-3 ihlinzeka ngokusebenza komsizi okunikeza isistimu yokulandelela yezinga eliphansi ukukusiza ngemininingwane lapho usetha ukulandelelwa kwephakethe okulula. Uma unika lesi sici amandla, uzobona okukhiphayo kumafayela e-ASCII. Kulabo abajwayele ukuphuma kwe-ns-2, lolu hlobo lokulandela luyafana ne ngaphandle.tr, ekhiqizwa imibhalo eminingi.

Masingene ebhizinisini futhi sengeze imiphumela yokulandela ye-ASCII kuskripthi sethu se-scratch/myfirst.cc. Ngaphambi nje kwekholi Simulator :: Run (), engeza imigqa yekhodi elandelayo:
I-AsciiTraceHelper ascii;

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

Njengezinye izisho eziningi ze-ns-3, le khodi isebenzisa into yomsizi ukudala iminonjana ye-ASCII. Umugqa wesibili uqukethe izingcingo zezindlela ezimbili ezifakwe esidlekeni. Indlela "Ngaphakathi". CreateFileStream() isebenzisa isisho sento engaziwa ukuze idale into yokusakaza ifayela kusitaki (ngaphandle kwegama lento) bese iyidlulisela endleleni ebizwa ngayo. Sizojula kulokhu esikhathini esizayo, kodwa okumele ukwazi okwamanje ukuthi udala into emele ifayela elibizwa. myfirst.tr bese uyidlulisela ku-ns-3. Sithemba i-ns-3 ukuthi inakekele into edaliwe impilo yayo yonke, lapho ixazulula izinkinga ezibangelwa umkhawulo owaziwa kancane (wenhloso) ohlotshaniswa nabakhi bekhophi yento esakazwayo ye-C++.

Ucingo lwangaphandle Nika amandlaAsciiAll() itshela umsizi ukuthi ufuna ukufaka ukulandelela kwe-ASCII esifanisweni sakho kukho konke ukuxhunywa kwedivayisi yephoyinti nephoyinti nokuthi ufuna (okushiwo) abamukeli bokulandelela ukuze barekhode ulwazi lokunyakaza kwephakethe ngefomethi ye-ASCII.

Kulabo abajwayelene ne-ns-2, imicimbi elandelwayo ilingana nama-tracepoints awaziwayo afaka imicimbi ethi "+", "-", "d" kanye "r".
Manje usungakwazi ukwakha iskripthi bese usiqhuba usuka kulayini womyalo:

$ ./waf --run scratch/myfirst

Njengezikhathi eziningi ngaphambili, uzobona imilayezo embalwa evela ku-Waf, bese okuthi “‘ukwakha’ kuqedwe ngempumelelo” ngeminye imilayezo evela kuhlelo olusebenzayo.

Lapho lusebenza, uhlelo luzodala ifayela eliqanjwe igama myfirst.tr. Ngenxa yesimo somsebenzi I-Waf, ngokuzenzakalelayo ifayela aliwenziwa ohlwini lwemibhalo lwendawo, kodwa kumkhombandlela wezinga eliphezulu lenqolobane. Uma ufuna ukushintsha indlela lapho kugcinwa khona iminonjana, ungasebenzisa ipharamitha ye-Waf ukuyicacisa --cwd. Asikenzi lokhu, ngakho-ke ukuze sibheke ifayela le-ASCII lokulandela i-myfirst.tr kusihleli sakho osithandayo, sizodinga ukuzulazula kuhla lwemibhalo olusezingeni eliphezulu lwenqolobane yethu.

Ukuhlaziya imikhondo ye-ASCII

Kunolwazi oluningi lapho ngendlela eminyene kahle, kodwa into yokuqala okudingeka uyiqaphele ukuthi ifayela liqukethe imigqa ngayinye. Lokhu kuzobonakala ngokucacile uma unweba iwindi lokubuka libe banzi.

Umugqa ngamunye efayelini uhambisana nomcimbi wokulandela umkhondo. Kulesi simo, silandelela izehlakalo kulayini wokudlulisela okhona kudivayisi yenethiwekhi yephoyinti nephoyinti ekufanisweni. Ulayini wokudlulisela ulayini lapho iphakethe ngalinye kufanele lidlule ukuze uthole isixhumanisi sephoyinti ukuya ephuzwini. Qaphela ukuthi umugqa ngamunye efayeleni lokulandela umkhondo uqala ngohlamvu olulodwa (futhi unesikhala ngemva kwawo). Lolu phawu luzoba nencazelo elandelayo:

+: ukusebenza komugqa kwenzeke kulayini wedivayisi;
-: umsebenzi wokubuyisa into wenzekile kulayini wedivayisi;
d: iphakethe lawiswa, ngokuvamile ngenxa yokuthi ulayini wawugcwele;
r: Iphakethe lamukelwe idivayisi yenethiwekhi.

Ake sihlolisise umugqa wokuqala efayeleni lokulandela umkhondo. Ngizoyihlephula ibe izingxenye (ngama-indentations ukuze kucace) kanye nenombolo yomugqa kwesokunxele:

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)

Ingxenye yokuqala yalo mcimbi wokulandela umkhondo (umugqa 0) wumsebenzi. Sinophawu + lapha, oluhambisana nokusebenza komugqa wokudlulisela. Isigaba sesibili (umugqa 1) yisikhathi sokulingisa, esivezwa ngemizuzwana. Ungase ukhumbule lokho esikubuzile UdpEchoClientApplication qala ukuthumela amaphakethe ngemizuzwana emibili. Lapha sibona isiqinisekiso sokuthi lokhu kuyenzeka ngempela.

Isigaba esilandelayo sesibonelo sokulandela umkhondo (kusukela emugqeni wesi-2) sibonisa ukuthi yimuphi umthombo wokulandelela okhiqize lesi sehlakalo (okubonisa ukulandelela kwendawo yamagama). Ungacabanga ngesikhala samagama njengoba nje ungenza endaweni yegama lesistimu. Umsuka wesikhala samagama ngu I-NodeList. Lokhu kuhambisana nesiqukathi esiphethwe kukhodi enkulu ye-ns-3. Iqukethe wonke ama-node adalwe kuskripthi. Njengoba nje isistimu yefayela ingaba nemibhalo ezimpandeni zayo, I-NodeList singaba namanodi amaningi. Ngakho-ke umugqa /NodeList/0 ubhekisela ku-null node ku-NodeList, esivame ukucabanga ngayo ngokuthi "i-node 0". Indawo ngayinye inohlu lwamadivayisi afakiwe. Lolu hlu lutholakala ngokulandelayo endaweni yamagama. Ungabona ukuthi lo mcimbi wokulandela uvela I-DeviceList/0, okuyidivayisi engenalutho efakwe endaweni.

Uchungechunge oluncane olulandelayo, $ ns3 :: PointToPointNetDevice, itshela ukuthi iyiphi idivayisi esendaweni enguziro: uhlu lwedivayisi ye-node enguziro. Khumbula ukuthi + ukusebenza okutholakala kulayini 0 kwakusho ukuthi into yengeziwe kulayini wokudlulisa wedivayisi. Lokhu kubonakala ezingxenyeni zokugcina "zendlela yethrekhi": TxQueue/Enqueue.

Izingxenye ezisele ekulandeleleni kufanele zibe nokunembile. Imigqa 3-4 ibonisa ukuthi iphakethe lifakwe kuphrothokholi yephoyinti ukuya kwephuzu. Ulayini 5-7 ubonisa ukuthi iphakethe linesihloko senguqulo ye-IP4 futhi lisuka ekhelini le-IP 10.1.1.1 futhi ihloselwe 10.1.1.2. Ulayini 8-9 ubonisa ukuthi leli phakethe linesihloko se-UDP futhi ekugcineni umugqa we-10 ubonisa ukuthi umthwalo okhokhelwayo ulindelwe amabhayithi angu-1024.

Umugqa olandelayo efayelini lokulandela umkhondo ubonisa ukuthi iphakethe elifanayo likhishwe kulayini wokudlulisela endaweni eyodwa.

Umugqa wesithathu efayeleni lokulandelela ubonisa ukuthi iphakethe litholwe idivayisi yenethiwekhi kumsingathi weseva ye-echo. Ngikhiqize kabusha umcimbi ongezansi.

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)

Qaphela ukuthi umsebenzi wokulandela umkhondo manje sekungu-r futhi isikhathi sokulingisa sinyusiwe saba imizuzwana engu-2,25732. Uma ulandele okokufundisa ngokucophelela, lokhu kusho ukuthi ushiye i-DataRate yamadivayisi enethiwekhi kanye nokubambezeleka kwesixhumanisi ngamavelu akho azenzakalelayo. Lesi sikhathi kufanele sazi, njengoba ubonile esigabeni esandulele.

I-trace source namespace entry (umugqa 2) ishintshiwe ukuze ibonise ukuthi lo mcimbi usuka endaweni 1 (/I-NodeList/1) futhi iphakethe litholwa umthombo wokulandela umkhondo (/I-MacRx). Kufanele kube lula kuwe ukulandela ukunyakaza kwephakethe ku-topology ngokubheka imikhondo esele efayeleni.

5.3.2 I-PCAP Trace

I-ns-3 Device Helpers ingasetshenziswa futhi ukudala amafayela okulandelela ngefomethi ye-.pcap. Isifinyezo pcap (ngokuvamile ukubhalwa ngofeleba abancane) imele ukuthwebula iphakethe futhi empeleni i-API ehlanganisa ukuchaza ifomethi yefayela le-.pcap. Uhlelo oludume kakhulu olungakwazi ukufunda nokubonisa le fomethi ngu I-Wireshark (ebizwe ngaphambilini Ethereal). Nokho, baningi abahlaziyi bethrafikhi abasebenzisa le fomethi yephakethe. Sikhuthaza abasebenzisi ukuthi basebenzise amathuluzi amaningi atholakalayo ukuze bahlaziye ukulandelelwa kwe-pcap. Kulesi sifundo sizogxila ekubukeni imikhondo ye-pcap sisebenzisa tcpdump.

Ukunika amandla ukulandelela kwe-pcap kwenziwa ngomugqa owodwa wekhodi.

pointToPoint.EnablePcapAll ("myfirst");

Namathisela lo mugqa wekhodi ngemuva kwekhodi yokulandela ye-ASCII esisanda kuyingeza scratch/myfirst.cc. Qaphela ukuthi sidlule kuphela iyunithi yezinhlamvu ethi "myfirst", hhayi "myfirst.pcap" nanoma yini efanayo. Lokhu kungenxa yokuthi ipharamitha iyisiqalo, hhayi igama lefayela eligcwele. Ngesikhathi sokulingisa, umsizi empeleni uzodala ifayela lokulandela umkhondo wedivayisi ngayinye yephoyinti nephoyinti. Amagama wamafayela azokwakhiwa kusetshenziswa isiqalo, inombolo yenodi, inombolo yedivayisi, nesijobelelo ".pcap".

Ngombhalo wethu oyisibonelo, sizogcina ngokubona amafayela aqanjwe "myfirst-0-0.pcap"Futhi"myfirst-1-0.pcap", okuwukulandelela kwe-pcap ye-node engu-0-idivayisi kanye ne-node engu-0-idivayisi engu-1 ngokulandelanayo. Uma usungeze umugqa wekhodi ukuze unike amandla ukulandelela kwe-pcap, ungaqalisa iskripthi ngendlela evamile:

$ ./waf --run scratch/myfirst

Uma ubheka kumkhombandlela wezinga eliphezulu lokusabalalisa kwakho, kufanele ubone amafayela amathathu: ifayela lokulandelela le-ASCII myfirst.tr, esikufunde ngaphambilini, amafayela myfirst-0-0.pcap и myfirst-1-0.pcap - amafayela amasha e-pcap esisanda kuwenza.

Ukufunda okukhiphayo nge-tcpdump

Okwamanje, indlela elula yokubuka amafayela we-pcap ukusebenzisa i-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

Endaweni yokulahla myfirst-0-0.pcap (idivayisi yeklayenti) ungabona iphakethe le-echo lithunyelwa ngemuva kwemizuzwana emi-2 yokulingisa. Uma ubheka ukulahla kwesibili (myfirst-1-0.pcap), uzobona ukuthi iphakethe litholwa kumasekhondi angu-2,257324. Uzobona ekulahleni kwesibili ukuthi iphakethe libuyiselwa kumasekhondi angu-2.257324, futhi ekugcineni iphakethe libuyiselwe yiklayenti ekulahleni kokuqala ngamasekhondi angu-2.514648.

Ukufundwa okuphumayo nge-Wireshark

Uma ungajwayele I-Wireshark, kunewebhusayithi ongalanda kuyo izinhlelo namadokhumenti: http://www.wireshark.org/. I-Wireshark iyi-GUI engasetshenziswa ukubonisa lawa mafayela okulandelela. Uma une-Wireshark, ungavula noma yimaphi amafayela okulandelela futhi ubonise okuqukethwe njengokungathi uthwebule amaphakethe usebenzisa i-packet sniffer.

Source: www.habr.com

Engeza amazwana