ns-3 Network Simulator Tutorial. Kapitel 5

ns-3 Network Simulator Tutorial. Kapitel 5
Kapitel 1,2
Kapitel 3
Kapitel 4

5 Astellung
5.1 Benotzt de Loggingsmodul
5.1.1 Logged Iwwersiicht
5.1.2 Aktivéiert Logged
5.1.3 Aloggen op Äre Code dobäizemaachen
5.2 Benotzen Kommando Linn Argumenter
5.2.1 Iwwerdribblen Standard Attribut Wäerter
5.2.2 Är eege Kommandoen erfaassen
5.3 Benotzt de Tracing System
5.3.1 ASCII Tracing
Parsing ASCII Spuren
5.3.2 PCAP Trace

Kapitel 5

Upassung

5.1 Benotzt de Loggingsmodul

Mir hu scho kuerz op den ns-3 Logging Modul gekuckt andeems mir de Skript kucken éischt.cc. An dësem Kapitel wäerte mir e méi genau kucken op méiglech Notzunge fir de Logbicher-Subsystem.

5.1.1 Logged Iwwersiicht

Vill grouss Systemer ënnerstëtzen eng Aart vu Messageloggingsanlag, an ns-3 ass keng Ausnahm. An e puer Fäll ginn nëmme Feelermeldungen op d'"Operateurkonsole" geschriwwe (wat normalerweis stderr op Unix-baséiert Systemer ass). Op anere Systemer kënnen Warnungsmeldungen a méi detailléiert Informatioun ugewise ginn. An e puer Fäll ginn Loggings-Tools benotzt fir Debug-Messagen auszeginn, déi d'Ausgab séier verschwannen kënnen.

De SubHRD, deen an ns-3 benotzt gëtt, gëtt ugeholl datt all dës Informatiounsinhaltsniveauen nëtzlech sinn, a mir bidden eng selektiv, schichten Approche fir Messagen ze protokolléieren. Logging kann komplett ausgeschalt ginn, aktivéiert op enger Per-Komponent Basis oder global. Fir dësen Zweck gi justierbar Niveauen vum Informatiounsinhalt benotzt. Den ns-3 Logmodul bitt e relativ einfache Wee fir nëtzlech Informatioun aus Ärer Simulatioun ze kréien.

Dir sollt verstoen datt mir en allgemengen Zweck Mechanismus ubidden - Tracing - fir Daten aus Äre Modeller ze extrahieren, wat de bevorzugten Output fir Simulatioune sollt sinn (fir méi Informatioun iwwer eise Tracing System, kuckt Tutorial Sektioun 5.3). Logging sollt déi bevorzugt Method sinn fir Debugginginformatioun, Warnungen, Fehlermeldungen ze kréien oder fir séier Messagen vun Äre Scripten oder Modeller zu all Moment auszeginn.

De Moment definéiert de System siwen Niveauen (Typen) vu Logmeldungen an der Erhéijung vun der Uerdnung vum Informatiounsinhalt.

  • LOG_ERROR - logging Fehlermeldungen (Zesummenhang Makro: NS_LOG_ERROR);
  • LOG_WARN - Log Warnung Messagen (Zesummenhang Macro: NS_LOG_WARN);
  • LOG_DEBUG - Log relativ seelen speziell Debug Messagen (Zesummenhang Macro: NS_LOG_DEBUG);
  • LOG_INFO - Aschreiwung vun Informatiounsmeldungen iwwer de Fortschrëtt vum Programm (Zesummenhang Makro: NS_LOG_INFO);
  • LOG_FUNCTION - Logs Messagen déi all Funktioun genannt beschreiwen (zwee Zesummenhang macros: NS_LOG_FUNCTION, benotzt fir Member Funktiounen, an NS_LOG_FUNCTION_NOARGS, benotzt fir statesch Funktiounen);
  • LOG_LOGIC - Logged Messagen déi de logesche Flux bannent enger Funktioun beschreiwen (Zesummenhang Makro: NS_LOG_LOGIC);
  • LOG_ALL - Logt alles uewen ernimmt (kee verbonne Makro).
    Fir all Typ (LOG_TYPE) gëtt et och e LOG_LEVEL_TYPE, deen, wa se benotzt gëtt, erlaabt datt all Niveauen doriwwer zousätzlech zu sengem eegenen Niveau protokolléiert ginn. (Als Konsequenz, LOG_ERROR an LOG_LEVEL_ERROR, an LOG_ALL an LOG_LEVEL_ALL sinn funktionell gläichwäerteg.) Zum Beispill, aktivéiert LOG_INFO erlaabt nëmmen Messagen, déi vum NS_LOG_INFO Makro zur Verfügung gestallt gëtt, wärend LOG_LEVEL_INFO aktivéiert gëtt och Messagen, déi vun de Macro_DE_LOGRN_LOGRNS, WAOR_DE_LOGRNS_ an WARN_LOGR_LOGR.

Mir bidden och en bedingungslosen Loggingsmakro deen ëmmer ugewise gëtt, onofhängeg vum Logniveau oder der Selektiounskomponent.

  • NS_LOG_UNCOND - Bedingungslos Logbuch vun der assoziéierter Noriicht (keng assoziéiert Logniveau).

