Tutorial simulatora torê ns-3. Beşa 5

Tutorial simulatora torê ns-3. Beşa 5
beşa 1,2
beşa 3
beşa 4

5 Sazkirin
5.1 Bikaranîna modula têketinê
5.1.1 Pêşniyara têketinê
5.1.2 Têketinê çalak bike
5.1.3 Zêdekirina têketinê li koda xwe
5.2 Bikaranîna argumanên rêzika fermanê
5.2.1 Binpêkirina nirxên taybetmendiya xwerû
5.2.2 Girtina fermanên xwe
5.3 Bikaranîna pergala şopandinê
5.3.1 Şopandina ASCII
Parsing şopên ASCII
5.3.2 PCAP Trace

Chapter 5

ligorî

5.1 Bikaranîna modula têketinê

Me berê bi kurtî li modula têketinê ya ns-3 nihêrî ku li skrîptê nihêrî yekem.cc. Di vê beşê de, em ê ji nêz ve li ser karanîna gengaz ên ji bo binepergala têketinê binêrin.

5.1.1 Pêşniyara têketinê

Gelek pergalên mezin piştgirî didin celebek sazûmanek têketina peyamê, û ns-3 ne îstîsna ye. Di hin rewşan de, tenê peyamên xeletiyê li "konsolê operatorê" (ku bi gelemperî li ser pergalên Unix-based stderr e) têne nivîsandin. Li ser pergalên din, dibe ku peyamên hişyariyê û her weha agahdariya berfirehtir werin xuyang kirin. Di hin rewşan de, amûrên têketinê têne bikar anîn da ku peyamên debugkirinê derxînin ku dikarin zû derketinê tam bikin.

SubHRD-ya ku di ns-3-ê de tê bikar anîn destnîşan dike ku hemî van astên naveroka agahdariyê bikêr in, û em ji bo têketina peyamê nêzîkatiyek bijartî, qat peyda dikin. Têketin dikare bi tevahî were neçalak kirin, li ser bingeha per-hêmanek, an gerdûnî were çalak kirin. Ji bo vê armancê, astên verastkirî yên naveroka agahdariyê têne bikar anîn. Modula têketinê ya ns-3 rêgezek hêsan peyda dike ku hûn agahdariya kêrhatî ji simulasyona we bistînin.

Divê hûn fêm bikin ku em ji bo derxistina daneyan ji modelên we mekanîzmayek armancek gelemperî peyda dikin - şopandin - ku divê ji bo simulasyonên bijartî be (ji bo bêtir agahdarî li ser pergala meya şopandinê, li beşa fêrkirinê 5.3 binêre). Têketin divê rêbaza bijarte be ji bo bidestxistina agahdariya debugkirinê, hişyarî, peyamên xeletiyê, an jî ji bo ku hûn her gav zû peyamên ji nivîsar an modelên xwe derxînin.

Heya nuha, pergal heft astên (cûreyên) peyamên têketinê bi zêdebûna rêza naveroka agahdariyê diyar dike.

  • LOG_ERROR - Peyamên xeletiya têketinê (makroya têkildar: NS_LOG_ERROR);
  • LOG_WARN - Peyamên hişyariya têketinê (makroya têkildar: NS_LOG_WARN);
  • LOG_DEBUG - Peyamên debugkirinê yên taybetî yên kêm kêm têketin (makroya têkildar: NS_LOG_DEBUG);
  • LOG_INFO - qeydkirina peyamên agahdariyê di derbarê pêşkeftina bernameyê de (makroya têkildar: NS_LOG_INFO);
  • LOG_FUNCTION - Peyamên têketinê ku her fonksiyonek jê re tê gotin vedibêje (du makroyên têkildar: NS_LOG_FUNCTION, ji bo fonksiyonên endam tê bikar anîn, û NS_LOG_FUNCTION_NOARGS, ji bo fonksiyonên statîk tê bikar anîn);
  • LOG_LOGIC - têketina peyamên ku herikîna mentiqî ya di hundurê fonksiyonê de vedibêjin (makroya têkildar: NS_LOG_LOGIC);
  • LOG_ALL - Her tiştê ku li jor hatî destnîşan kirin tomar dike (makroya têkildar tune).
    Ji bo her cure (LOG_TYPE) LOG_LEVEL_TYPE jî heye, ku ger were bikar anîn, dihêle ku hemî astên jorîn ên wê ji bilî asta xwe bêne tomar kirin. (Wekî encam, LOG_ERROR û LOG_LEVEL_ERROR, û LOG_ALL û LOG_LEVEL_ALL ji hêla fonksiyonê ve hevwate ne.) Mînak, çalakkirina LOG_INFO dê tenê destûrê bide peyamên ku ji hêla makroya NS_LOG_INFO ve hatine peyda kirin, dema ku LOG_LEVEL_INFO ji hêla makro ve hatî peyda kirin, dema ku LOG_LEVEL_INFO peyamên ku ji hêla macro ve hatine peyda kirin LOG_LEVEL_INFO jî tê de hene. _HIŞYAR û NS_LOG_ÇEWT.

Em di heman demê de makroyek têketina bê şert û merc peyda dikin ku her gav tê xuyang kirin, bêyî ku asta têketinê an jî hêmana hilbijartinê hebe.

  • NS_LOG_UNCOND - Têketina bê şert a peyama têkildar (asta têketina têkildar tune).

Her ast dikare bi ferdî an bi hev ve were pirsîn. Têketin dikare bi karanîna guhêrbara hawîrdora sh NS_LOG an bi têketina bangek fonksiyonek pergalê were mîheng kirin. Wekî ku berê hate destnîşan kirin, pergala têketinê xwedan belgeyên Doxygen e û naha demek baş e ku hûn wê binirxînin heke we berê nekiriye.

