ns-3 mafunzo ya kiigaji cha mtandao. Sura ya 5

ns-3 mafunzo ya kiigaji cha mtandao. Sura ya 5
Sura ya 1,2
Sura ya 3
Sura ya 4

5 Mipangilio
5.1 Kwa kutumia moduli ya ukataji miti
5.1.1 Muhtasari wa ukataji miti
5.1.2 Wezesha ukataji miti
5.1.3 Kuongeza kumbukumbu kwenye msimbo wako
5.2 Kutumia hoja za mstari wa amri
5.2.1 Kubatilisha thamani za sifa chaguomsingi
5.2.2 Kukamata amri zako mwenyewe
5.3 Kutumia mfumo wa ufuatiliaji
5.3.1 Ufuatiliaji wa ASCII
Inachanganua athari za ASCII
5.3.2 Ufuatiliaji wa PCAP

Sura ya 5

marekebisho

5.1 Kwa kutumia moduli ya ukataji miti

Tayari tuliangalia kwa ufupi moduli ya ukataji miti ya ns-3 kwa kuangalia hati kwanza.cc. Katika sura hii, tutaangalia kwa karibu matumizi yanayoweza kutumika kwa mfumo mdogo wa ukataji miti.

5.1.1 Muhtasari wa ukataji miti

Mifumo mingi mikubwa inasaidia aina fulani ya kituo cha kurekodi ujumbe, na ns-3 sio ubaguzi. Katika baadhi ya matukio, ujumbe wa makosa pekee huandikwa kwa "koni ya uendeshaji" (ambayo kawaida ni stderr kwenye mifumo inayotegemea Unix). Kwenye mifumo mingine, jumbe za onyo zinaweza kuonyeshwa pamoja na maelezo ya kina zaidi. Katika baadhi ya matukio, zana za kuweka kumbukumbu hutumiwa kutoa ujumbe wa utatuzi ambao unaweza kutia ukungu kwa haraka.

SubHRD inayotumika katika ns-3 inachukulia kuwa viwango hivi vyote vya maudhui ya habari ni muhimu, na tunatoa mbinu ya kuchagua, iliyopangwa kwa kumbukumbu ya ujumbe. Kuweka kumbukumbu kunaweza kuzimwa kabisa, kuwezeshwa kwa misingi ya kila sehemu, au kimataifa. Kwa madhumuni haya, viwango vinavyoweza kubadilishwa vya maudhui ya habari hutumiwa. Moduli ya ukataji miti ya ns-3 hutoa njia rahisi kiasi ya kupata taarifa muhimu kutoka kwa uigaji wako.

Unapaswa kuelewa kwamba tunatoa utaratibu wa madhumuni ya jumla - kufuatilia - kwa ajili ya kutoa data kutoka kwa miundo yako, ambayo inapaswa kuwa matokeo yanayopendekezwa kwa uigaji (kwa maelezo zaidi kuhusu mfumo wetu wa ufuatiliaji, angalia sehemu ya mafunzo ya 5.3). Kuweka kumbukumbu kunapaswa kuwa njia inayopendelewa ya kupata maelezo ya utatuzi, maonyo, ujumbe wa hitilafu, au kwa kutoa ujumbe kwa haraka kutoka kwa hati au miundo yako wakati wowote.

Hivi sasa, mfumo unafafanua viwango (aina) saba vya ujumbe wa kumbukumbu katika kuongeza mpangilio wa maudhui ya habari.

  • LOG_ERROR - ujumbe wa hitilafu ya kumbukumbu (jumla inayohusiana: NS_LOG_ERROR);
  • LOG_WARN - Kumbukumbu jumbe za onyo (jumla zinazohusiana: NS_LOG_WARN);
  • LOG_DEBUG - Ingia barua pepe maalum za utatuzi nadra kwa kiasi kikubwa (jumla inayohusiana: NS_LOG_DEBUG);
  • LOG_INFO - usajili wa ujumbe wa habari kuhusu maendeleo ya programu (jumla inayohusiana: NS_LOG_INFO);
  • LOG_FUNCTION - Kumbukumbu za ujumbe unaoelezea kila chaguo la kukokotoa liitwalo (makro mbili zinazohusiana: NS_LOG_FUNCTION, zinazotumika kwa vitendaji vya wanachama, na NS_LOG_FUNCTION_NOARGS, zinazotumika kwa vitendakazi tuli);
  • LOG_LOGIC - jumbe za kumbukumbu zinazoelezea mtiririko wa kimantiki ndani ya chaguo za kukokotoa (jumla inayohusiana: NS_LOG_LOGIC);
  • LOG_ALL - Huweka kumbukumbu kila kitu kilichotajwa hapo juu (hakuna jumla inayohusishwa).
    Kwa kila aina (LOG_TYPE) pia kuna LOG_LEVEL_TYPE ambayo, ikitumiwa, inaruhusu viwango vyote vilivyo juu yake kuandikishwa pamoja na kiwango chake. (Kwa hivyo, LOG_ERROR na LOG_LEVEL_ERROR, na LOG_ALL na LOG_LEVEL_ALL ni sawa kiutendaji.) Kwa mfano, kuwasha LOG_INFO kutaruhusu tu ujumbe unaotolewa na NS_LOG_INFO makro, huku kuwasha LOG_LEVEL_INFO pia kutajumuisha jumbe zinazotolewa na LOG_LOGERNS_BURNS_BUNS_.