All Niveau kann individuell oder kumulativ gefrot ginn. Logging kann mat der sh Ëmfeld Variabel NS_LOG konfiguréiert ginn oder andeems Dir e Systemfunktiounsruff protokolléiert. Wéi virdru gewisen, huet de Logsystem Doxygen Dokumentatioun an elo ass eng gutt Zäit et ze iwwerpréiwen wann Dir et net schonn hutt.

Elo datt Dir d'Dokumentatioun am Detail gelies hutt, loosst eis dat Wëssen benotze fir interessant Informatioun aus dem Beispillskript ze kréien scratch/myfirst.ccdéi Dir scho kompiléiert hutt.

5.1.2 Aktivéiert Logged

Loosst eis d'NS_LOG Ëmfeldvariabel benotzen fir e puer méi Logbicher auszeféieren, awer als éischt, just fir Är Lager ze kréien, lafen de leschte Skript wéi Dir virdru gemaach hutt,

$ ./waf --run scratch/myfirst

Dir sollt de vertraute Ausgab vum éischte ns-3 Beispillprogramm gesinn

$ 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

Et stellt sech eraus datt déi "geschéckt" an "empfangen" Messagen, déi Dir hei uewen gesitt, tatsächlech protokolléiert Messagen sinn UdpEchoClientApplication и UdpEchoServerApplication. Zum Beispill kënne mir d'Clientapplikatioun froen fir zousätzlech Informatioun ze drécken andeems se säi Logniveau iwwer d'NS_LOG Ëmfeldvariabel setzen.

Vun elo un ginn ech un datt Dir eng sh-ähnlech Shell benotzt déi d'Syntax "VARIABLE = Wäert" benotzt. Wann Dir eng csh-ähnlech Shell benotzt, da musst Dir meng Beispiller an d'Syntax "setenv variabelen Wäert" konvertéieren, déi vun dëse Shells erfuerderlech ass.

De Moment reagéiert d'UDP Echo Client Applikatioun op déi folgend Zeil vum Code an scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

Et erméiglecht de Logbicherniveau LOG_LEVEL_INFO. Wa mir e Logbicherniveau Fändel passéieren, aktivéiere mir tatsächlech deen Niveau an all nidderegen Niveauen. An dësem Fall hu mir NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN an NS_LOG_ERROR aktivéiert. Mir kënnen de Logbicherniveau erhéijen a méi Informatioun kréien, ouni Skriptännerungen a Recompilatioun, andeems Dir d'NS_LOG Ëmfeldvariabel wéi follegt setzt:

$ export NS_LOG=UdpEchoClientApplication=level_all

Also setzen mir d'Shell Variabel NS_LOG op de folgende Wäert,

UdpEchoClientApplication=level_all

Déi lénks Säit vun der Aufgab ass den Numm vun der protokolléierter Komponent, déi mir wëllen konfiguréieren, an déi riets Säit ass de Fändel, dee mir dofir wëllen applizéieren. An dësem Fall wäerte mir all Niveau vun Debugging an der Applikatioun aktivéieren. Wann Dir de Skript mat NS_LOG op dës Manéier ausféiert, akzeptéiert den ns-3 Logging System d'Ännerungen an Dir sollt déi folgend Ausgang gesinn:

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

Zousätzlech Debugging Informatioun vun der Applikatioun gëtt elo um NS_LOG_FUNCTION Niveau. Et weist all Instanz vun engem Funktiounsruff wärend der Skriptausféierung. Als allgemeng Regel, a Method Funktiounen ass et léiwer ze benotzen (op e Minimum)NS_LOG_FUNCTION (this)... Benotzt NS_LOG_FUNCTION_NOARGS ()
nëmmen a statesche Funktiounen. Notéiert awer datt den ns-3 System net erfuerderlech ass fir eng Logfunktioun z'ënnerstëtzen. D'Entscheedung iwwer wéi vill Informatioun opgeholl gëtt ass dem individuellen Modellentwéckler iwwerlooss. Am Fall vun Echo Uwendungen ass eng grouss Quantitéit u Loggingsoutput verfügbar.

Dir kënnt elo e Logbuch vu Funktiounsuriff kucken, déi vun der Applikatioun gemaach goufen. Wann Dir genau kuckt, gesitt Dir e Colon tëscht der Linn UdpEchoClientApplication an den Numm vun der Method, wou Dir kéint erwaarden den C++ Ëmfangoperateur ze gesinn (: :). Dëst ass virsiichteg.

Dëst ass eigentlech net den Numm vun der Klass, mee den Numm vun der Logkomponent. Wann et e Match tëscht enger Quelldatei an enger Klass ass, ass et normalerweis den Numm vun der Klass, awer Dir sollt feststellen datt et net tatsächlech den Numm vun der Klass ass, an et gëtt eng eenzeg Colon amplaz vun engem Duebele Colon. Dëst ass e Wee fir Iech ze hëllefen de Logbichernumm vum Klassennumm konzeptuell op eng relativ subtil Manéier ze trennen.

Wéi och ëmmer, an e puer Fäll kann et schwiereg sinn ze bestëmmen wéi eng Method tatsächlech de Log Message generéiert. Wann Dir den Text hei uewen kuckt, frot Dir Iech vläicht wou d'Linn "Received 1024 bytes from 10.1.1.2" Dir kënnt dëse Problem léisen andeems Dir den Niveau setzt prefix_func an d'NS_LOG Ëmfeld Variabel. Probéiert déi folgend:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