Naha ku we belge bi hûrgulî xwendiye, bila em wê zanînê bikar bînin da ku ji skrîpta nimûneyê hin agahdariya balkêş bistînin. scratch/myfirst.ccku we berê berhev kiriye.

5.1.2 Têketinê çalak bike

Werin em guhêrbara jîngehê NS_LOG bikar bînin da ku hin têketinên din bimeşînin, lê pêşî, tenê ji bo ku guhên xwe bigirin, skrîpta paşîn wekî ku we berê kir, bimeşînin,

$ ./waf --run scratch/myfirst

Divê hûn derenca naskirî ya ji bernameya mînaka yekem ns-3 bibînin

$ 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

Derket holê ku peyamên "şandin" û "wergirtin" ku hûn li jor dibînin bi rastî peyamên qeydkirî ne. UdpEchoClientApplication и Serlêdana UdpEchoServer. Mînakî, em dikarin ji serîlêdanek xerîdar bipirsin ku bi danîna asta têketina xwe bi guhêrbara jîngehê NS_LOG agahdariya zêde çap bike.

Ji niha û pê ve, ez ê bihesibînim ku hûn şêlekek mîna sh-ê ku hevoksaziya "VARIABLE=value" bikar tîne bikar tînin. Heke hûn şêlek-csh-ê bikar tînin, wê hingê hûn neçar in ku mînakên min veguherînin hevoksaziya "nirxa guhêrbar setenv" ya ku ji hêla wan şêlan ve tê xwestin.

Heya nuha, serîlêdana xerîdar echo UDP bersivê dide rêzika kodê ya jêrîn scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

Ew asta têketinê LOG_LEVEL_INFO çalak dike. Dema ku em ala asta têketinê derbas dikin, em bi rastî wê astê û hemî astên jêrîn çalak dikin. Di vê rewşê de, me NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN û NS_LOG_ERROR çalak kir. Em dikarin asta têketinê zêde bikin û bêtir agahdarî bistînin, bêyî guhertinên skrîptê û ji nû ve berhevkirinê, bi danîna guhêrbara jîngehê NS_LOG wekî jêrîn:

$ export NS_LOG=UdpEchoClientApplication=level_all

Ji ber vê yekê me guhêrbara sh shell NS_LOG danî ser nirxa jêrîn,

UdpEchoClientApplication=level_all

Aliyê çepê yê peywirê navê pêkhateya qeydkirî ye ku em dixwazin mîheng bikin, û aliyê rastê ala ku em dixwazin ji bo wê bicîh bikin e. Di vê rewşê de, em ê di serîlêdanê de hemî astên xeletkirinê çalak bikin. Ger hûn skrîptê bi NS_LOG vesazkirî bi rê ve bibin, pergala têketinê ya ns-3 dê guhertinan qebûl bike û divê hûn derana jêrîn bibînin:

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

Zêdetir agahdariya çewtiyê ku ji hêla serîlêdanê ve hatî peyda kirin niha di asta NS_LOG_FUNCTION de ye. Ew her mînakek bangek fonksiyonê di dema pêkanîna skrîptê de nîşan dide. Wekî qaîdeyek gelemperî, di fonksiyonên rêbazê de çêtir e ku meriv bikar bîne (kêmtirîn)NS_LOG_FUNCTION (this)... Bikaranîn NS_LOG_FUNCTION_NOARGS ()
tenê di fonksiyonên statîk de. Lêbelê, bala xwe bidin ku pergala ns-3 ne hewce ye ku fonksiyonek têketinê piştgirî bike. Biryara ka çiqas agahdarî tê tomar kirin ji pêşdebirê modela kesane re tê hiştin. Di doza serîlêdanên echo de, hejmareke mezin ji hilberana têketinê heye.

Naha hûn dikarin têketinek bangên fonksiyonê yên ku ji hêla serîlêdanê ve hatine çêkirin bibînin. Ger hûn ji nêz ve lê mêze bikin, hûn ê di navbera rêzê de koloniyek bibînin UdpEchoClientApplication û navê rêbazê, li ku derê dibe ku hûn li bendê bin ku operatorê qada C++ (: :) bibînin. Ev bi qestî ye.

Ev bi rastî ne navê polê ye, lê navê beşa têketinê ye. Gava ku di navbera pelek çavkanî û polê de hevberdanek hebe, ew bi gelemperî navê polê ye, lê divê hûn zanibin ku ew bi rastî ne navê polê ye, û li şûna dubendiyek ducarî yek dubendî heye. Ev rêgezek e ku ji we re dibe alîkar ku hûn bi têgînî navê fasûla têketinê ji navê polê bi rengek hûrgulî veqetînin.

Lêbelê, di hin rewşan de dijwar e ku meriv diyar bike ka kîjan rêbaz bi rastî peyama têketinê diafirîne. Ger hûn li nivîsa li jor binerin, dibe ku hûn meraq bikin ka rêz li ku ye "Received 1024 bytes from 10.1.1.2" Hûn dikarin vê pirsgirêkê bi danîna astê çareser bikin prefix_func ji guherbara jîngehê NS_LOG. Ya jêrîn biceribînin:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

Bala xwe bidin ku nîşaneyên neqilkirinê hewce ne ji ber ku barê vertîkal ku em ji bo temsîlkirina operasyona OR bikar tînin di heman demê de girêdanek lûleya Unix-ê ye. Naha heke hûn skrîptê bimeşînin, hûn ê bibînin ku pergala têketinê piştrast dike ku her peyamek di têketinek diyar de bi navê pêkhateyê pêşgir e.

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