Pia tunatoa jumla ya ukataji miti bila masharti ambayo huonyeshwa kila mara, bila kujali kiwango cha ukataji miti au sehemu ya uteuzi.

  • NS_LOG_UNCOND - Uwekaji kumbukumbu bila masharti ya ujumbe husika (hakuna kiwango cha kumbukumbu kinachohusishwa).

Kila ngazi inaweza kuulizwa kibinafsi au kwa jumla. Kuweka kumbukumbu kunaweza kusanidiwa kwa kutumia sh tofauti ya mazingira NS_LOG au kwa kukata simu ya utendaji kazi wa mfumo. Kama inavyoonyeshwa hapo awali, mfumo wa ukataji miti una hati za Doksijeni na sasa ni wakati mzuri wa kuukagua ikiwa bado hujafanya hivyo.

Sasa kwa kuwa umesoma hati kwa undani sana, wacha tutumie maarifa hayo kupata habari ya kupendeza kutoka kwa hati ya mfano. scratch/myfirst.ccambayo tayari umekusanya.

5.1.2 Wezesha ukataji miti

Wacha tutumie utofauti wa mazingira wa NS_LOG kuendesha kumbukumbu zaidi, lakini kwanza, ili kupata tu fani zako, endesha hati ya mwisho kama ulivyofanya hapo awali,

$ ./waf --run scratch/myfirst

Unapaswa kuona matokeo yanayojulikana kutoka kwa programu ya kwanza ya 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

Inabadilika kuwa ujumbe "uliotumwa" na "uliopokewa" unaoona hapo juu ni ujumbe ulioingia kutoka UdpEchoClientApplication ΠΈ UdpEchoServerApplication. Kwa mfano, tunaweza kuuliza programu ya mteja kuchapisha maelezo ya ziada kwa kuweka kiwango chake cha ukataji miti kupitia utofauti wa mazingira wa NS_LOG.

Kuanzia sasa na kuendelea, nitafikiria kuwa unatumia ganda kama sh ambalo hutumia syntax ya "VARIABLE=value". Ikiwa unatumia ganda kama csh, basi itabidi ubadilishe mifano yangu kuwa "thamani ya kutofautisha ya setenv" inayohitajika na ganda hizo.

Kwa sasa, maombi ya mteja wa mwangwi wa UDP hujibu safu ifuatayo ya msimbo ndani scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

Huwasha kiwango cha kumbukumbu LOG_LEVEL_INFO. Tunapopitisha alama ya kiwango cha ukataji miti, tunawasha kiwango hicho na viwango vyote vya chini. Katika hali hii, tumewasha NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN na NS_LOG_ERROR. Tunaweza kuongeza kiwango cha ukataji miti na kupata maelezo zaidi, bila mabadiliko ya hati na ukusanyaji upya, kwa kuweka utofauti wa mazingira wa NS_LOG kama ifuatavyo:

$ export NS_LOG=UdpEchoClientApplication=level_all

Kwa hivyo tunaweka utofauti wa sh shell NS_LOG kwa thamani ifuatayo,

UdpEchoClientApplication=level_all

Upande wa kushoto wa kazi ni jina la sehemu iliyoingia tunayotaka kusanidi, na upande wa kulia ni bendera tunayotaka kuitumia. Katika kesi hii, tutawezesha viwango vyote vya utatuzi katika programu. Ukiendesha hati na NS_LOG iliyowekwa hivi, mfumo wa ukataji miti wa ns-3 utakubali mabadiliko na unapaswa kuona matokeo yafuatayo:

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

Maelezo ya ziada ya utatuzi yaliyotolewa na programu sasa yako katika kiwango cha NS_LOG_FUNCTION. Inaonyesha kila mfano wa simu ya kukokotoa wakati wa utekelezaji wa hati. Kama kanuni ya jumla, katika kazi za mbinu ni vyema kutumia (angalau)NS_LOG_FUNCTION (this)... Tumia NS_LOG_FUNCTION_NOARGS ()
tu katika kazi tuli. Walakini, kumbuka kuwa mfumo wa ns-3 hauhitajiki kusaidia utendakazi wowote wa ukataji miti. Uamuzi kuhusu ni kiasi gani cha habari kilichorekodiwa huachwa kwa msanidi wa muundo binafsi. Katika kesi ya maombi ya echo, kiasi kikubwa cha pato la ukataji kinapatikana.

Sasa unaweza kuona logi ya simu za utendaji ambazo zilifanywa na programu. Ukiangalia kwa karibu, utaona koloni kati ya mstari UdpEchoClientApplication na jina la njia, ambapo unaweza kutarajia kuona opereta wa wigo wa C ++ (: :). Hii ni makusudi.

Kwa kweli hili sio jina la darasa, lakini jina la sehemu ya ukataji miti. Wakati kuna mechi kati ya faili ya chanzo na darasa, kawaida huwa ni jina la darasa, lakini unapaswa kutambua kuwa sio jina la darasa, na kuna koloni moja badala ya koloni mbili. Hii ni njia ya kukusaidia kutenganisha kidhana jina la maharagwe ya ukataji miti kutoka kwa jina la darasa kwa njia ya hila.

Walakini, katika hali zingine inaweza kuwa ngumu kuamua ni njia gani inayozalisha ujumbe wa kumbukumbu. Ukiangalia maandishi hapo juu, unaweza kuwa unajiuliza ni wapi mstari "Received 1024 bytes from 10.1.1.2" Unaweza kutatua tatizo hili kwa kuweka kiwango kiambishi_kifunzi kwa utofauti wa mazingira wa NS_LOG. Jaribu yafuatayo:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