Bedenkt datt d'Zitatzeechen noutwendeg sinn, well déi vertikal Bar déi mir benotze fir d'OR-Operatioun ze representéieren ass och en Unix Pipe Connector. Elo wann Dir de Skript leeft, gesitt Dir datt de Logsystem suergt datt all Message an engem bestëmmte Log de Präfix vum Komponentnumm ass.

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

Elo kënnt Dir gesinn datt all Messagen, déi aus der UDP Echo Client Applikatioun kommen, als solch identifizéiert ginn. Message "Received 1024 bytes from 10.1.1.2"ass elo kloer identifizéiert wéi aus der Echo Client Applikatioun kënnt. De Rescht Message muss vun der UDP Echo Server Applikatioun kommen. Mir kënnen dës Komponent aktivéieren andeems Dir eng Kolon-getrennt Lëscht vu Komponenten an der NS_LOG Ëmfeldvariabel aginn.

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

Opgepasst: Am Beispilltext uewendriwwer musst Dir den neie Zeilzeechen nom Colon (:) ewechhuelen, et gëtt benotzt fir d'Dokument ze formatéieren. Elo wann Dir de Skript leeft, gesitt Dir all Logmeldungen aus dem Client a Server Echo Uwendungen. Dir kënnt gesinn datt dëst ganz nëtzlech ka sinn beim Debugging.

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

Et ass och heiansdo nëtzlech fir d'Simulatiounszäit ze gesinn op där de Log Message generéiert gouf. Dir kënnt dat maachen andeems Dir den ODER Bit bäidréit Präfix_Zäit:

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

Erëm, Dir musst den uewe genannte Newline Charakter ewechhuelen. Wann Dir elo de Skript leeft, sollt Dir déi folgend Ausgang gesinn:

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

Maacht weg datt de Konstruktor fir UdpEchoServer gouf während Simulatioun 0 Sekonnen genannt. Dëst geschitt tatsächlech ier d'Simulatioun ufänkt, awer d'Zäit gëtt als null Sekonnen ugewisen. Datselwecht ass wouer fir de Konstruktor Message 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()

Erënneren, datt d'Schrëft scratch/first.cc huet d'Echo Server Applikatioun eng Sekonn virum Start vun der Simulatioun ugefaangen. Elo kënnt Dir gesinn, datt d'Method Start Applikatioun de Server gëtt eigentlech an der éischter Sekonn genannt. Dir kënnt och bemierken datt den Echo Client an der zweeter Sekonn vun der Simulatioun ufänkt, wéi mir am Skript gefrot hunn.

Dir kënnt elo de Fortschrëtt vun der Simulatioun op Uruff verfollegen ScheduleTransmit am Client deen den HandleRead Callback rifft Schécken an der Echo Server Applikatioun. Notéiert datt d'vergaangen Zäit fir e Paket iwwer e Punkt-zu-Punkt Link ze schécken 3,69 Millisekonnen ass. Dir kënnt gesinn datt den Echo-Server e Message protokolléiert datt hien op de Paket geäntwert huet, an dann, no enger Kanalverzögerung, gesitt Dir datt den Echo-Client den Echo-Paket a senger HandleRead-Methode kritt.

An dëser Simulatioun geschitt vill ouni datt Dir bemierkt. Awer Dir kënnt de ganze Prozess ganz einfach verfollegen andeems Dir all Logkomponenten am System aktivéiert. Probéiert d'NS_LOG Variabel op de folgende Wäert ze setzen,

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

D'Asterisk hei uewen ass e Wildcard Charakter fir de Logbicher Komponent. Dëst enthält all Entréen an all Komponente benotzt an der Simulatioun. Ech wäert d'Ausgab hei net reproduzéieren (zu der Zäit vum Schreiwen produzéiert et 1265 Zeilen vun der Ausgab fir en eenzegen Echo-Paket), awer Dir kënnt dës Informatioun op eng Datei viruleeden an se an Ärem Liiblingseditor kucken.

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

Ech perséinlech benotzen dës extrem verbose Versioun vum Logbuch wann ech e Problem hunn a keng Ahnung hunn wou d'Saachen falsch gaange sinn. Ech kann d'Code Ausféierung ganz einfach verfollegen ouni Breakpunkten ze setzen an duerch de Code am Debugger ze goen. Ech ka just d'Ausgab a mengem Liiblingseditor änneren a kucken wat ech erwaarden a gesinn eppes geschitt wat ech net erwaart hunn. Wann ech eng allgemeng Iddi hunn wat falsch leeft, sprangen ech an den Debugger fir an de Problem ze dréinen. Dës Zort vun Output kann besonnesch nëtzlech sinn wann Äre Skript eppes komplett onerwaart mécht. Wann Dir nëmmen den Debugger benotzt, kënnt Dir en Twist ganz verpassen. Aschreiwung mécht esou Wendungen opfälleg.

5.1.3 Aloggen op Äre Code dobäizemaachen