Naha hûn dikarin bibînin ku hemî peyamên ku ji serîlêdana xerîdar echo ya UDP têne wekî weha têne nas kirin. Peyam"Received 1024 bytes from 10.1.1.2" naha bi eşkere tête nasîn ku ji serîlêdana xerîdar echo tê. Divê peyama mayî ji serîlêdana servera echo ya UDP were. Em dikarin vê hêmanê bi ketina navnîşek pêkhateyên ji hev veqetandî yên di guhêrbara jîngehê NS_LOG de çalak bikin.

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

Hişyarî: Di mînaka nivîsa li jor de, hûn ê hewce bikin ku karaktera nû ya piştî dubenda (:) jêbirin, ew ji bo formatkirina belgeyê tê bikar anîn. Naha heke hûn skrîptê dimeşînin, hûn ê hemî peyamên têketinê ji serîlêdanên echo-ya xerîdar û serverê bibînin. Hûn dikarin bibînin ku ev di dema debuggkirinê de dikare pir bikêr be.

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

Di heman demê de carinan bikêr e ku meriv bikaribe dema simulasyonê ya ku tê de peyama têketinê hatî çêkirin bibînin. Hûn dikarin vê yekê bi lê zêdekirina bit OR bikin prefix_time:

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

Dîsa, hûn ê neçar bin ku karaktera nû ya jorîn jêbirin. Ger hûn nuha skrîptê dimeşînin divê hûn derana jêrîn bibînin:

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

Ji kerema xwe not bikin ku çêker ji bo UdpEchoServer di dema simulasyonê de 0 çirke hat gotin. Ev bi rastî beriya ku simulasyon dest pê bike diqewime, lê dem wekî sifir çirkeyan tê nîşandan. Heman tişt ji bo peyama çêker jî rast e 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()

Bînin bîra xwe ku senaryo xêzkirin/pêşîn.cc sepana servera echo yek saniye berî destpêkirina simulasyonê dest pê kir. Niha hûn dikarin wê rêbazê bibînin DestpêkApplication server bi rastî di duyemîn yekem de tê gotin. Hûn dikarin her weha bala xwe bidin ku xerîdar echo di duyemîn duyemîn a simulasyonê de dest pê dike, wekî ku me di skrîptê de pirsî.

Naha hûn dikarin li ser bangê pêşkeftina simulasyonê bişopînin ScheduleTransmit di muwekîlê ku bang li HandleRead vedigere Serîlêdana servera echo bişîne. Bala xwe bidinê ku dema derbasbûyî ji bo şandina pakêtekê li ser girêdanek xal-bi-point 3,69 milîsaniye ye. Hûn dikarin bibînin ku servera echo peyamek ku bersiv daye pakêtê tomar dike, û dûv re, piştî derengiya kanalê, hûn dibînin ku muwekîlê echo pakêta echo bi rêbaza xwe ya HandleRead distîne.

Di vê simulasyonê de, bêyî ku hûn pê hay bibin pir tişt diqewimin. Lê hûn dikarin bi çalakkirina hemî hêmanên têketinê di pergalê de pir bi hêsanî tevahiya pêvajoyê bişopînin. Biceribînin ku guhêrbar NS_LOG li nirxa jêrîn bicîh bikin,

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

Stêrka li jor ji bo pêkhateya têketinê karekterek hovane ye. Ev ê hemî navnîşan di hemî beşên ku di simulasyonê de têne bikar anîn de bigire. Ez ê li vir hilberanê dubare nekim (di dema nivîsandinê de ew ji bo yek pakêtek echo 1265 xetên derketinê çêdike), lê hûn dikarin vê agahiyê beralî pelek bikin û di edîtorê xweya bijare de bibînin.

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

Ez bixwe gava ku pirsgirêkek min heye û haya min jê tune ku tişt xelet çûne, vê guhertoya pir devkî ya têketinê bikar tînim. Ez dikarim pêkanîna kodê bi hêsanî bişopînim bêyî ku xalên veqetandinê destnîşan bikim û kodê di debugerê de derbas bikim. Ez tenê dikarim encam di edîtorê xweya bijare de biguherim û li tiştê ku ez hêvî dikim bigerim û bibînim ku tiştek ku min ne li bendê bû diqewime. Gava ku min ramanek gelemperî heye ka çi xelet diqewime, ez diçim nav debugger da ku pirsgirêkê bişopînim. Ev celeb encam dikare bi taybetî bikêr be dema ku nivîsara we tiştek bi tevahî nediyar dike. Ger hûn tenê debugger bikar bînin, dibe ku hûn bi tevahî zivirînek winda bikin. Qeydkirin zivirînên weha berbiçav dike.

5.1.3 Zêdekirina têketinê li koda xwe

Hûn dikarin bi çêkirina bangên ji pêkhateya têketinê ji gelek makroyan têketinên nû li simulasyonên xwe zêde bikin. Ka em wê di senaryoyekê de bikin myfirst.cc, ku em di pelrêça "paqij" de heye. Bînin bîra xwe ku me di vê senaryoyê de hêmanek têketinê diyar kir:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Hûn dizanin ku hûn dikarin bi danîna guhêrbara jîngehê NS_LOG di astên cihê de têketina hemî peyamên ji vê pêkhateyê çalak bikin. Ka em pêş de biçin û hin navnîşan li senaryoyê zêde bikin. Makroya ku ji bo zêdekirina peyamên asta agahdarî li têketinê tê bikar anîn NS_LOG_INFO ye. Werin em peyamek lê zêde bikin (tenê berî ku em dest bi çêkirina girêkan bikin) ku ji we re vedibêje ku skrîpt di qonaxa "Afirandina Topolojiyê" de ye. Ev di pişka koda jêrîn de tête kirin,
Vekirî ye scratch/myfirst.cc di edîtorê xweya bijare de û rêzê lê zêde bikin,
NS_LOG_INFO ("Creating Topology");
rast li ber rêzan,