Kumbuka kuwa alama za nukuu ni muhimu kwa sababu upau wima tunaotumia kuwakilisha operesheni ya AU pia ni kiunganishi cha bomba la Unix. Sasa ikiwa utaendesha hati, utaona kuwa mfumo wa ukataji miti unahakikisha kuwa kila ujumbe kwenye logi fulani umewekwa na jina la sehemu.

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

Sasa unaweza kuona kwamba ujumbe wote unaotoka kwa programu ya mteja wa mwangwi wa UDP hutambuliwa kama hivyo. Ujumbe"Received 1024 bytes from 10.1.1.2" sasa imetambuliwa wazi kama inatoka kwa programu ya mteja wa echo. Ujumbe uliosalia lazima utoke kwenye programu ya seva ya mwangwi ya UDP. Tunaweza kuwezesha kipengele hiki kwa kuingiza orodha iliyotenganishwa na koloni ya vijenzi katika kigezo cha mazingira cha NS_LOG.

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

Onyo: Katika maandishi ya mfano hapo juu, utahitaji kuondoa herufi ya laini mpya baada ya koloni (:), itatumika kuumbiza hati. Sasa ukiendesha hati, utaona ujumbe wote wa kumbukumbu kutoka kwa mteja na programu za mwangwi za seva. Unaweza kuona kwamba hii inaweza kuwa muhimu sana wakati wa kurekebisha.

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

Pia wakati mwingine ni muhimu kuweza kuona wakati wa kuiga ambapo ujumbe wa kumbukumbu ulitolewa. Unaweza kufanya hivyo kwa kuongeza AU kidogo kiambishi_wakati:

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

Tena, itabidi uondoe herufi mpya iliyo hapo juu. Ikiwa sasa unaendesha hati unapaswa kuona matokeo yafuatayo:

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

Tafadhali kumbuka kuwa mjenzi kwa UdpEchoServer iliitwa wakati wa kuiga sekunde 0. Hii hufanyika kabla ya simulation kuanza, lakini wakati unaonyeshwa kama sekunde sifuri. Vile vile ni kweli kwa ujumbe wa mjenzi 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()

Kumbuka kwamba script mkwaruzo/kwanza.cc ilianza programu ya seva ya echo sekunde moja kabla ya kuanza kwa simulation. Sasa unaweza kuona kwamba mbinu StartApplication seva inaitwa kwa sekunde ya kwanza. Unaweza pia kugundua kuwa mteja wa mwangwi huanza katika sekunde ya pili ya uigaji, kama tulivyouliza kwenye hati.

Sasa unaweza kufuata maendeleo ya uigaji kwenye simu RatibaTransmit katika mteja anayepiga simu ya HandleRead. Tuma katika programu ya seva ya mwangwi. Kumbuka kuwa muda uliopita wa kutuma pakiti kwa kiungo cha uhakika hadi pointi ni milisekunde 3,69. Unaweza kuona kwamba seva ya echo inaweka ujumbe ambao umejibu kwa pakiti, na kisha, baada ya kuchelewa kwa kituo, unaona kwamba mteja wa echo anapokea pakiti ya echo katika njia yake ya HandleRead.

Katika simulizi hii, mengi hutokea bila wewe kutambua. Lakini unaweza kufuatilia mchakato mzima kwa urahisi sana kwa kuwezesha vipengele vyote vya ukataji kwenye mfumo. Jaribu kuweka tofauti ya NS_LOG kwa thamani ifuatayo,

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

Nyota hapo juu ni herufi ya kadi-mwitu kwa kijenzi cha ukataji miti. Hii itajumuisha maingizo yote katika vipengele vyote vinavyotumika katika uigaji. Sitatoa pato hapa (wakati wa kuandika hutoa mistari 1265 ya pakiti kwa pakiti moja ya echo), lakini unaweza kuelekeza habari hii kwa faili na kuiona kwenye hariri unayopenda.

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

Binafsi mimi hutumia toleo hili la kitenzi cha ukataji miti ninapokuwa na shida na sijui ni wapi mambo yalienda kombo. Ninaweza kufuata utekelezaji wa nambari kwa urahisi bila kuweka vizuizi na kupitia nambari kwenye kitatuzi. Ninaweza tu kuhariri matokeo katika hariri ninayopenda na kutafuta kile ninachotarajia na kuona kitu kinatokea ambacho sikutarajia. Mara tu nikiwa na wazo la jumla la nini kinaendelea vibaya, ninaruka kwenye kitatuzi ili kupembua shida. Aina hii ya matokeo inaweza kuwa muhimu haswa wakati hati yako inafanya jambo lisilotarajiwa kabisa. Ukitumia tu kitatuzi, unaweza kukosa twist kabisa. Usajili hufanya zamu kama hizo zionekane.

5.1.3 Kuongeza kumbukumbu kwenye msimbo wako

Unaweza kuongeza maingizo mapya kwa uigaji wako kwa kupiga simu kwa sehemu ya kumbukumbu kutoka kwa makro nyingi. Wacha tuifanye katika hati myfirst.cc, ambayo tunayo kwenye saraka "safi". Kumbuka kwamba tulifafanua sehemu ya ukataji miti katika hali hii:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Unafahamu kuwa unaweza kuwezesha uwekaji kumbukumbu wa jumbe zote kutoka kwa kipengele hiki kwa kuweka NS_LOG utofauti wa mazingira katika viwango tofauti. Wacha tuendelee na kuongeza maingizo kwenye hati. Jumla inayotumiwa kuongeza ujumbe wa kiwango cha habari kwenye kumbukumbu ni NS_LOG_INFO. Wacha tuongeze ujumbe (kabla tu hatujaanza kuunda nodi) ambao unakuambia kuwa hati iko katika awamu ya "Kuunda Topolojia". Hii inafanywa katika kijisehemu cha msimbo kifuatacho,
Fungua scratch/myfirst.cc katika kihariri chako unachopenda na ongeza mstari,
NS_LOG_INFO ("Creating Topology");
mbele ya mistari,