Dir kënnt nei Entréen op Är Simulatioune bäidroen andeems Dir Uriff un de Logkomponent vu multiple Makroen mécht. Loosst eis et an engem Skript maachen meng éischt.cc, déi mir am "propper" Verzeechnes hunn. Erënnert drun datt mir e Logbicherkomponent an dësem Szenario definéiert hunn:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Dir sidd bewosst datt Dir d'Protokolléiere vun all Messagen aus dëser Komponent aktivéiere kënnt andeems Dir d'NS_LOG Ëmfeldvariabel op verschidden Niveauen setzt. Loosst eis virugoen an e puer Entréen an d'Skript fügen. De Makro deen benotzt gëtt fir Informatiounsniveau Messagen an de Log ze addéieren ass NS_LOG_INFO. Loosst eis e Message derbäi (just ier mer ufänken Noden ze kreéieren) déi Iech seet datt de Skript an der Phase "Creating Topology" ass. Dëst gëtt am folgende Code Snippet gemaach,
Opmaachen scratch/myfirst.cc an Ärem Liiblingseditor a füügt d'Linn derbäi,
NS_LOG_INFO ("Creating Topology");
direkt virun de Linnen,

NodeContainer nodes;
nodes.Create (2);

Elo kompiléiert de Skript mat vuf, a läscht d'NS_LOG Variabel fir de Logbicherstroum auszeschalten, dee mir virdru aktivéiert hunn:

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

Dir gesitt den neie Message net well den assoziéierten Logkomponent (FirstScriptExample) net ageschalt gouf. Fir Äre Message ze gesinn, musst Dir de Logbicherkomponent aktivéieren FirstScriptBeispill mat engem Niveau net manner wéi NS_LOG_INFO. Wann Dir just dëse spezifesche Logniveau wëllt gesinn, kënnt Dir et esou aktivéieren,

$ export NS_LOG=FirstScriptExample=info

Wann Dir de Skript elo leeft, gesitt Dir en neie Message "Topologie erstellen",

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 Benotzen Kommando Linn Argumenter

5.2.1 Iwwerdribblen Standard Attribut Wäerter

Eng aner Manéier fir d'Behuele vun ns-3 Scripten z'änneren ouni ze änneren oder ze bauen ass Kommandozeilargumenter ze benotzen. Mir bidden e Mechanismus fir Kommandozeilargumenter ze analyséieren an automatesch lokal a global Variablen op Basis vun de Resultater ze setzen.

Den éischte Schrëtt fir de Kommandozeil Argumentsystem ze benotzen ass e Kommandozeil Parser ze deklaréieren. Dëst ass ganz einfach ze maachen (an Ärem Haaptprogramm), wéi am folgende Code,

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

Dësen einfachen zwee-Linn Snippet ass tatsächlech ganz nëtzlech a sech selwer. Et mécht d'Dier op fir den ns-3 globale Variabel an Attribut System. Loosst eis zwou Zeilen vum Code un den Ufank vun der Haaptskriptfunktioun addéieren scratch/myfirst.cc. Fuert weider, mir kompiléieren de Skript a lafen et, wa mir lafen, maache mir eng Hëllefsufro wéi follegt,

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

Dëse Kommando wäert froen Waf lafen Skript Schrummen / meng éischt a gitt et e Kommandozeil Argument - Drécken Hëllef. D'Zitatzeechen sinn erfuerderlech fir unzeweisen fir wéi ee Programm d'Argument ass geduecht. De Kommandozeil Parser wäert d'Argument erkennen - Drécken Hëllef a wäert d'Äntwert weisen,

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.

Loosst eis elo d'Optioun kucken -PrintAttributer. Mir hu schonn den ns-3 Attribut System ernimmt wann Dir de first.cc Skript studéiert. Mir hunn déi folgend Zeilen vum Code gesinn,

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

an si soten dat DataRate ass tatsächlech en Attribut PointToPointNetDevice. Loosst eis de Kommandozeil Argument Parser benotzen fir d'Attributer ze gesinn PointToPointNetDevice. D'Hëlleflëscht seet wat mir mussen ubidden TypeId. Dëst ass den Numm vun der Klass zu där d'Attributer vun Interesse gehéieren. An eisem Fall wäert et sinn ns3 :: PointToPointNetDevice. Loosst eis weider viru goen, gitt,

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

De System dréckt all Attributer vun dësem Netzwierkapparattyp. Dir wäert gesinn datt ënnert den Attributer an der Lëscht sinn,

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

Dëst ass de Standardwäert dee vum System benotzt gëtt wann Dir den Objet erstellt PointToPointNetDevice. Mir wäerten dëse Standardwäert iwwerschreiden mam Parameter Spezialfäegkeeten в PointToPointHelper méi héich. Loosst eis d'Standardwäerter fir Punkt-zu-Punkt Apparater a Kanäl benotzen. Fir dëst ze maachen, wäerte mir Appellen läschen SetDeviceAttribute и SetChannelAttribute aus meng éischt.cc, déi mir an engem proppere Verzeechnes hunn.

Äre Skript soll elo einfach deklaréieren PointToPointHelper a maacht keng Installatiounsoperatioune wéi am Beispill hei ënnen gewisen,

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

Gitt vir an erstellt en neit Skript mat Waf (./waff) a loosst eis zréckgoen an e puer Entréen vun der UDP Echo Server Applikatioun enthalen an den Zäitpräfix enthalen.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

Wann Dir de Skript leeft, sollt Dir déi folgend Ausgang gesinn:

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

Erënnert drun datt déi leschte Kéier wou mir d'Simulatiounszäit gekuckt hunn, de Moment wou de Paket vum Echo-Server opgeholl gouf, war et 2,00369 Sekonnen.

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