NodeContainer nodes;
nodes.Create (2);

Naha bi karanîna skrîptê berhev bikin waf, û guhêrbara NS_LOG paqij bikin da ku weşana têketinê ya ku me berê çalak kiriye neçalak bike:

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

Hûn ê peyama nû nebînin ji ber ku hêmana têketinê ya têkildar (FirstScriptExample) nehatiye çalak kirin. Ji bo ku hûn peyama xwe bibînin, hûn hewce ne ku beşa têketinê çalak bikin FirstScriptExample bi asteke ne kêmtir ji NS_LOG_INFO. Heke hûn tenê dixwazin vê asta têketinê ya taybetî bibînin, hûn dikarin bi vî rengî çalak bikin,

$ export NS_LOG=FirstScriptExample=info

Ger hûn nuha skrîptê bimeşînin, hûn ê peyamek nû "Afirandina Topolojiyê" bibînin.

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 Bikaranîna argumanên rêzika fermanê

5.2.1 Binpêkirina nirxên taybetmendiya xwerû

Rêbazek din a guheztina tevgerên nivîsarên ns-3 bêyî sererastkirin an çêkirin ev e ku meriv argumanên rêzika fermanê bikar bîne. Em mekanîzmayek peyda dikin ku argumanên rêza fermanê pars bike û bixweber li gorî encaman guhêrbarên herêmî û gerdûnî saz bike.

Di karanîna pergala argumana rêzika fermanê de gava yekem ev e ku parserek rêza fermanê were ragihandin. Ev pir hêsan e (di bernameya weya sereke de), wekî di koda jêrîn de,

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

Ev pişka du-xêz a hêsan bi rastî bi serê xwe pir bikêr e. Ew derî li guherbar û pergala taybetmendiya gerdûnî ya ns-3 vedike. Ka em du rêzikên kodê li destpêka fonksiyona skrîptê ya sereke zêde bikin scratch/myfirst.cc. Dûv re, em skrîptê berhev dikin û dimeşînin, dema xebitîn em wekî jêrîn daxwazek alîkariyê dikin,

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

Ev ferman dê bipirse waf script run xêzkirin/myfirst û wê argumanek rêza fermanê derbas bikin -PrintHelp. Nîşanên neqilkirinê hewce ne ku nîşan bidin ku argûman ji bo kîjan bernameyê ye. Parsera rêza fermanê dê argumanê kifş bike -PrintHelp û dê bersivê nîşan bide,

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.

Niha em li vebijarkê binêrin -PrintAttributes. Me berê jî behsa pergala taybetmendiya ns-3 kiriye dema ku skrîpta yekem.cc dixwîne. Me rêzikên jêrîn ên kodê dît,

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

û wan wisa got DataRate bi rastî taybetmendiyek e PointToPointNetDevice. Ka em parsera argumana rêza fermanê bikar bînin da ku taybetmendiyan bibînin PointToPointNetDevice. Lîsteya alîkariyê dibêje ku divê em çi bidin TypeId. Ev navê çîna ku taybetmendiyên berjewendiyê tê de ye. Di rewşa me de wê bibe ns3::PointToPointNetDevice. Ka em bi pêş ve biçin, têkevin,

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

Pergal dê hemî taybetmendiyên vê celebê cîhaza torê çap bike. Hûn ê bibînin ku di nav taybetmendiyên navnîşê de ev in,

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

Ev nirxa xwerû ye ku dê ji hêla pergalê ve dema ku objektê diafirîne were bikar anîn PointToPointNetDevice. Em ê vê nirxa xwerû bi karanîna pîvanê bişopînin Pêşbîr в PointToPointHelper bilindtir. Ka em ji bo cîhaz û kanalên xal-bi-point nirxên xwerû bikar bînin. Ji bo vê yekê, em ê bangan jêbirin SetDeviceAttribute и SetChannelAttribute ji myfirst.cc, ku em di navnîşek paqij de heye.

Divê skrîpta we nuha bi tenê diyar bike PointToPointHelper û wekî ku di mînaka li jêr de tê xuyang kirin ti operasyonên sazkirinê pêk neynin,

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

Pêşde biçin û pê re skrîptek nû biafirînin waf (./waff) û em vegerin û hin têketinê ji serîlêdana servera echo ya UDP-ê têxin nav xwe û pêşgira demê jî têxin nav xwe.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

Ger hûn skrîptê dimeşînin divê hûn derana jêrîn bibînin:

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

Bînin bîra xwe ku cara paşîn me li dema simulasyonê nihêrî, gava ku pakêt ji hêla servera echo ve hatî wergirtin, ew 2,00369 çirke bû.

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

Niha ew pakêtê di 2.25732 çirkeyan de distîne. Ev e ji ber ku em bi tenê rêjeya daneya PointToPointNetDevice ji pênc megabit serê saniyeyê vediguhezînin nirxa xwerû, ku 32768 bit di çirkeyê de ye. Ger em bi karanîna rêzika fermanê DataRate-ya nû biguhezînin, em dikarin simulasyona xwe dîsa bilez bikin. Em ê li gorî formula ku ji hêla hêmana alîkariyê ve hatî destnîşan kirin wiha bikin:

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