NodeContainer nodes;
nodes.Create (2);

Sasa kusanya hati kwa kutumia waf, na ufute utofauti wa NS_LOG ili kuzima mtiririko wa ukataji miti tuliowasha hapo awali:

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

Hutaona ujumbe mpya kwa sababu kijenzi husika cha ukataji miti (FirstScriptExample) hakijawashwa. Ili kuona ujumbe wako unahitaji kuwezesha sehemu ya kumbukumbu Mfano wa FirstScript yenye kiwango kisichopungua NS_LOG_INFO. Ikiwa unataka tu kuona kiwango hiki maalum cha ukataji miti, unaweza kuiwezesha kama hii,

$ export NS_LOG=FirstScriptExample=info

Ukiendesha hati sasa, utaona ujumbe mpya "Kuunda Topolojia",

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 Kutumia hoja za mstari wa amri

5.2.1 Kubatilisha thamani za sifa chaguomsingi

Njia nyingine ya kubadilisha tabia ya hati za ns-3 bila kuhariri au kujenga ni kutumia hoja za mstari wa amri. Tunatoa utaratibu wa kuchanganua hoja za mstari wa amri na kuweka kiotomatiki vigeu vya ndani na kimataifa kulingana na matokeo.

Hatua ya kwanza katika kutumia mfumo wa hoja ya mstari wa amri ni kutangaza kichanganuzi cha mstari wa amri. Hii ni rahisi sana kufanya (katika programu yako kuu), kama katika nambari ifuatayo,

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

Kijisehemu hiki rahisi cha mistari miwili ni muhimu sana kivyake. Inafungua mlango wa kutofautisha wa kimataifa wa ns-3 na mfumo wa sifa. Wacha tuongeze mistari miwili ya nambari hadi mwanzo wa kazi kuu ya hati scratch/myfirst.cc. Kuendelea, tunakusanya hati na kuiendesha, tunapoendesha tunatoa ombi la usaidizi kama ifuatavyo.

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

Amri hii itauliza Waf endesha hati mkwaruzo/kwanza na kuipitisha hoja ya mstari wa amri -Msaada wa Kuchapisha. Alama za nukuu zinahitajika ili kuonyesha ni mpango gani hoja inakusudiwa. Kichanganuzi cha mstari wa amri kitagundua hoja -Msaada wa Kuchapisha na itaonyesha jibu,

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.

Sasa hebu tuangalie chaguo -Sifa za Kuchapisha. Tayari tumetaja mfumo wa sifa wa ns-3 wakati wa kusoma hati ya first.cc. Tumeona mistari ifuatayo ya kanuni,

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

na wakasema hivyo Kiwango cha Data kwa kweli ni sifa PointToPointNetDevice. Wacha tutumie kichanganuzi cha hoja ya mstari wa amri ili kuona sifa PointToPointNetDevice. Orodha ya usaidizi inasema kile tunachopaswa kutoa TypeId. Hili ni jina la darasa ambalo sifa za riba ni za. Kwa upande wetu itakuwa ns3::PointToPointNetDevice. Wacha tuendelee mbele, ingia,

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

Mfumo utachapisha sifa zote za aina ya kifaa hiki cha mtandao. Utaona kwamba miongoni mwa sifa katika orodha ni,

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

Hii ndiyo thamani ya chaguo-msingi ambayo itatumiwa na mfumo wakati wa kuunda kitu PointToPointNetDevice. Tutabatilisha thamani hii chaguomsingi kwa kutumia kigezo Sifa Π² PointToPointHelper juu. Wacha tutumie maadili chaguo-msingi kwa vifaa na vituo vya kumweka-kwa-point. Ili kufanya hivyo, tutafuta simu SetDeviceAttribute ΠΈ SetChannelAttribute ya myfirst.cc, ambayo tunayo kwenye saraka safi.

Hati yako sasa inapaswa kutangaza tu PointToPointHelper na usifanye shughuli zozote za usakinishaji kama inavyoonyeshwa kwenye mfano hapa chini,

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

Nenda mbele na uunde hati mpya na Waf (./waff) na turudi nyuma na tujumuishe ingizo kutoka kwa programu ya seva ya mwangwi ya UDP na tujumuishe kiambishi awali cha wakati.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

Ikiwa utaendesha hati unapaswa kuona matokeo yafuatayo:

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

Kumbuka kwamba mara ya mwisho tuliangalia wakati wa kuiga, wakati pakiti ilipokelewa na seva ya echo, ilikuwa sekunde 2,00369.

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

Sasa anapokea pakiti katika sekunde 2.25732. Hii ni kwa sababu tunaweka upya kiwango cha data cha PointToPointNetDevice kutoka megabiti tano kwa sekunde hadi thamani chaguomsingi, ambayo ni biti 32768 kwa sekunde. Ikiwa tungebadilisha DataRate mpya kwa kutumia mstari wa amri, tunaweza kuharakisha uigaji wetu tena. Tutafanya hivi kama ifuatavyo, kulingana na fomula iliyoonyeshwa na kipengele cha usaidizi:

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