Elo kritt hien de Pak an 2.25732 Sekonnen. Dëst ass well mir einfach de PointToPointNetDevice Datenrate vu fënnef Megabits pro Sekonn op de Standardwäert zrécksetzen, deen 32768 Bits pro Sekonn ass. Wa mir en neien DataRate mat der Kommandozeil ersetzen, kënne mir eis Simulatioun erëm beschleunegen. Mir maachen dat wéi follegt, no der Formel implizéiert vum Hëllefselement:

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

Dëst wäert den DataRate Attribut op säi Standardwäert vu fënnef Megabits pro Sekonn zréckginn. Sidd Dir iwwerrascht vum Resultat? Et stellt sech eraus datt fir dat ursprénglecht Verhalen vum Skript zréckzekommen, musse mir och de Kanalverzögerung setzen fir d'Liichtgeschwindegkeet ze passen. Mir kënnen de Kommandozeilsystem froen fir d'Kanalattributer ze drécken, sou wéi mir fir den Netzwierkapparat gemaach hunn:

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

Mir wäerten feststellen datt de Kanalverzögerungsattribut wéi follegt gesat ass:

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

Mir kënnen dann, duerch de Kommandozeilsystem, béid vun dëse Standardwäerter setzen.

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

an dësem Fall restauréiere mir d'Zäit déi mir haten wa mir explizit den DataRate an Delay am Skript setzen:

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

Bedenkt datt de Paket erëm vum Server no 2,00369 Sekonnen kritt gëtt. Mir kënnen tatsächlech iergendeng vun den Attributer, déi am Skript benotzt ginn, op dës Manéier setzen. Besonnesch kënne mir d'MaxPackets Attributer op net-eent Wäerter setzen UdpEchoClient.

Wéi géift Dir et benotzen? Probéiert et. Denkt drun datt Dir d'Plaz muss kommentéieren wou mir de Standard Attributwäert iwwerschreiden an explizit setzen MaxPackets am Skript. Da musst Dir de Skript nei opbauen. Dir kënnt och d'Kommandozeil benotze fir Syntaxhëllef ze kréien fir en neie Standardattributwäert ze setzen. Wann Dir dëst versteet, kënnt Dir d'Zuel vun de Packagen kontrolléieren déi op der Kommandozeil ugewise ginn. Well mir studéiert Leit sinn, soll eis Kommandozeil sou eppes ausgesinn:

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

Déi natierlech Fro, déi op dësem Punkt stellt, ass wéi Dir iwwer d'Existenz vun all dësen Attributer wësst. Erëm, de Kommando Linn System huet eng Hëllef Funktioun fir dës Matière. Wa mir d'Kommandozeil fir Hëllef froen, sollte mir gesinn:

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

Wann Dir d'Argument "PrintGroups" auswielt, sollt Dir eng Lëscht vun alle registréierte Gruppen gesinn TypeId. D'Gruppnimm sinn konsequent mat den Nimm vun de Moduler am Quellverzeechnes (wann och mat Kapital). All Informatioun op eemol ze drécken wier ze voluminös, sou datt en zousätzleche Filter verfügbar ass fir Informatioun no Grupp ze drécken. Also, erëm fokusséiert op de Punkt-zu-Punkt Modul:

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

Hei fannt Dir verfügbar TypeId Nimm fir Attribut Lookups, zum Beispill an
--PrintAttributes = ns3 :: PointToPointChannelwéi uewen gewisen.

En anere Wee fir iwwer Attributer ze léieren ass duerch Doxygen ns-3. Et gëtt eng Säit déi all Attributer oplëscht, déi am Simulator registréiert sinn.

5.2.2 Är eege Kommandoen erfaassen

Dir kënnt och Är eege Haken iwwer de Kommandozeilsystem addéieren. Dëst gëtt ganz einfach mat der Kommandozeil Parser Method gemaach AddValue.
Loosst eis dës Feature benotze fir d'Zuel vun de Packagen ze spezifizéieren déi op eng ganz aner Manéier ugewise ginn. Loosst eis eng lokal Variabel addéieren genannt nPackets an eng Funktioun Haaptstrooss. Mir setzen et op een fir eise fréiere Standardverhalen ze passen. Fir de Kommandozeil Parser z'erméiglechen dëse Wäert z'änneren, musse mir dëse Wäert am Parser erfaassen. Mir maachen dat andeems Dir en Uruff bäidréit AddValue. Gitt an ännert de Skript scratch/myfirst.cc also fir mam folgende Code unzefänken,

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

Scroll erof op de Punkt am Skript wou mir de MaxPackets Attribut setzen an et änneren sou datt et op d'nPackets Variabel gesat gëtt anstatt de konstante 1, wéi hei ënnendrënner.

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

Elo wann Dir de Skript leeft an d'Argument -PrintHelp liwwert, sollt Dir dat neit Benotzerargument gesinn. op der Hëllefsdisplay opgelëscht. Gitt an,

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

Wann Dir d'Zuel vun de verschéckte Pakete wëllt änneren, kënnt Dir dat maachen andeems Dir de Kommandozeil Argument - -nPackets setzt.

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

Elo sollt Dir elo gesinn

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

Dir hutt elo zwee Packagen geschéckt. Zimmlech einfach, ass et net?
Dir kënnt gesinn datt Dir als ns-3 Benotzer de Kommandozeil Argumentsystem benotze kënnt fir global Wäerter an Attributer ze manipuléieren. Wann Dir de Modell Autor sidd, kënnt Dir nei Attributer fir Är Objekter addéieren a si ginn automatesch fir Konfiguratioun vun Äre Benotzer iwwer de Kommandozeilsystem verfügbar. Wann Dir e Skriptautor sidd, kënnt Dir nei Variablen op Är Skripte addéieren an se nahtlos an Äre Kommandozeilsystem pluggen.