Ev ê taybetmendiya DataRate vegerîne nirxa xweya xwerû ya pênc megabit per second. Ma hûn ji encamê şaş in? Derket holê ku ji bo vegerandina tevgera orîjînal a senaryoyê, em jî hewce ne ku derengiya kanalê bicîh bikin ku bi leza ronahiyê re têkildar be. Em dikarin ji pergala rêza fermanê bipirsin ku taybetmendiyên kanalê çap bike, mîna ku me ji bo cîhaza torê kir:

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

Em ê bibînin ku taybetmendiya derengiya kanalê bi vî rengî tête danîn:

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

Dûv re, em dikarin bi pergala rêza fermanê, van her du nirxên xwerû destnîşan bikin.

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

di vê rewşê de em dema ku me bi eşkereyî Danasîna Rêjeya Danasînê û Derengiya di skrîptê de danîbû vegerandin:

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

Bala xwe bidinê ku pakêt piştî 2,00369 saniyeyan dîsa ji hêla serverê ve tê wergirtin. Em bi rastî dikarin yek ji wan taybetmendiyên ku di skrîptê de têne bikar anîn bi vî rengî destnîşan bikin. Bi taybetî, em dikarin taybetmendiyên MaxPackets li nirxên ne-yek bicîh bikin UdpEchoClient.

Hûn ê çawa bikar bînin? Şensekê bidê. Bînin bîra xwe ku divê hûn cîhê ku em nirxa taybetmendiya xwerû lêdixin û bi eşkere destnîşan dikin şîrove bikin MaxPackets di senaryoyê de. Wê hingê divê hûn skrîptê ji nû ve ava bikin. Her weha hûn dikarin rêzika fermanê bikar bînin da ku ji bo danîna nirxek taybetmendiyek xwerû ya nû arîkariya hevoksaziyê bistînin. Dema ku hûn vê yekê fêm bikin, hûn dikarin hejmara pakêtên ku li ser rêzika fermanê têne xuyang kirin kontrol bikin. Ji ber ku em mirovên xwendewar in, rêza fermana me divê bi vî rengî xuya bike:

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

Pirsa xwezayî ya ku di vê xalê de derdikeve holê ev e ku meriv çawa li ser hebûna van hemî taybetmendiyan zanibe. Dîsa, pergala rêza fermanê ji bo vê yekê fonksiyonek alîkariyê heye. Ger em ji rêzika fermanê alîkariyê bixwazin, divê em bibînin:

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

Heke hûn argumana "PrintGroups" hilbijêrin, divê hûn navnîşek hemî komên qeydkirî bibînin TypeId. Navên komê bi navên modulên pelrêça çavkaniyê re hevaheng in (her çend bi sermiyanê be jî). Çapkirina hemî agahdarî bi yekcarî dê pir mezin be, ji ber vê yekê parzûnek zêde heye ku agahdariya li gorî komê çap bike. Ji ber vê yekê, dîsa balê dikişîne ser modula xal-bi-point:

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

Li vir hûn dikarin navên TypeId-ê yên berdest ji bo lêgerînên taybetmendiyê bibînin, mînakî di
--PrintAttributes = ns3 :: PointToPointChannelwek ku li jor tê nîşandan.

Rêyek din a fêrbûna taybetmendiyan bi Doxygen ns‑3 e. Rûpelek heye ku hemî taybetmendiyên ku di simulatorê de hatine tomar kirin navnîş dike.

5.2.2 Girtina fermanên xwe

Di heman demê de hûn dikarin bi pergala rêza fermanê çengên xwe jî zêde bikin. Ev bi hêsanî bi karanîna rêbaza parsera rêza fermanê tête kirin AddValue.
Ka em vê taybetmendiyê bikar bînin da ku hejmara pakêtên ku bi rengek bi tevahî cûda têne xuyang kirin diyar bikin. Werin em guhêrbarek herêmî ku jê re tê gotin lê zêde bikin nPaketan nav fonksiyonek dest. Em ê wê bikin yek da ku bi tevgera xweya xwerû ya berê re li hev bike. Ji bo ku rê bidin parsera rêza fermanê ku vê nirxê biguherîne, divê em vê nirxê di parserê de bigirin. Em vê yekê bi lêzêdekirina bangekê dikin AddValue. Herin û senaryoyê biguherînin scratch/myfirst.cc da ku hûn bi koda jêrîn dest pê bikin,

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

Bigerin heta xala di skrîptê de ku me taybetmendiya MaxPackets danîne û wê biguhezîne da ku ew li şûna 1-ya domdar, wekî ku li jêr tê xuyang kirin, li guhêrbara nPackets were danîn.

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

Naha heke hûn skrîptê dimeşînin û argumana -PrintHelp peyda dikin, divê hûn argumana bikarhênerê nû bibînin. li ser ekrana alîkariyê hatî navnîş kirin. Derbasbûn,

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

Heke hûn dixwazin hejmara pakêtên hatine şandin biguhezînin, hûn dikarin bi danîna argumana rêzika fermanê - -nPackets bikin.

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

Niha divê hûn niha bibînin

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

We niha du pakêt şandine. Pir hêsan e, ne wusa?
Hûn dikarin bibînin ku wekî bikarhênerek ns-3, hûn dikarin pergala argumana xeta fermanê bikar bînin da ku nirx û taybetmendiyên gerdûnî manipul bikin. Ger hûn nivîskarê modelê bin, hûn dikarin taybetmendiyên nû li tiştên xwe zêde bikin û ew ê bixweber ji bo veavakirinê ji hêla bikarhênerên we ve bi navgîniya pergala rêza fermanê ve peyda bibin. Ger hûn nivîskarek nivîsarê bin, hûn dikarin guhêrbarên nû li nivîsarên xwe zêde bikin û wan bêkêmasî têxin nav pergala rêza fermana xwe.