Hii itarudisha sifa ya DataRate kwa thamani yake chaguomsingi ya megabiti tano kwa sekunde. Je, unashangazwa na matokeo? Inabadilika kuwa ili kurudisha tabia ya asili ya hati, tunahitaji pia kuweka ucheleweshaji wa kituo ili kufanana na kasi ya mwanga. Tunaweza kuuliza mfumo wa mstari wa amri kuchapisha sifa za kituo, kama tulivyofanya kwa kifaa cha mtandao:

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

Tutapata kwamba sifa ya ucheleweshaji wa kituo imewekwa kama ifuatavyo:

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

Tunaweza basi, kupitia mfumo wa mstari wa amri, kuweka maadili haya mawili ya msingi.

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

katika kesi hii tunarejesha muda tuliokuwa nao tulipoweka kwa uwazi Kiwango cha Data na Kuchelewa kwenye hati:

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

Kumbuka kwamba pakiti inapokelewa na seva tena baada ya sekunde 2,00369. Kwa kweli tunaweza kuweka sifa zozote zinazotumiwa kwenye hati kwa njia hii. Hasa, tunaweza kuweka sifa za MaxPackets kwa maadili yasiyo ya moja UdpEchoClient.

Je, ungeitumiaje? Jaribu. Kumbuka kwamba lazima utoe maoni mahali ambapo tunabatilisha thamani ya sifa chaguo-msingi na kuweka wazi MaxPackets katika hati. Kisha lazima ujenge upya hati. Unaweza pia kutumia mstari wa amri kupata usaidizi wa syntax kwa kuweka thamani mpya ya sifa chaguomsingi. Mara tu unapoelewa hili, unaweza kudhibiti idadi ya vifurushi vinavyoonyeshwa kwenye mstari wa amri. Kwa kuwa sisi ni watu wanaopenda kusoma, safu yetu ya amri inapaswa kuonekana kama hii:

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

Swali la asili linalojitokeza katika hatua hii ni jinsi ya kujua kuhusu kuwepo kwa sifa hizi zote. Tena, mfumo wa mstari wa amri una kazi ya usaidizi kwa jambo hili. Ikiwa tunauliza mstari wa amri kwa msaada, tunapaswa kuona:

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

Ukichagua hoja ya "PrintGroups" unapaswa kuona orodha ya vikundi vyote vilivyosajiliwa TypeId. Majina ya kikundi yanalingana na majina ya moduli katika saraka ya chanzo (ingawa ni ya herufi kubwa). Kuchapisha taarifa zote mara moja kutakuwa na mwanga mwingi, kwa hivyo kichujio cha ziada kinapatikana ili kuchapisha taarifa kwa kikundi. Kwa hivyo, tena ukizingatia moduli ya kumweka-kwa-uhakika:

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

Hapa unaweza kupata majina yanayopatikana ya TypeId kwa utaftaji wa sifa, kwa mfano in
--PrintAttributes = ns3 :: PointToPointChannelkama inavyoonyeshwa hapo juu.

Njia nyingine ya kujifunza juu ya sifa ni kupitia Doksijeni ns-3. Kuna ukurasa unaoorodhesha sifa zote zilizosajiliwa kwenye kiigaji.

5.2.2 Kukamata amri zako mwenyewe

Unaweza pia kuongeza ndoano zako mwenyewe kupitia mfumo wa mstari wa amri. Hii inafanywa kwa urahisi kwa kutumia njia ya kichanganuzi cha mstari wa amri OngezaThamani.
Wacha tutumie kipengele hiki kutaja idadi ya vifurushi vya kuonyeshwa kwa njia tofauti kabisa. Hebu kuongeza variable mitaa kuitwa nPackets katika utendaji kuu. Tutaiweka kwa moja ili ilingane na tabia yetu chaguomsingi ya awali. Ili kuruhusu kichanganuzi cha mstari wa amri kubadilisha thamani hii, tunahitaji kunasa thamani hii kwenye kichanganuzi. Tunafanya hivyo kwa kuongeza simu OngezaThamani. Nenda na ubadilishe hati scratch/myfirst.cc kwa hivyo kuanza na nambari ifuatayo,

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

Tembeza chini hadi mahali kwenye hati ambapo tunaweka sifa ya MaxPackets na kuibadilisha ili iwekwe kwa utofauti wa nPackets badala ya 1 ya mara kwa mara, kama inavyoonyeshwa hapa chini.

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

Sasa ukiendesha hati na kutoa -PrintHelp hoja, unapaswa kuona hoja mpya ya mtumiaji. iliyoorodheshwa kwenye onyesho la usaidizi. Ingiza,

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

Ikiwa unataka kubadilisha idadi ya pakiti zinazotumwa, unaweza kufanya hivyo kwa kuweka hoja ya mstari wa amri - -nPackets.

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

Sasa unapaswa kuona

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

Sasa umetuma vifurushi viwili. Rahisi sana, sivyo?
Unaweza kuona kwamba kama mtumiaji wa ns-3, unaweza kutumia mfumo wa hoja ya mstari wa amri ili kudhibiti maadili na sifa za kimataifa. Ikiwa wewe ndiye mwandishi wa mfano, unaweza kuongeza sifa mpya kwa vitu vyako na vitapatikana kiotomatiki kwa usanidi wa watumiaji wako kupitia mfumo wa safu ya amri. Ikiwa wewe ni mwandishi wa hati, unaweza kuongeza vibadala vipya kwenye hati zako na kuzichomeka bila mshono kwenye mfumo wako wa safu ya amri.

5.3 Kutumia mfumo wa ufuatiliaji