5.3 Benotzt de Tracing System

De ganze Punkt vun der Modelléierung ass d'Ausgab fir weider Studie ze generéieren, an den ns-3 Spuersystem ass den Haaptmechanismus fir dëst. Zënter ns-3 e C++ Programm ass, kënne Standardmëttele fir Ausgang aus engem C++ Programm ze generéieren benotzt ginn:

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

Dir kënnt souguer e Logmodul benotze fir e bësse Struktur op Är Léisung ze addéieren. Et gi vill bekannte Probleemer verursaacht duerch dës Approche, an dofir hu mir en allgemenge Event Tracing-Subsystem zur Verfügung gestallt fir dës Probleemer ze léisen.

D'Haaptziler vum ns-3 Tracing System sinn:

  • Fir Basis Aufgaben, soll de Tracing System erlaben de Benotzer eng Norm Spure fir populär Quellen ze generéieren an Objete wielt déi d'Spuer generéieren;

  • Zwëschen Benotzer solle fäeg sinn den Tracing-System ze verlängeren fir de generéierten Ausgangsformat z'änneren oder nei Spuerquellen anzeginn, ouni de Simulatorkär z'änneren;

  • Fortgeschratt Benotzer kënnen den Simulatorkär änneren fir nei Spuerquellen a Spull ze addéieren. Den ns-3 Tracing System ass op d'Prinzipien vun onofhängege Tracking Quellen an Empfänger gebaut, wéi och e vereenegt Mechanismus fir Quelle mat Konsumenten ze verbannen.

Den ns-3 Tracing System ass op d'Prinzipien vun onofhängegen Tracing Quellen an Empfänger gebaut, souwéi e vereenegt Mechanismus fir Quellen mat Empfänger ze verbannen. Spuerquellen sinn Objeten déi Eventer signaliséieren déi an der Simulatioun optrieden an Zougang zu den ënnerierdesche Daten vun Interesse ubidden. Zum Beispill kann eng Spuerquell uginn wann en Netzwierkapparat e Paket kritt an den Inhalt vum Paket fir interesséiert Spuerempfänger verfügbar ass.

Spuerquellen eleng sinn nëtzlos ausser si sinn "gekoppelt" mat aneren Deeler vum Code, déi tatsächlech eppes nëtzlech maachen mat der Informatioun, déi vum Spull gëtt. Tracers si Konsumenten vun Eventer an Daten, déi duerch Spuerquellen geliwwert ginn. Zum Beispill, kënnt Dir e Spuer ënnerzegoen schafen, datt (wann verbonne mat der Spuer Quell vun der viregter Beispill) d'Deeler vun Interessi am kritt Pak Drécken.

D'Begrënnung fir dës explizit Trennung ass d'Benotzer z'erméiglechen nei Sinktypen mat existente Spuerquellen ze verbannen ouni de Simulatorkär z'änneren an ze kompiléieren. Also am Beispill hei uewen kann de Benotzer en neien Tracer an hirem Skript definéieren an et mat enger existéierender Spuerquell verbannen, déi am Simulatiounskär definéiert ass, nëmmen andeems de Benotzerskript geännert gëtt.

An dësem Tutorial wäerte mir e puer vun de virdefinéierte Quellen a Sinks duerchgoen a weisen wéi se mat der mannst Ustrengung vum Benotzer konfiguréiert kënne ginn. Kuckt d'ns-3 Handbuch oder wéi-ze Sektiounen fir Informatiounen iwwer fortgeschratt Spuerkonfiguratioun, dorënner d'Erweiderung vum Spuernummraum an d'Schafe vun neie Spuerquellen.

5.3.1 ASCII Tracing

ns-3 bitt Helper Funktionalitéit déi e Low-Level Tracing System bitt fir Iech mat den Detailer ze hëllefen wann Dir einfache Paketspuren opstellt. Wann Dir dës Fonktioun aktivéiert, gesitt Dir d'Ausgab an ASCII Dateien. Fir déi, déi mat ns-2 Ausgang vertraut sinn, ass dës Zort Spuer ähnlech wéi aus.tr, déi vu ville Skripte generéiert gëtt.

Loosst eis op d'Geschäft goen an e puer ASCII Tracing Resultater op eise Scratch/myfirst.cc Skript derbäi. Direkt virum Opruff Simulator :: Run (), füügt déi folgend Zeilen vum Code derbäi:
AsciiTraceHelper ascii;

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

Wéi vill aner ns-3 Idiomen, benotzt dëse Code en Hëllefsobjekt fir ASCII Spuren ze kreéieren. Déi zweet Linn enthält zwee nested Method Uriff. "Bannen" Method CreateFileStream() benotzt den anonyme Objet Idiom fir e Fichier Stream Objet op de Stack ze schafen (ouni en Objet Numm) a weidergespillt et un der genannt Method. Mir ginn an Zukunft méi déif an dëst, awer alles wat Dir op dësem Punkt wësse musst ass datt Dir en Objet erstellt deen e Fichier representéiert genannt meng éischt.tr an Transfert et op ns-3. Mir uvertraut ns-3 fir de geschafenen Objet fir seng ganz Liewensdauer ze këmmeren, während där et Problemer léist, déi duerch e wéineg bekannte (virsiichteg) Limitatioun verbonne sinn mat C ++ Stream Objektkopiekonstruktoren.