5.3 Bikaranîna pergala şopandinê

Tevahiya xala modelkirinê ew e ku ji bo lêkolînek bêtir encamek hilberîne, û pergala şopandina ns-3 ji bo vê yekê mekanîzmaya sereke ye. Ji ber ku ns-3 bernameyek C++ ye, rêgezên standard ên hilberîna encam ji bernameyek C++ dikare were bikar anîn:

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

Tewra hûn dikarin modulek têketinê bikar bînin da ku avahiyek piçûk li çareseriya xwe zêde bikin. Gelek pirsgirêkên naskirî hene ku ji hêla vê nêzîkbûnê ve têne çêkirin, û ji ber vê yekê me ji bo çareserkirina van pirsgirêkan bine-pergalek şopandina bûyera gelemperî peyda kiriye.

Armancên sereke yên pergala şopandina ns-3 ev in:

  • Ji bo karên bingehîn, divê pergala şopandinê rê bide bikarhêner ku ji bo çavkaniyên populer şopek standard çêbike û tiştên ku şopê çêdikin hilbijêrin;

  • Bikarhênerên navîn divê bikaribin pergala şopandinê dirêj bikin da ku formata derketinê ya hilberandî biguhezînin an çavkaniyên şopê yên nû têxin, bêyî ku bingeha simulatorê biguhezînin;

  • Bikarhênerên pêşkeftî dikarin bingehê simulatorê biguhezînin da ku çavkanîyên şop û sindoqên nû zêde bikin. Pergala şopandina ns-3 li ser prensîbên çavkaniyên şopandina serbixwe û wergirên, û her weha mekanîzmayek yekgirtî ji bo girêdana çavkaniyan bi xerîdaran re hatî çêkirin.

Pergala şopandina ns-3 li ser prensîbên çavkanî û wergirên şopandina serbixwe, û her weha mekanîzmayek yekgirtî ji bo girêdana çavkaniyan bi wergiran ve hatî çêkirin. Çavkaniyên şopandinê tiştên ku dikarin bûyerên ku di simulasyonê de diqewimin nîşan bidin û gihîştina daneyên bingehîn ên balkêş peyda bikin. Mînakî, çavkaniyek şopandinê dikare dema ku amûrek torê pakêtek wergirtiye destnîşan bike û naveroka pakêtê ji wergirên şopên eleqedar re peyda bike.

Çavkaniyên şopandinê bi serê xwe bêkêr in heya ku ew bi beşên din ên kodê re ku bi rastî bi agahdariya ku ji hêla lavaboyê ve hatî peyda kirin tiştek kêrhatî dikin "hev" nebin. Tracer xerîdarên bûyer û daneyên ku ji hêla çavkaniyên şopandinê ve têne peyda kirin in. Mînakî, hûn dikarin sinkek şopê biafirînin ku dê (gava ku bi çavkaniya şopa mînaka berê ve were girêdan) beşên balkêş ên pakêta wergirtî çap bike.

Aqilê vê veqetandina eşkere ev e ku rê bide bikarhêneran ku cûreyên nû yên lavaboyê bi çavkaniyên şopê yên heyî ve girêdin bêyî ku hewce nebin ku bingeha simulatorê biguherînin û ji nû ve berhev bikin. Ji ber vê yekê di mînaka li jor de, bikarhêner dikare di skrîpta xwe de şopek nû diyar bike û tenê bi guherandina skrîpta bikarhêner ve bi çavkaniyek şopek heyî ya ku di bingeha simulasyonê de hatî destnîşan kirin ve girêbide.

Di vê tutoriyê de, em ê hin jêderên pêşdebirandî û sindoqan re derbas bikin û destnîşan bikin ka ew çawa dikarin bi hindiktirîn hewildana ji hêla bikarhêner ve werin mîheng kirin. Ji bo agahdariya li ser veavakirina şopa pêşkeftî, di nav de berfirehkirina cîhê navên şopê û afirandina çavkaniyên şopê yên nû, li ns-3 Manual an beşên çawa-to binêre.

5.3.1 Şopandina ASCII

ns-3 fonksiyonek arîkar peyda dike ku pergalek şopandina asta nizm peyda dike da ku di dema sazkirina şopên pakêtê yên hêsan de bi hûrguliyan re bibe alîkar. Heke hûn vê taybetmendiyê çalak bikin, hûn ê di pelên ASCII de encam bibînin. Ji bo kesên ku bi hilberîna ns-2-ê re nas dikin, ev celeb şopek dişibihe der.tr, ku ji hêla gelek tîpan ve hatî çêkirin.

Werin em werin ser kar û hin encamên şopandina ASCII li skrîpta xweya scratch/myfirst.cc zêde bikin. Hema berî bangê Simulator :: Run (), rêzikên jêrîn ên kodê zêde bikin:
AsciiTraceHelper ascii;

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