Jambo zima la modeli ni kutoa matokeo kwa masomo zaidi, na mfumo wa ufuatiliaji wa ns-3 ndio njia kuu ya hii. Kwa kuwa ns-3 ni programu ya C++, njia za kawaida za kutoa matokeo kutoka kwa programu ya C++ zinaweza kutumika:

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

Unaweza hata kutumia moduli ya ukataji miti kuongeza muundo kidogo kwenye suluhisho lako. Kuna matatizo mengi yanayojulikana yanayosababishwa na mbinu hii, na kwa hivyo tumetoa mfumo mdogo wa ufuatiliaji wa matukio ili kutatua matatizo haya.

Malengo makuu ya mfumo wa ufuatiliaji wa ns-3 ni:

  • Kwa kazi za kimsingi, mfumo wa ufuatiliaji unapaswa kuruhusu mtumiaji kuzalisha ufuatiliaji wa kawaida wa vyanzo maarufu na kuchagua vitu vinavyozalisha ufuatiliaji;

  • Watumiaji wa kati wanapaswa kuwa na uwezo wa kupanua mfumo wa ufuatiliaji ili kubadilisha umbizo la towe linalozalishwa au kuingiza vyanzo vipya vya ufuatiliaji, bila kurekebisha msingi wa kiigaji;

  • Watumiaji mahiri wanaweza kurekebisha msingi wa kiigaji ili kuongeza vyanzo vipya vya ufuatiliaji na sinki. Mfumo wa ufuatiliaji wa ns-3 umejengwa juu ya kanuni za vyanzo vya ufuatiliaji wa kujitegemea na wapokeaji, pamoja na utaratibu wa umoja wa kuunganisha vyanzo kwa watumiaji.

Mfumo wa ufuatiliaji wa ns-3 umejengwa juu ya kanuni za vyanzo huru vya ufuatiliaji na wapokeaji, pamoja na utaratibu wa umoja wa kuunganisha vyanzo kwa wapokeaji. Vyanzo vya ufuatiliaji ni vitu vinavyoweza kuashiria matukio yanayotokea katika uigaji na kutoa ufikiaji wa data ya msingi inayokuvutia. Kwa mfano, chanzo cha ufuatiliaji kinaweza kuonyesha wakati kifaa cha mtandao kilipokea pakiti na kufanya yaliyomo kwenye pakiti kupatikana kwa wapokeaji wanaovutiwa.

Vyanzo vya kufuatilia vyenyewe havina maana isipokuwa "vimeunganishwa" na sehemu zingine za msimbo ambazo hufanya kitu muhimu na maelezo yaliyotolewa na sinki. Wafuatiliaji ni watumiaji wa matukio na data iliyotolewa na vyanzo vya ufuatiliaji. Kwa mfano, unaweza kuunda sinki ya kufuatilia ambayo (ikiunganishwa na chanzo cha ufuatiliaji wa mfano uliopita) itachapisha sehemu za riba katika pakiti iliyopokelewa.

Mantiki ya utengano huu wazi ni kuruhusu watumiaji kuunganisha aina mpya za sinki kwenye vyanzo vilivyopo vya ufuatiliaji bila kulazimika kuhariri na kukusanya msingi wa kiigaji. Kwa hivyo katika mfano ulio hapo juu, mtumiaji anaweza kufafanua kifuatiliaji kipya katika hati yake na kuiunganisha kwa chanzo kilichopo cha ufuatiliaji kilichofafanuliwa katika msingi wa uigaji tu kwa kuhariri hati ya mtumiaji.

Katika somo hili, tutapitia baadhi ya vyanzo na sinki zilizoainishwa awali na kuonyesha jinsi zinavyoweza kusanidiwa kwa kiasi kidogo cha juhudi kwa upande wa mtumiaji. Tazama sehemu za Mwongozo wa ns-3 au jinsi ya kupata maelezo kuhusu usanidi wa hali ya juu wa ufuatiliaji, ikijumuisha kupanua nafasi ya ufuatiliaji na kuunda vyanzo vipya vya ufuatiliaji.

5.3.1 Ufuatiliaji wa ASCII

ns-3 hutoa utendakazi wa msaidizi ambao hutoa mfumo wa ufuatiliaji wa kiwango cha chini ili kukusaidia kwa maelezo wakati wa kusanidi ufuatiliaji rahisi wa pakiti. Ukiwezesha kipengele hiki, utaona matokeo katika faili za ASCII. Kwa wale wanaofahamu matokeo ya ns-2, aina hii ya ufuatiliaji ni sawa na nje.tr, ambayo hutolewa na maandishi mengi.

Hebu tushughulikie na tuongeze baadhi ya matokeo ya ufuatiliaji ya ASCII kwenye hati yetu ya scratch/myfirst.cc. Kabla ya simu Simulator :: Run (), ongeza mistari ifuatayo ya nambari:
AsciiTraceHelper ascii;

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

Kama nahau zingine nyingi za ns-3, nambari hii hutumia kitu cha msaidizi kuunda athari za ASCII. Mstari wa pili una simu mbili za mbinu zilizowekwa. Mbinu ya "ndani". CreateFileStream() hutumia nahau ya kitu kisichojulikana kuunda kitu cha kutiririsha faili kwenye rafu (bila jina la kitu) na kuipitisha kwa njia inayoitwa. Tutaingia ndani zaidi katika siku zijazo, lakini unachohitaji kujua katika hatua hii ni kwamba unaunda kitu ambacho kinawakilisha faili inayoitwa. myfirst.tr na uhamishe kwa ns-3. Tunakabidhi ns-3 kutunza kitu kilichoundwa kwa maisha yake yote, ambapo hutatua matatizo yanayosababishwa na kizuizi kisichojulikana kidogo (cha kukusudia) kinachohusishwa na waundaji wa nakala za kitu cha mkondo cha C++.