Extern Uruff EnableAsciiAll() seet dem Assistent datt Dir ASCII Tracing an Ärer Simulatioun fir all Punkt-zu-Punkt Apparatverbindunge wëllt enthalen an datt Dir wëllt (spezifizéiert) Spuerempfänger fir Paketbewegungsinformatioun am ASCII Format opzehuelen.

Fir déi, déi mat ns-2 vertraut sinn, sinn verfollegt Eventer gläichwäerteg mat de bekannten Tracepoints déi Eventer "+", "-", "d" an "r" protokolléieren.
Elo kënnt Dir de Skript bauen an aus der Kommandozeil lafen:

$ ./waf --run scratch/myfirst

Wéi vill Mol virdrun, gesitt Dir e puer Messagen vu Waf, an dann "bauen" erfollegräich fäerdeg" mat e puer Messagen aus dem lafende Programm.

Wann Dir leeft, erstellt de Programm eng Datei mam Numm meng éischt.tr. Wéinst der Natur vun der Aarbecht Waf, Par défaut gëtt d'Datei net am lokalen Verzeechnes erstallt, mee am Top-Level Verzeechnes vum Repository. Wann Dir de Wee wëllt änneren, wou Spure gespäichert sinn, da kënnt Dir de Waf-Parameter benotzen fir et ze spezifizéieren --cwd. Mir hunn dat net gemaach, also fir d'ASCII Spuerdatei myfirst.tr an Ärem Liiblingseditor ze kucken, musse mir an den Top-Level Verzeechnes vun eisem Repository navigéieren.

Parsing ASCII Spuren

Et gëtt vill Informatioun do an enger zimlech dichter Form, awer dat éischt wat Dir musst bemierken ass datt de Fichier aus eenzelne Linnen besteet. Dëst gëtt kloer siichtbar wann Dir d'Sichtfenster méi breet ausbaut.

All Linn am Fichier entsprécht engem Spuer Event. An dësem Fall verfollege mir Eventer an der Iwwerdroungsschlaang präsent an all Punkt-zu-Punkt Netzwierkapparat an der Simulatioun. D'Transmissiounsschlaang ass d'Schlaang duerch déi all Paket fir e Punkt-zu-Punkt Link muss passéieren. Bedenkt datt all Zeil an der Spuerdatei mat engem eenzege Charakter fänkt (an huet e Raum duerno). Dëst Symbol wäert déi folgend Bedeitung hunn:

+: eng Schlaangoperatioun ass op der Apparatschlaang geschitt;
-: eng Element Retrieval Operatioun geschitt an der Apparat Schlaang;
d: de Pak gouf erofgelooss, normalerweis well d'Schlaang voll war;
r: De Paket gouf vun engem Netzwierkapparat kritt.

Loosst eis déi éischt Zeil an der Spuerdatei méi no kucken. Ech zerbriechen et an Deeler (mat Indentatiounen fir Kloerheet) an d'Linnnummer op der lénker Säit:

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)

Déi éischt Sektioun vun dësem erweiderten Trace Event (Linn 0) ass d'Operatioun. Mir hunn e + Symbol hei, dat entsprécht der Operatioun vun der Schlaang fir d'Transmissioun. Déi zweet Sektioun (Linn 1) ass d'Simulatiounszäit, ausgedréckt a Sekonnen. Dir kënnt Iech erënneren wat mir gefrot hunn UdpEchoClientApplication Start Paketen an zwou Sekonnen ze schécken. Hei gesi mir d'Bestätegung datt dëst wierklech geschitt.

Déi nächst Sektioun vum Spuerbeispill (vun der Linn 2) weist wéi eng Spuerquell dëst Event generéiert huet (bedeit d'Nummraumspur). Dir kënnt un de Spuernummraum denken wéi Dir e Dateiesystem Nummraum géift. D'Wurzel vum Nummraum ass NodeList. Dëst entsprécht dem Container deen am Haapt ns-3 Code geréiert gëtt. Et enthält all Noden déi am Skript erstallt sinn. Just wéi e Dateiesystem kann Verzeechnes op senger Root hunn, NodeList mir kënne vill Wirbelen hunn. Also d'Linn /NodeList/0 bezitt sech op den Null Node an der NodeList, déi mir normalerweis als "Node 0" denken. All Node huet eng Lëscht vun Apparater déi installéiert goufen. Dës Lëscht ass nächst am Nummraum. Dir kënnt gesinn, datt dëst Spuer Event kënnt aus DeviceList/0, dat ass den null Apparat am Node installéiert.

Nächst Substring, $ ns3 :: PointToPointNetDevice, erzielt wéi en Apparat op der Nullpositioun ass: d'Apparatlëscht vum Node Null. Erënneren datt d'+ Operatioun, déi an der Linn 0 fonnt gouf, bedeit datt en Element an d'Transmissiounsschlaang vum Apparat bäigefüügt gouf. Dëst spigelt sech an de leschte Segmenter vum "Streckwee": TxQueue/Enqueue.

Déi reschtlech Sektiounen an der Spuer sollten zimlech intuitiv sinn. Linnen 3-4 weisen datt de Paket an engem Punkt-zu-Punkt-Protokoll akapselt ass. Linnen 5-7 weisen datt de Paket en IP4 Versioun Header huet an aus der IP Adress staamt 10.1.1.1 an ass geduecht fir 10.1.1.2. Linnen 8-9 weisen datt dëse Paket en UDP Header huet a schliisslech weist d'Linn 10 datt d'Notzlaascht déi erwaart 1024 Bytes ass.

Déi nächst Zeil an der Spuerdatei weist datt dee selwechte Paket aus der Iwwerdroungsschlaang op deemselwechten Node gezunn ass.

Déi drëtt Zeil an der Spuerdatei weist datt de Paket vun engem Netzwierkapparat um Echo-Serverhost kritt gouf. Ech hunn d'Evenement hei ënnen reproduzéiert.

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)