Mîna gelek biwêjên din ên ns-3, ev kod amûrek alîkar bikar tîne da ku şopên ASCII biafirîne. Rêza duyemîn du bangên rêbaza hêlîn dihewîne. Rêbaza "hundir". CreateFileStream() îdyoma nesneya nenas bi kar tîne da ku li ser stikê (bê navek tişt) nestek pelê biafirîne û wê ji rêbaza tê gotin re derbas dike. Em ê di pêşerojê de kûrtir biçin nav vê yekê, lê tiştê ku divê hûn di vê nuqteyê de zanibin ev e ku hûn nesneyek ku pelek bi navê temsîl dike diafirînin. myfirst.tr û wê veguhezînin ns-3. Em bi ns-3 ve spartin ku lênihêrîna tişta hatî afirandin di tevahiya jiyana xwe de, di dema ku ew pirsgirêkên ku ji ber tixûbek hindik-naskirî (mebestî) ve girêdayî bi çêkerên kopî yên ciyê stream-ê yên C++ re çareser dike.

Banga derve EnableAsciiAll() ji arîkar re dibêje ku hûn dixwazin şopandina ASCII di simulasyona xwe de ji bo hemî girêdanên cîhaza xal-bi-xal bixin û ku hûn dixwazin wergirên şopê (teybet) ku agahdariya tevgera pakêtê di formata ASCII de tomar bikin.

Ji bo kesên ku bi ns-2-ê nas dikin, bûyerên şopandinî bi xalên şopandinê yên naskirî re wekhev in ku bûyerên "+", "-", "d" û "r" tomar dikin.
Naha hûn dikarin skrîptê ava bikin û wê ji rêzika fermanê bimeşînin:

$ ./waf --run scratch/myfirst

Mîna gelek caran berê, hûn ê çend peyaman ji Waf-ê bibînin, û dûv re bi hin peyamên bernameya xebitandinê re "'avakirin' bi serfirazî qediya".

Dema ku dimeşîne, bername dê pelek bi navê xwe çêbike myfirst.tr. Ji ber xwezaya kar waf, bi xwerû pel ne di pelrêça herêmî de, lê di pelrêça asta jorîn a depoyê de tê afirandin. Ger hûn dixwazin riya ku şop lê têne tomar kirin biguhezînin, wê hingê hûn dikarin pîvana Waf bikar bînin da ku wê diyar bikin. --cwd. Me ev yek nekiriye, ji ber vê yekê ji bo ku em li pelê şopa ASCII myfirst.tr di edîtorê xweya bijare de binihêrin, divê em biçin pelrêça jorîn a depoya xwe.

Parsing şopên ASCII

Li wir gelek agahdarî bi rengek berbiçav heye, lê yekem tiştê ku divê hûn bala xwe bidin ev e ku pel ji rêzikên kesane pêk tê. Ger hûn pencereya dîtinê berfirehtir bikin dê ev bi zelalî xuya bibe.

Di pelê de her rêzek bi bûyerek şopandinê re têkildar e. Di vê rewşê de, em bûyerên di rêza veguheztinê de ku di her cîhaza torê ya xal-bi-xal de di simulasyonê de hene bişopînin. Dora veguheztinê ew rêz e ku divê her pakêt ji bo girêdanek xal-bi-point tê de derbas bibe. Bala xwe bidinê ku her rêzek di pelê şopê de bi yek karakterek dest pê dike (û li dû wê cîhek heye). Ev sembol dê wateya jêrîn hebe:

+: operasiyonek rêzgirtinê li ser rêza cîhazê qewimî;
-: di rêza cîhazê de operasyonek vegerandina hêmanan pêk hat;
d: pakêt hat avêtin, bi gelemperî ji ber ku dorê tije bû;
r: Paket ji hêla amûrek torê ve hate wergirtin.

Ka em ji nêz ve li rêza yekem a pelê şopê binêre. Ez ê wê li ser perçeyan (ji bo zelalbûnê bi dendikan) û jimareya rêzê li milê çepê vekim:

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)

Beşa yekem a vê bûyera şopa dirêjkirî (xêza 0) operasyon e. Em li vir nîşanek + heye, ku bi operasyona ragirtinê ya ji bo veguheztinê re têkildar e. Beşa duyemîn (xêza 1) dema simulasyonê ye, ku di çirkeyan de tête diyar kirin. Hûn dikarin bîr bînin ku me çi pirsî UdpEchoClientApplication di du saniyan de dest bi şandina pakêtan bikin. Li vir em piştrast dikin ku ev bi rastî diqewime.

Beşa din a mînaka şopê (ji rêza 2) nîşan dide ku kîjan çavkaniya şopê ev bûyer çêkiriye (şopa cîhê navan nîşan dide). Hûn dikarin cîhê navên şopandinê mîna cîhê navek pergala pelan bifikirin. Koka navan e NodeList. Ev bi konteynera ku di koda sereke ya ns-3 de hatî rêve kirin re têkildar e. Ew hemî girêkên ku di skrîptê de hatine afirandin vedihewîne. Mîna ku pergalek pelan dikare di koka xwe de pelrêçan hebe, NodeList em dikarin gelek girêk hebin. Ji ber vê yekê rêzika /NodeList/0 di NodeList-ê de girêka null vedibêje, ku em bi gelemperî wekî "node 0" difikirin. Her nodek navnîşek amûrên ku hatine saz kirin heye. Ev navnîş di cîhê navan de paşî ye. Hûn dikarin bibînin ku ev bûyera şopê ji tê DeviceList/0, ku amûra null e ku di girêkê de hatî saz kirin.

Binhêja paşîn, $ ns3 :: PointToPointNetDevice, vedibêje ka kîjan cîhaz di pozîsyona sifir de ye: navnîşa cîhaza girêka sifir. Bînin bîra xwe ku operasyona + di rêza 0 de tê vê wateyê ku hêmanek li rêza veguheztina cîhazê hate zêdekirin. Ev di beşên paşîn ên "rêya rê" de tê xuyang kirin: TxQueue / Enqueue.