Simu ya nje WezeshaAsciiAll() humwambia mratibu kuwa unataka kujumuisha ufuatiliaji wa ASCII katika uigaji wako kwa miunganisho yote ya kifaa kutoka kwa uhakika hadi kwa uhakika na kwamba unataka (iliyobainishwa) kufuatilia vipokeaji ili kurekodi maelezo ya pakiti ya harakati katika umbizo la ASCII.

Kwa wale wanaofahamu ns-2, matukio yanayofuatiliwa ni sawa na alama za ufuatiliaji zinazojulikana ambazo hurekodi matukio "+", "-", "d" na "r".
Sasa unaweza kuunda hati na kuiendesha kutoka kwa safu ya amri:

$ ./waf --run scratch/myfirst

Kama mara nyingi hapo awali, utaona jumbe kadhaa kutoka kwa Waf, na kisha "'build' imekamilika kwa mafanikio" na baadhi ya ujumbe kutoka kwa programu inayoendesha.

Wakati wa kufanya kazi, programu itaunda faili inayoitwa myfirst.tr. Kutokana na asili ya kazi Waf, kwa chaguo-msingi faili haijaundwa kwenye saraka ya ndani, lakini katika saraka ya kiwango cha juu cha hazina. Ikiwa unataka kubadilisha njia ambapo athari zimehifadhiwa, basi unaweza kutumia parameter ya Waf ili kutaja --cwd. Hatujafanya hivi, kwa hivyo ili kuangalia faili ya kufuatilia ya ASCII myfirst.tr katika kihariri chako unachokipenda, tutahitaji kwenda kwenye saraka ya kiwango cha juu cha hazina yetu.

Inachanganua athari za ASCII

Kuna habari nyingi huko katika fomu mnene, lakini jambo la kwanza unahitaji kugundua ni kwamba faili lina mistari ya kibinafsi. Hii itaonekana wazi ikiwa utapanua dirisha la kutazama zaidi.

Kila mstari kwenye faili unalingana na tukio la kufuatilia. Katika hali hii, tunafuatilia matukio katika foleni ya upokezaji iliyopo katika kila kifaa cha mtandao cha uhakika hadi uhakika katika uigaji. Foleni ya usambazaji ni foleni ambayo kila pakiti lazima ipite kwa kiungo cha uhakika hadi hatua. Kumbuka kuwa kila mstari kwenye faili ya ufuatiliaji huanza na herufi moja (na ina nafasi baada yake). Alama hii itakuwa na maana ifuatayo:

+: operesheni ya foleni ilitokea kwenye foleni ya kifaa;
-: operesheni ya kurejesha kipengele ilitokea kwenye foleni ya kifaa;
d: pakiti ilishuka, kwa kawaida kwa sababu foleni ilikuwa imejaa;
r: Pakiti ilipokelewa na kifaa cha mtandao.

Hebu tuangalie kwa karibu mstari wa kwanza katika faili ya kufuatilia. Nitaigawanya katika sehemu (na indentations kwa uwazi) na nambari ya mstari upande wa kushoto:

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)

Sehemu ya kwanza ya tukio hili la ufuatiliaji lililopanuliwa (mstari wa 0) ni operesheni. Tunayo ishara + hapa, ambayo inalingana na uendeshaji wa foleni kwa maambukizi. Sehemu ya pili (mstari wa 1) ni wakati wa kuiga, unaoonyeshwa kwa sekunde. Unaweza kukumbuka tulichouliza UdpEchoClientApplication kuanza kutuma pakiti katika sekunde mbili. Hapa tunaona uthibitisho kwamba hii inafanyika kweli.

Sehemu inayofuata ya mfano wa ufuatiliaji (kutoka mstari wa 2) inaonyesha ni chanzo kipi kilizalisha tukio hili (kuonyesha ufuatiliaji wa nafasi ya majina). Unaweza kufikiria juu ya nafasi ya majina kama vile ungefanya nafasi ya jina la mfumo wa faili. Mzizi wa nafasi ya majina ni NodeList. Hii inalingana na kontena inayodhibitiwa katika nambari kuu ya ns-3. Inayo nodi zote ambazo zimeundwa kwenye hati. Kama vile mfumo wa faili unaweza kuwa na saraka kwenye mizizi yake, NodeList tunaweza kuwa na nodi nyingi. Kwa hivyo mstari /NodeList/0 inarejelea null nodi kwenye NodeList, ambayo huwa tunafikiria kama "nodi 0". Kila nodi ina orodha ya vifaa ambavyo vimewekwa. Orodha hii iko karibu na nafasi ya majina. Unaweza kuona kwamba tukio hili la ufuatiliaji linatoka Orodha ya vifaa/0, ambayo ni kifaa tupu kilichowekwa kwenye nodi.

Mstari mdogo unaofuata, $ ns3 :: PointToPointNetDevice, huambia ni kifaa kipi kiko katika nafasi ya sifuri: orodha ya kifaa cha nodi sifuri. Kumbuka kwamba utendakazi + uliopatikana kwenye mstari wa 0 ulimaanisha kuwa kipengee kiliongezwa kwenye foleni ya kusambaza ya kifaa. Hii inaonekana katika sehemu za mwisho za "njia ya wimbo": TxQueue/Enqueue.