Bedenkt datt d'Spueroperatioun elo r ass an d'Simulatiounszäit gouf op 2,25732 Sekonnen erhéicht. Wann Dir den Tutorial suergfälteg gefollegt hutt, heescht dat datt Dir den DataRate a Link Delay vun den Netzwierkgeräter op hir Standardwäerter verlooss hutt. Dës Spannung sollt vertraut sinn, wéi Dir an der viregter Sektioun gesinn hutt.

D'Spuerquell Nummraumentrée (Linn 2) gouf geännert fir ze reflektéieren datt dëst Event aus dem Node 1 (/NodeList/1) an de Paket gëtt vun der Spuerquell kritt (/MacRx). Et sollt zimmlech einfach sinn fir Iech d'Bewegung vum Paket duerch d'Topologie ze verfollegen andeems Dir déi verbleiwen Spuren an der Datei kuckt.

5.3.2 PCAP Trace

D'ns-3 Device Helpers kënnen och benotzt ginn fir Spuerdateien am .pcap Format ze kreéieren. Acronym pcap (normalerweis a klenge Buschtawen geschriwwen) steet fir Packet Capture an ass tatsächlech eng API déi d'Definitioun vum .pcap Dateiformat enthält. De populäersten Programm deen dëst Format liesen a weist ass Wireshark (virdrun genannt Ethereal). Wéi och ëmmer, et gi vill Traffic Trace Analysatoren déi dëse Paketformat benotzen. Mir encouragéieren d'Benotzer déi vill verfügbar Tools ze benotzen fir pcap Spuren ze analyséieren. An dësem Tutorial konzentréiere mir eis op d'Pcap Spuren ze kucken tcpdump.

Pcap Tracing aktivéieren gëtt mat enger Zeil Code gemaach.

pointToPoint.EnablePcapAll ("myfirst");

Paste dës Zeil vum Code nom ASCII Trace Code dee mir just bäigefüügt hunn scratch/myfirst.cc. Notéiert datt mir nëmmen d'String "myfirst" passéiert hunn, net "myfirst.pcap" oder eppes ähnleches. Dëst ass well de Parameter e Präfix ass, net e komplette Dateinumm. Wärend der Simulatioun erstellt den Assistent tatsächlech eng Spuerdatei fir all Punkt-zu-Punkt Apparat. Dateinumm ginn konstruéiert mam Präfix, Nodenummer, Apparatnummer a Suffix ".pcap".

Fir eist Beispill Skript, wäerte mir endlech Dateien gesinn mam Numm "myfirst-0-0.pcap"An"myfirst-1-0.pcap", déi sinn pcap Spure fir Node 0-Apparat 0 respektiv Node 1-Apparat 0. Wann Dir d'Linn vum Code bäigefüügt hutt fir pcap Tracing z'aktivéieren, kënnt Dir de Skript op déi üblech Manéier lafen:

$ ./waf --run scratch/myfirst

Wann Dir am Top-Level Verzeechnes vun Ärer Verdeelung kuckt, sollt Dir dräi Dateien gesinn: eng ASCII Spuerdatei meng éischt.tr, déi mir virdru studéiert hunn, Dateien myfirst-0-0.pcap и myfirst-1-0.pcap - nei pcap Dateien déi mir just generéiert hunn.

Liesen Ausgang mat tcpdump

Fir de Moment ass deen einfachste Wee fir pcap Dateien ze gesinn ass tcpdump ze benotzen.

$ 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

Am Dëppen myfirst-0-0.pcap (Client Apparat) Dir kënnt gesinn datt den Echo Paket no 2 Sekonnen Simulatioun geschéckt gëtt. Wann Dir op den zweeten Dump kuckt (myfirst-1-0.pcap), gesitt Dir datt de Paket op 2,257324 Sekonnen kritt gëtt. Dir gesitt am zweeten Dump datt de Paket op 2.257324 Sekonnen zréckgeet, a schliisslech datt de Paket vum Client am éischten Dump op 2.514648 Sekonnen zréckgeholl gouf.

Liesausgang mat Wireshark

Wann Dir net kennt mat Wireshark, et gëtt eng Websäit vun där Dir Programmer an Dokumentatioun eroflueden kënnt: http://www.wireshark.org/. Wireshark ass eng GUI déi benotzt ka ginn fir dës Spuerdateien ze weisen. Wann Dir Wireshark hutt, kënnt Dir eng vun de Spuerdateien opmaachen an d'Inhalter weisen wéi wann Dir d'Päckchen mat engem Packet Sniffer ageholl hätt.

Source: will.com

Setzt e Commentaire