Divê beşên mayî yên di şopê de bi rengek berbiçav bin. Rêzên 3-4 destnîşan dikin ku pakêt di protokolek xal-bi-xal de tête girtin. Rêzên 5-7 destnîşan dikin ku pakêt sernavek guhertoya IP4 heye û ji navnîşana IP-yê derketiye 10.1.1.1 û ji bo tê armanc kirin 10.1.1.2. Rêzên 8-9 destnîşan dikin ku vê pakêtê sernavek UDP heye û di dawiyê de rêza 10 destnîşan dike ku bargiraniya 1024 baytên çaverêkirî ye.

Rêza din a di pelê şopê de destnîşan dike ku heman pakêt ji rêza veguheztinê ya li ser heman girêk hate kişandin.

Rêza sêyemîn di pelê şopê de destnîşan dike ku pakêt ji hêla amûrek torê ya li ser mêvandarê servera echo ve hatî wergirtin. Min bûyera li jêr dubare kir.

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)

Bala xwe bidinê ku operasyona şopandinê naha r ye û dema simulasyonê heya 2,25732 çirke zêde bûye. Ger we bi baldarî dersdariyê bişopîne, ev tê vê wateyê ku we DataRate û Derengiya Girêdanê ya cîhazên torê li nirxên xweya xwerû hiştin. Ev tewang divê nas be, wek ku we di beşa berê de dît.

Têketina cîha navan a çavkaniya şopandinê (xêza 2) hate guheztin ku nîşan bide ku ev bûyer ji girêka 1 (/NodeList/1) û pakêt ji hêla çavkaniya şopê ve tê wergirtin (/MacRx). Pêdivî ye ku hûn ji we re pir hêsan be ku hûn li şopên mayî yên di pelê de bişopînin tevgera pakêtê di nav topolojiyê de.

5.3.2 PCAP Trace

Alîkarên Amûra ns-3 jî dikarin ji bo afirandina pelên şopê yên di formata .pcap de werin bikar anîn. Acronym pcap (bi gelemperî bi tîpên piçûk têne nivîsandin) ji bo girtina pakêtê radiweste û bi rastî API-yek e ku tê de pênasekirina forma pelê .pcap vedihewîne. Bernameya herî populer a ku dikare vê formatê bixwîne û nîşan bide ev e Wireshark (berê tê gotin Ethereal). Lêbelê, gelek analîzkerên şopa trafîkê hene ku vê forma pakêtê bikar tînin. Em bikarhêneran teşwîq dikin ku gelek amûrên berdest bikar bînin da ku şopên pcap analîz bikin. Di vê tutoriyê de em ê li ser dîtina şopên pcap-ê bi kar bînin tcpdump.

Çalakkirina şopandina pcap bi yek rêzek kodê ve tête kirin.

pointToPoint.EnablePcapAll ("myfirst");

Vê rêza kodê li dû koda şopandina ASCII ku me tenê lê zêde kir bişopînin scratch/myfirst.cc. Bala xwe bidinê ku me tenê rêzika "myfirst", ne "myfirst.pcap" an tiştek mîna wî derbas kir. Ev ji ber ku parametre pêşgirek e, ne navek pelê ya tevahî ye. Di dema simulasyonê de, arîkar dê bi rastî ji bo her amûrek xal-bi-point pelek şopê biafirîne. Navên pelan dê bi karanîna pêşgir, jimareya girêk, jimareya cîhazê û paşgira " bêne çêkirin.pcap".

Ji bo skrîpta xweya nimûne, em ê dawî li pelên bi navê "myfirst-0-0.pcap"And"myfirst-1-0.pcap", ku bi rêzê ji bo node 0-amûra 0 û node 1-amûra 0 şopên pcap in. Gava ku we rêzika kodê lê zêde kir da ku şopandina pcap çalak bike, hûn dikarin skrîptê bi awayê gelemperî bimeşînin:

$ ./waf --run scratch/myfirst

Ger hûn li pelrêça jorîn a belavkirina xwe binêrin, divê hûn sê pelan bibînin: pelek şopek ASCII myfirst.tr, ku me berê lêkolîn kir, pelan myfirst-0-0.pcap и myfirst-1-0.pcap - Pelên pcap-ê yên nû yên ku me nû çêkirine.

Xwendina encam bi tcpdump

Heya nuha, riya herî hêsan a dîtina pelên pcap karanîna tcpdump e.

$ 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

Li çolê myfirst-0-0.pcap (cîhaza xerîdar) hûn dikarin bibînin ku pakêta echo piştî 2 çirkeyên simulasyonê tê şandin. Ger hûn li çolê duyemîn binêrin (myfirst-1-0.pcap), hûn ê bibînin ku pakêt di 2,257324 çirke de tê wergirtin. Hûn ê di avêtina duyemîn de bibînin ku pakêt di 2.257324 çirkeyan de tê vegerandin, û di dawiyê de ku pakêt ji hêla xerîdar ve di avêtina yekem de di 2.514648 çirke de hate vegerandin.

Xwendina Derketina bi Wireshark

Ger hûn ne nas in Wireshark, malperek heye ku hûn dikarin bername û belgeyan jê dakêşin: http://www.wireshark.org/. Wireshark GUI-yek e ku dikare were bikar anîn da ku van pelên şopandinê nîşan bide. Ger we Wireshark heye, hûn dikarin yek ji pelên şopê vekin û naverokê nîşan bidin mîna ku we pakêtan bi karanîna snifferek pakêtê girtibe.

Source: www.habr.com

Add a comment