Sehemu zilizobaki katika ufuatiliaji zinapaswa kuwa angavu. Mstari wa 3-4 unaonyesha kuwa pakiti imeingizwa katika itifaki ya uhakika hadi hatua. Mstari wa 5-7 unaonyesha kuwa pakiti ina kichwa cha toleo la IP4 na asili yake ni anwani ya IP 10.1.1.1 na imekusudiwa 10.1.1.2. Mstari wa 8-9 unaonyesha kuwa pakiti hii ina kichwa cha UDP na hatimaye mstari wa 10 unaonyesha kuwa upakiaji ni baiti 1024 zinazotarajiwa.

Mstari unaofuata katika faili ya ufuatiliaji unaonyesha kuwa pakiti sawa ilitolewa kutoka kwa foleni ya maambukizi kwenye nodi sawa.

Mstari wa tatu kwenye faili ya ufuatiliaji unaonyesha kuwa pakiti ilipokelewa na kifaa cha mtandao kwenye seva ya echo. Nimetoa tukio hapa chini.

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)

Kumbuka kwamba operesheni ya kufuatilia sasa ni r na muda wa kuiga umeongezwa hadi sekunde 2,25732. Ikiwa ulifuata mafunzo kwa uangalifu, hii inamaanisha kuwa uliacha DataRate na Ucheleweshaji wa Kiungo kwenye vifaa vyake vya msingi. Wakati huu unapaswa kujulikana, kama ulivyoona katika sehemu iliyopita.

Ingizo la nafasi ya jina la chanzo (mstari wa 2) limerekebishwa ili kuonyesha kwamba tukio hili linatokana na nodi 1 (/NodeList/1) na pakiti inapokelewa na chanzo cha ufuatiliaji (/MacRx) Inapaswa kuwa rahisi kwako kufuata harakati za pakiti kupitia topolojia kwa kuangalia athari zilizobaki kwenye faili.

5.3.2 Ufuatiliaji wa PCAP

Visaidizi vya Kifaa vya ns-3 vinaweza pia kutumiwa kuunda faili za ufuatiliaji katika umbizo la .pcap. Kifupi pcap (kwa kawaida huandikwa kwa herufi ndogo) huwakilisha kukamata pakiti na kwa hakika ni API inayojumuisha kufafanua umbizo la faili la .pcap. Programu maarufu zaidi inayoweza kusoma na kuonyesha umbizo hili ni Wireshark (iliyoitwa hapo awali Ethereal) Hata hivyo, kuna vichanganuzi vingi vya ufuatiliaji wa trafiki vinavyotumia muundo huu wa pakiti. Tunawahimiza watumiaji kutumia zana nyingi zinazopatikana ili kuchanganua ufuatiliaji wa pcap. Katika somo hili tutazingatia kutazama alama za pcap kwa kutumia tcpdump.

Kuwezesha ufuatiliaji wa pcap kunafanywa kwa mstari mmoja wa msimbo.

pointToPoint.EnablePcapAll ("myfirst");

Bandika mstari huu wa msimbo baada ya msimbo wa ufuatiliaji wa ASCII ambao tumeongeza hivi punde scratch/myfirst.cc. Kumbuka kwamba tulipitisha tu kamba "myfirst", si "myfirst.pcap" au kitu chochote sawa. Hii ni kwa sababu kigezo ni kiambishi awali, si jina kamili la faili. Wakati wa kuiga, msaidizi ataunda faili ya kufuatilia kwa kila kifaa cha uhakika hadi hatua. Majina ya faili yataundwa kwa kutumia kiambishi awali, nambari ya nodi, nambari ya kifaa na kiambishi tamati ".pcap'.

Kwa hati yetu ya mfano, tutaishia kuona faili zinazoitwa "yangu ya kwanza-0-0.pcap"Na"yangu ya kwanza-1-0.pcap", ambazo ni ufuatiliaji wa pcap kwa nodi 0-kifaa 0 na nodi 1-kifaa 0 mtawalia. Mara tu unapoongeza safu ya nambari ili kuwezesha ufuatiliaji wa pcap, unaweza kuendesha hati kwa njia ya kawaida:

$ ./waf --run scratch/myfirst

Ukiangalia katika saraka ya kiwango cha juu cha usambazaji wako, unapaswa kuona faili tatu: faili ya kufuatilia ya ASCII myfirst.tr, ambayo tulijifunza hapo awali, faili yangu ya kwanza-0-0.pcap ΠΈ yangu ya kwanza-1-0.pcap - faili mpya za pcap ambazo tumetoa hivi punde.

Pato la kusoma na tcpdump

Kwa sasa, njia rahisi ya kutazama faili za pcap ni kutumia 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

Katika dampo yangu ya kwanza-0-0.pcap (kifaa cha mteja) unaweza kuona pakiti ya echo inatumwa baada ya sekunde 2 za simulation. Ukiangalia dampo la pili (yangu ya kwanza-1-0.pcap), utaona kwamba pakiti inapokelewa kwa sekunde 2,257324. Utaona kwenye dampo la pili kwamba pakiti inarudishwa kwa sekunde 2.257324, na hatimaye kwamba pakiti ilipokelewa tena na mteja katika utupaji wa kwanza kwa sekunde 2.514648.

Pato la Kusoma na Wireshark

Ikiwa hujui Wireshark, kuna tovuti ambayo unaweza kupakua programu na nyaraka: http://www.wireshark.org/. Wireshark ni GUI ambayo inaweza kutumika kuonyesha faili hizi za ufuatiliaji. Ikiwa una Wireshark, unaweza kufungua faili zozote za ufuatiliaji na kuonyesha yaliyomo kana kwamba umenasa pakiti kwa kutumia kinusi cha pakiti.

Chanzo: mapenzi.com

Kuongeza maoni