
5 Konfiguration
5.1 AnvÀndning av loggmodulen
5.1.1 Ăversikt av loggning
5.1.2 TillÄtelse av loggning
5.1.3 LĂ€gga till loggning i din kod
5.2 AnvÀndning av kommandoradsargument
5.2.1 Ăverskrivning av standardattributvĂ€rden
5.2.2 FÄnga dina egna kommandon
5.3 AnvÀndning av spÄrningssystemet
5.3.1 ASCII SpÄrning
Parsing av ASCII spÄrning
5.3.2 PCAP SpÄrning
Kapitel 5
InstÀllning
5.1 AnvÀndning av loggmodulen
Vi har redan kort gÄtt igenom loggmodulen ns-3 nÀr vi granskade skriptet first.cc. I detta kapitel ska vi titta nÀrmare pÄ anvÀndningsalternativen för loggningsunder-systemet.
5.1.1 Ăversikt av loggning
MÄnga stora system har nÄgon form av meddelandeloggning, och ns-3 Àr inget undantag. I vissa fall skrivs endast felmeddelanden till "operatörens konsol" (som vanligen Àr stderr i Unix-baserade system). I andra system kan varningsmeddelanden och mer detaljerad information ocksÄ visas. I vissa fall anvÀnds loggverktyg för att skriva ut felsökningsmeddelanden som kan snabbt "sudda" ut utskriften.
TillvÀgagÄngssÀttet som anvÀnds i ns-3 förutsÀtter att alla dessa informationsnivÄer Àr anvÀndbara, och vi erbjuder ett selektivt, flernivÄansats till meddelandeloggning. Loggning kan vara helt avstÀngd, slÄs pÄ för enskilda komponenter eller pÄ global nivÄ. Detta Ästadkoms med anpassningsbara informationsnivÄer. Loggmodulen ns-3 tillhandahÄller ett relativt enkelt sÀtt att fÄ ut anvÀndbar information frÄn din simulation.
Du bör förstĂ„ att vi tillhandahĂ„ller en generell mekanism â spĂ„rning â för att extrahera data frĂ„n dina modeller, som bör vara föredragen för utdata vid modellering (för mer detaljerad information om vĂ„rt spĂ„rningssystem se avsnitt 5.3 i handledningen). Loggning bör vara den föredragna metoden för att erhĂ„lla felsökningsinformation, varningar, felmeddelanden eller för att snabbt utdata meddelanden frĂ„n dina skript eller modeller nĂ€r som helst.
För nÀrvarande har systemet definierat sju nivÄer (typer) av loggmeddelanden i stigande ordning av informationsinnehÄll.
- LOG_ERROR â registrera felmeddelanden (relaterad makro: NS_LOG_ERROR);
- LOG_WARN â registrering av varningsmeddelanden (relaterad makro: NS_LOG_WARN);
- LOG_DEBUG â registrering av relativt sĂ€llsynta speciella debugmeddelanden (relaterad makro: NS_LOG_DEBUG);
- LOG_INFO â registrering av informationsmeddelanden om programmets körning (relaterad makro: NS_LOG_INFO);
- LOG_FUNCTION â registrering av meddelanden som beskriver varje anropad funktion (tvĂ„ relaterade makron: NS_LOG_FUNCTION, som anvĂ€nds för medlemsfunktioner, och NS_LOG_FUNCTION_NOARGS, som anvĂ€nds för statiska funktioner);
- LOG_LOGIC â registrering av meddelanden som beskriver logikflödet inom en funktion (relaterad makro: NS_LOG_LOGIC);
- LOG_ALL â registrering av allt ovanstĂ„ende (ingen relaterad makro).
För varje typ (LOG_TYPE) finns Àven en typ LOG_LEVEL_TYPE, som, om den anvÀnds, tillÄter registrering av alla nivÄer ovanför dess egen. (Som ett resultat Àr LOG_ERROR och LOG_LEVEL_ERROR samt LOG_ALL och LOG_LEVEL_ALL funktionellt ekvivalenta.) Till exempel, om LOG_INFO Àr aktiverat kommer endast meddelanden som tillhandahÄlls av makrot NS_LOG_INFO att tillÄtas, och om LOG_LEVEL_INFO Àr aktiverat inkluderas Àven meddelanden som tillhandahÄlls av makrona NS_LOG_DEBUG, NS_LOG_WARN och NS_LOG_ERROR.
Vi tillhandahÄller ocksÄ ett makro för oavbruten registrering, som alltid visas oavsett loggnivÄ eller komponentval.
- NS_LOG_UNCOND â oavbruten registrering av relaterat meddelande (utan relaterad loggnivĂ„).
Varje nivÄ kan begÀras separat eller kumulativt. Loggning kan konfigureras med hjÀlp av miljövariabeln NS_LOG eller genom att registrera ett anrop till systemfunktionen. Som tidigare visat har loggsystemet Doxygen-dokumentation, och det Àr nu dags att titta pÄ den om du inte har gjort det Àn.
Nu nÀr du har lÀst dokumentationen mycket noggrant, lÄt oss anvÀnda denna kunskap för att dra ut lite intressant information frÄn exempelmanus scratch/myfirst.cc, som du redan har kompilerat.
5.1.2 TillÄtelse av loggning
LÄt oss anvÀnda miljövariabeln NS_LOG för att köra nÄgra fler loggar, men först, bara för att orientera dig, kör den senaste skriptet som du gjorde tidigare,
$ ./waf --run scratch/myfirstDu bör se den redan bekanta utdata frÄn det första exempelprogrammet ns-3.
$ Waf: GÄr in i katalogen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build`
Waf: LĂ€mnar katalogen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build` 'build'
avslutat framgÄngsrikt (0.413s)
Skickade 1024 byte till 10.1.1.2
Mottog 1024 byte frÄn 10.1.1.1
Mottog 1024 byte frÄn 10.1.1.2Det visar sig att "skickade" och "mottagna" meddelanden, som ni ser ovan, faktiskt Àr registrerade meddelanden frÄn UdpEchoClientApplication och UdpEchoServerApplication. Till exempel kan vi be klientapplikationen att skriva ut mer information genom att stÀlla in loggnivÄn via miljövariabeln NS_LOG.
FrÄn och med nu kommer jag att anta att du anvÀnder en sh-liknande skal som anvÀnder syntaksen "VARIABLE = value". Om du anvÀnder en csh-liknande skal, dÄ mÄste du konvertera mina exempel till syntaksen "setenv variabel vÀrde" som krÀvs av dessa skal.
För nÀrvarande reagerar UDP eko-klientapplikationen pÄ följande kodrad i scratch/myfirst.cc,
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);Det aktiverar loggnivÄn LOG_LEVEL_INFO. NÀr vi skickar loggnivÄflaggor, aktiverar vi faktiskt denna nivÄ och alla lÀgre nivÄer. I detta fall har vi aktiverat NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN och NS_LOG_ERROR. Vi kan höja loggnivÄn och fÄ mer information, utan att Àndra skriptet eller recompilera, genom att stÀlla in miljövariabeln NS_LOG pÄ följande sÀtt:
$ export NS_LOG=UdpEchoClientApplication=level_allPÄ sÄ sÀtt stÀller vi in följande vÀrde pÄ NS_LOG miljövariabeln för sh-skalet,
UdpEchoClientApplication=level_allDen vÀnstra sidan av tilldelningen Àr namnet pÄ den loggade komponenten som vi vill konfigurera, och den högra sidan Àr flaggan som vi vill tillÀmpa för detta. I detta fall kommer vi att inkludera alla felsökningsnivÄer i applikationen. Om du kör skriptet med NS_LOG instÀllt pÄ detta sÀtt, kommer ns-3:s loggningssystem att acceptera Àndringarna och du bör se följande utdata:
Waf: GÄr in i katalogen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build`
Waf: LĂ€mnar katalogen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build`
'build' avslutat framgÄngsrikt (0.404s)
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
Skickade 1024 byte till 10.1.1.2
Mottog 1024 byte frÄn 10.1.1.1
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
Mottog 1024 byte frÄn 10.1.1.2
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()Den extra felsökningsinformationen som tillhandahÄlls av applikationen motsvarar nu nivÄn NS_LOG_FUNCTION. Den visar varje fall av funktionsanrop under skriptets körning. Som regel Àr det att föredra att anvÀnda (Ätminstone)NS_LOG_FUNCTION (this). AnvÀnd NS_LOG_FUNCTION_NOARGS ()
endast i statiska funktioner. Observera dock att det i ns-3-systemet inte finns nÄgra krav pÄ att stödja nÄgon loggning. Beslutet om hur mycket information som loggas ligger helt och hÄllet i modellutvecklarens hÀnder. För ekapplikationer finns det mycket utdata för loggning.
Nu kan du granska loggen över funktionsanrop som har gjorts av applikationen. Om du tittar noga kommer du att mÀrka ett kolon mellan raden UdpEchoClientApplication och metodens namn, pÄ det stÀlle dÀr du kanske förvÀntade dig att se C++-omrÄdesoperatören (: :). Detta har gjorts avsiktligt.
Det Àr faktiskt inte klassnamnet, utan loggkomponentens namn. NÀr det finns en överensstÀmmelse mellan kÀllfiler och klasser Àr det vanligtvis klassens namn, men du mÄste förstÄ att det faktiskt inte Àr klassens namn och att det finns ett kolon istÀllet för en dubbelkolon. Det hÀr Àr ett sÀtt att pÄ ett relativt subtilt sÀtt konceptuellt separera loggkomponentens namn frÄn klassens namn.
Det kan dock vara svÄrt att avgöra vilken metod som genererar loggmeddelandet. Om du ser pÄ texten ovan kan du frÄga dig var strÀngen "Received 1024 bytes from 10.1.1.2" kom ifrÄn. Du kan lösa detta problem genom att stÀlla in nivÄn prefix_func i miljövariabeln NS_LOG. Försök att göra följande,
$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'Notera att citattecken Àr nödvÀndiga, eftersom vertikala strecket som vi anvÀnder för att ange OCH-operationen ocksÄ Àr en Unix-rörledare. Nu, om du kör skriptet, kommer du att se att loggsystemet sÀkerstÀller att varje meddelande frÄn denna logg har ett prefix med loggkomponentens namn.
Waf: Entrér in katalogen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: LĂ€mnar katalogen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'bygget' avslutades framgÄngsrikt (0,417s)
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
UdpEchoClientApplication:Send(): Skickade 1024 byte till 10.1.1.2
Mottog 1024 byte frÄn 10.1.1.1
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
UdpEchoClientApplication:HandleRead(): Mottog 1024 byte frÄn 10.1.1.2
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()Nu kan du se att alla meddelanden som kommer frĂ„n UDP-eko-klientapplikationen identifieras som sĂ„dana. Meddelandet "Received 1024 bytes from 10.1.1.2â Ă€r nu tydligt definierat som kommande frĂ„n eko-klientapplikationen. Det kvarvarande meddelandet bör komma frĂ„n UDP-eko-serverapplikationen. Vi kan aktivera denna komponent genom att skriva en lista med komponenter, separerade med kolon, i miljövariabeln NS_LOG.
$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func:
UdpEchoServerApplication=level_all|prefix_func'Varning: I exemplet ovan mÄste du ta bort radbrytningen efter kolon (:), den anvÀnds för dokumentformattering. Nu, om du kör skriptet, kommer du att se alla loggmeddelanden frÄn klientens och serverns eko-applikationer. Du kanske ser att detta kan vara mycket anvÀndbart vid felsökning.
Waf: Entrér in katalogen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: LĂ€mnar katalogen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'bygget' avslutades framgÄngsrikt (0,406s)
UdpEchoServerApplication:UdpEchoServer()
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoServerApplication:StartApplication()
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
UdpEchoClientApplication:Send(): Skickade 1024 byte till 10.1.1.2
UdpEchoServerApplication:HandleRead(): Mottog 1024 byte frÄn 10.1.1.1
UdpEchoServerApplication:HandleRead(): Ă
tersÀnder paket
UdpEchoClientApplication:HandleRead(0x624920, 0x625160)
UdpEchoClientApplication:HandleRead(): Mottog 1024 byte frÄn 10.1.1.2
UdpEchoServerApplication:StopApplication()
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()Det Àr ocksÄ ibland nyttigt att kunna se simuleringstiden dÄ loggmeddelandet skapades. Du kan göra detta genom att lÀgga till antingen biten prefix_time:
$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func|prefix_time: UdpEchoServerApplication=level_all|prefix_func|prefix_time'à terigen mÄste du ta bort radbrytningen ovan. Om du nu kör skriptet ska du se följande utdata:
Waf: GÄr in i katalogen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build`
Waf: LĂ€mnar katalogen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build`
'build' avslutades framgÄngsrikt (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(): Skickade 1024 byte till 10.1.1.2
2.00369s UdpEchoServerApplication:HandleRead(): Mottagen 1024 byte frÄn 10.1.1.1
2.00369s UdpEchoServerApplication:HandleRead(): Ă
terkopplar paket
2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)
2.00737s UdpEchoClientApplication:HandleRead(): Mottagen 1024 byte frÄn 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
10s UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()Observera att konstruktorn för UdpEchoServer kallades under simuleringen vid 0 sekunder. Detta hÀnder faktiskt före simuleringens början, men tiden visas som noll sekunder. Samma sak gÀller för meddelandet frÄn konstruktorn UdpEchoClient.
Waf: GÄr in i katalogen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build`
Waf: LĂ€mnar katalogen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build`
'build' avslutades framgÄngsrikt (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(): Skickade 1024 byte till 10.1.1.2
2.00369s UdpEchoServerApplication:HandleRead(): Mottagen 1024 byte frÄn 10.1.1.1
2.00369s UdpEchoServerApplication:HandleRead(): Ă
terkopplar paket
2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)
2.00737s UdpEchoClientApplication:HandleRead(): Mottagen 1024 byte frÄn 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
10s UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()Kom ihÄg att skriptet scratch/first.cc startade echoserverapplikationen en sekund före simuleringens början. Nu kan du se att metoden StartApplication för servern faktiskt anropas vid den första sekunden. Du kan ocksÄ mÀrka att ekoch klienten startar vid den andra sekunden av simuleringen, precis som vi bad i skriptet.
Nu kan du följa simuleringens gÄng genom att anropa ScheduleTransmit i klienten, som anropar Send-back callback HandleRead i echoserverapplikationen. Observera att den förflutna tiden för att skicka paketet över den tvÄpunktslÀnken Àr 3,69 millisekunder. Det Àr tydligt att echoservern registrerar ett meddelande om att den har svarat pÄ paketet, och sedan, efter en kanalens fördröjning, ser du att ekoch klienten tar emot eko-paketet i sin metod HandleRead.
I denna simulering sker mycket utan att du mÀrker det. Men du kan vÀldigt lÀtt spÄra hela processen genom att aktivera alla loggkomponenter i systemet. Försök att stÀlla in vÀrdet i variabeln NS_LOG till följande:
$ export 'NS_LOG=*=level_all|prefix_func|prefix_time'StjÀrnan ovan Àr en wildcard för loggkomponenten. Detta kommer att aktivera alla loggar i alla komponenter som anvÀnds i simuleringen. Jag kommer inte att Äterskapa utskriften hÀr (vid tidpunkten för skrivandet genererar den 1265 rader utskrift för ett eko-paket), men du kan omdirigera denna information till en fil och granska den i din favorittextredigerare.
$ ./waf --run scratch/myfirst > log.out 2>&1Jag anvÀnder personligen denna extremt detaljerade loggversion nÀr jag har ett problem och ingen aning om var det gick fel. Jag kan ganska enkelt följa kodens körning utan att sÀtta brytpunkter och stega genom koden i debuggern. Jag kan bara redigera utdata i min favoritredigerare och leta efter det jag förvÀntar mig och se saker som jag inte förvÀntade mig. NÀr jag fÄr en allmÀn kÀnsla av vad som gÄr fel, gÄr jag över till debuggern för en nÀrmare granskning av problemet. Denna typ av utdata kan vara sÀrskilt anvÀndbar nÀr ditt skript gör nÄgot helt ovÀntat. Om du bara anvÀnder debuggern kan du missa ovÀntade svÀngar helt. Loggning gör sÄdana svÀngar tydliga.
5.1.3 LĂ€gga till loggning i din kod
Du kan lÀgga till nya poster i dina simuleringar genom att göra anrop till loggkomponenten frÄn flera makron. LÄt oss göra detta i skriptet myfirst.cc, som vi har i den "rena" katalogen. LÄt oss pÄminna oss om att vi definierade loggkomponenten i detta skript:
NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");Du vet att du kan aktivera loggning av alla meddelanden frÄn denna komponent genom att stÀlla in miljövariabeln NS_LOG pÄ olika nivÄer. LÄt oss fortsÀtta och lÀgga till nÄgra poster i skriptet. Makrot som anvÀnds för att logga meddelanden pÄ informationsnivÄ Àr NS_LOG_INFO. LÄt oss lÀgga till ett meddelande (precis innan vi börjar skapa noder) som sÀger till dig att skriptet Àr i processen att skapa topologi ("Creating Topology"). Detta görs i följande kodavsnitt,
Ăppna scratch/myfirst.cc i din favoritredigerare och lĂ€gg till raden,
NS_LOG_INFO ("Creating Topology");
precis innan raderna,
NodeContainer nodes;
nodes.Create (2);Nu kompilera skriptet med waf, och rensa NS_LOG-variabeln för att stÀnga av loggströmmen som vi aktiverade tidigare:
$ ./waf
$ export NS_LOG=
Nu, om du kör skriptet,
$ ./waf --run scratch/myfirstkommer du inte att se det nya meddelandet, eftersom den relaterade loggkomponenten (FirstScriptExample) inte har aktiverats. För att se ditt meddelande mÄste du aktivera loggkomponenten FirstScriptExample med en nivÄ som Àr minst NS_LOG_INFO. Om du bara vill se denna specifika loggnivÄ kan du aktivera den sÄ,
$ export NS_LOG=FirstScriptExample=infoOm du kör skriptet nu kommer du att se det nya meddelandet "Creating Topology".
Waf: GÄr in i mappen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build`
Waf: LĂ€mnar mappen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build`
'bygget' slutfört framgÄngsrikt (0.404s)
Skapar Topologi
Skickade 1024 byte till 10.1.1.2
Mottog 1024 byte frÄn 10.1.1.1
Mottog 1024 byte frÄn 10.1.1.25.2 AnvÀndning av kommandoradsargument
5.2.1 Ăverskrivning av standardattributvĂ€rden
Ett annat sÀtt att Àndra ns-3-skriptens beteende utan att redigera och kompilera Àr att anvÀnda kommandoradsargument. Vi tillhandahÄller en mekanism för att analysera kommandoradsargument och automatiskt stÀlla in lokala och globala variabler baserat pÄ resultaten.
Det första steget i att anvÀnda kommandoradssystemet Àr att deklarera kommandoradsanalysatorn. Detta Àr ganska enkelt att göra (i ditt huvudprogram), som i följande kod:
int
main (int argc, char *argv[])
{
...
CommandLine cmd;
cmd.Parse (argc, argv);
...
}Detta enkla tvÄ-raders stycke Àr faktiskt mycket anvÀndbart i sig. Det öppnar dörren till den globala ns-3 variabeln och attributsystemet. LÄt oss lÀgga till tvÄ rader kod i början av huvudfunktionen i skriptet. scratch/myfirst.cc. NÀr vi gÄr vidare, kompilera skriptet och kör det, vid körning gör vi en hjÀlpförfrÄgan pÄ följande sÀtt:
$ ./waf --run "scratch/myfirst --PrintHelp"Detta kommando ber Waf att köra skriptet scratch/myfirst och skicka det ett kommandoradsargument --PrintHelp. Citat tecknen Àr nödvÀndiga för att visa vilket program argumentet Àr avsett för. Kommandoradsanalysatorn kommer att upptÀcka argumentet --PrintHelp och ge ett svar,
Waf: GÄr in i mappen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build`
Waf: LĂ€mnar mappen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build`
'bygget' slutfört framgÄngsrikt (0.413s)
TcpL4Protocol:TcpStateMachine()
CommandLine:HandleArgument(): Hanterar arg namn=PrintHelp vÀrde=
--PrintHelp: Skriv ut detta hjÀlpbussmeddelande.
--PrintGroups: Skriv ut listan över grupper.
--PrintTypeIds: Skriv ut alla TypeIds.
--PrintGroup=[grupp]: Skriv ut alla TypeIds i gruppen.
--PrintAttributes=[typid]: Skriv ut alla attribut av typid.
--PrintGlobals: Skriv ut listan över globala variabler.LÄt oss nu se pÄ alternativet --PrintAttributes. Vi har redan nÀmnt ns-3:s attributsystem, nÀr vi studerade skriptet first.cc. Vi sÄg följande rader kod,
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));och sa att DataRate Àr ett attribut PointToPointNetDevice. LÄt oss anvÀnda kommandoradsanalysatorn för att visa attributen PointToPointNetDevice. HjÀlplistan sÀger att vi mÄste ange TypeId. Detta Àr namnet pÄ klassen som de intressanta attributen tillhör. I vÄrt fall kommer det att vara ns3::PointToPointNetDevice. LÄt oss fortsÀtta framÄt, ange,
$ .\/waf --run "scratch\/myfirst --PrintAttributes=ns3::PointToPointNetDevice"Systemet kommer att skriva ut alla attribut för denna typ av nÀtverksenhet. Du kommer att se att bland attributen i listan finns,
--ns3::PointToPointNetDevice::DataRate=[32768bps]:
Den standard datahastighet för punkt-till-punkt-lÀnkarDetta Àr standardvÀrdet som kommer att anvÀndas i systemet nÀr ett objekt skapas. PointToPointNetDevice. Vi kommer att ÄsidosÀtta detta standardvÀrde med hjÀlp av parametern Attribut pÄ PointToPointHelper ovan. LÄt oss anvÀnda standardvÀrdena för punkt-till-punkt-enheter och kanaler. För att göra detta tar vi bort anropen SetDeviceAttribute och SetChannelAttribute frÄn myfirst.cc, som vi har i den rena katalogen.
Ditt skript ska nu bara deklarera PointToPointHelper och inte utföra nÄgra installationsoperationer, som visas i exemplet nedan,
...
NodeContainer nodes;
nodes.Create (2);
PointToPointHelper pointToPoint;
NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);
...FortsÀtt och skapa ett nytt skript med Waf (.\/waf) och lÄt oss gÄ tillbaka och inkludera lite loggning frÄn UDP echo-applikationen pÄ servern och inkludera tidsprefix.
$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'Om du kör skriptet, bör du se följande utdata:
Waf: GÄr in i katalogen `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
Waf: LĂ€mnar katalogen `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
'bygg' slutfördes framgÄngsrikt (0.405s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Skickade 1024 byte till 10.1.1.2
2.25732s Mottog 1024 byte frÄn 10.1.1.1
2.25732s Ă
terkopplar paket
Mottog 1024 byte frÄn 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()LÄt oss komma ihÄg att förra gÄngen vi tittade pÄ simuleringstidpunkten för mottagandet av paketet av echoservern var det vid 2,00369 sekunder.
2.00369s UdpEchoServerApplication:HandleRead(): Mottog 1024 byte frÄn 10.1.1.1Nu fÄr den paketet vid 2.25732 sekunder. Detta beror pÄ att vi helt enkelt sÀnkte överföringshastigheten för PointToPointNetDevice frÄn fem megabit per sekund till standardvÀrdet som Àr 32768 bitar per sekund. Om vi hade angivit den nya DataRate med hjÀlp av kommandoraden kunde vi ha ökat hastigheten pÄ vÄr simulering igen. Vi gör det pÄ följande sÀtt, enligt formeln som föreslÄs av hjÀlpelementet:
$ .\/waf --run "scratch\/myfirst --ns3::PointToPointNetDevice::DataRate=5Mbps"Som ett resultat kommer standardvĂ€rdet för DataRate-attributet att Ă„tergĂ„ till fem megabit per sekund. Ăr du förvĂ„nad över resultatet? Tydligen behöver vi för att Ă„terstĂ€lla det ursprungliga beteendet i skriptet ocksĂ„ stĂ€lla in kanalens fördröjning i enlighet med ljusets hastighet. Vi kan be kommandoraden att skriva ut kanalens attribut, precis som vi gjorde för nĂ€tverksenheten:
$ .\/waf --run "scratch\/myfirst --PrintAttributes=ns3::PointToPointChannel"Vi kommer att upptÀcka att kanalens fördröjningsattribut Àr instÀllt pÄ följande sÀtt:
--ns3::PointToPointChannel::Delay=[0ns]:
Ăverföringsfördröjning genom kanalenDĂ€refter kan vi via kommandoraden stĂ€lla in bĂ„da dessa standardvĂ€rden,
$ .\/waf --run "scratch\/myfirst
--ns3::PointToPointNetDevice::DataRate=5Mbps
--ns3::PointToPointChannel::Delay=2ms"i detta fall ÄterstÀller vi tiden vi hade nÀr vi tydligt stÀllde in DataRate och Delay i skriptet:
Waf: GÄr in i katalogen `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
Waf: LĂ€mnar katalogen `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
'build' avslutades framgÄngsrikt (0.417s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Skickat 1024 byte till 10.1.1.2
2.00369s Mottaget 1024 byte frÄn 10.1.1.1
2.00369s Ekkopaket
Mottaget 1024 byte frÄn 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()Notera att paketet mottogs igen av servern efter 2,00369 sekunder. Vi skulle faktiskt kunna stÀlla in vilket av de attribut som anvÀnds i skriptet som helst pÄ det hÀr sÀttet. Specifikt skulle vi kunna stÀlla in vÀrden som Àr olika frÄn ett för attributen MaxPackets UdpEchoClient.
Hur skulle du anvÀnda detta? Prova. Kom ihÄg att du mÄste kommentera platsen dÀr vi ÄsidosÀtter vÀrdet av standardattributet och stÀlla in det tydligt MaxPackets i skriptet. Du mÄste ocksÄ bygga om skriptet. Du kan ocksÄ fÄ hjÀlp via kommandoraden för syntaxen för att stÀlla in ett nytt vÀrde för standardattributet. NÀr du förstÄtt detta kan du styra antalet paket som visas i kommandoraden. Eftersom vi Àr noggranna ska vÄr kommandorad se ut ungefÀr sÄ hÀr:
$ .\/waf --run "scratch\/myfirst
--ns3::PointToPointNetDevice::DataRate=5Mbps
--ns3::PointToPointChannel::Delay=2ms
--ns3::UdpEchoClient::MaxPackets=2"En naturlig frÄga som uppstÄr hÀr Àr hur man fÄr veta om alla dessa attributs existens. à terigen har kommandoraden en hjÀlpfunktion för detta. Om vi begÀr hjÀlp frÄn kommandoraden bör vi se:
$ ./waf --run "scratch/myfirst --PrintHelp"
myfirst [Program Arguments] [General Arguments]
General Arguments:
--PrintGlobals: Skriv ut listan med globala variabler.
--PrintGroups: Skriv ut listan med grupper.
--PrintGroup=[group]: Skriv ut alla TypeIds av gruppen.
--PrintTypeIds: Skriv ut alla TypeIds.
--PrintAttributes=[typeid]: Skriv ut alla attribut för typeid.
--PrintHelp: Skriv ut detta hjÀlpmeddelande.Om du vÀljer argumentet "PrintGroups" bör du se en lista över alla registrerade grupper. TypeId. Gruppnamnen överensstÀmmer med modulnamnen i kÀllkatalogen (dock med versaler). Att skriva ut all information pÄ en gÄng skulle bli för omfattande, sÄ en ytterligare filter för utskrift av information efter grupper Àr tillgÀngligt. SÄ, med fokus pÄ modulen "punkt-till-punkt":
./waf --run "scratch/myfirst --PrintGroup=PointToPoint"
TypeIds i gruppen PointToPoint:
ns3::PointToPointChannel
ns3::PointToPointNetDevice
ns3::PointToPointRemoteChannel
ns3::PppHeaderHÀr kan du hitta tillgÀngliga TypeId-namn för att söka efter attribut, till exempel i
--PrintAttributes = ns3::PointToPointChannel, som visas ovan.
Ett annat sÀtt att lÀra sig om attribut Àr via Doxygen ns-3. Det finns en sida som listar alla registrerade attribut i simulatorn.
5.2.2 FÄnga dina egna kommandon
Du kan ocksÄ lÀgga till egna hooks via kommandoradesystemet. Detta görs ganska enkelt med metod för kommandoradsparser. AddValue.
LÄt oss anvÀnda denna möjlighet för att ange antalet paket som ska visas pÄ ett helt annat sÀtt. LÄt oss lÀgga till en lokal variabel med namnet nPackets i funktionen main. Vi sÀtter den till en för att matcha vÄrt tidigare beteende som standard. För att lÄta kommandoradsparseren Àndra detta vÀrde behöver vi fÄnga detta vÀrde i parsern. Vi gör detta genom att lÀgga till anropet AddValue. GÄ och Àndra skriptet scratch/myfirst.cc sÄ att det börjar med följande kod,
int
main (int argc, char *argv[])
{
uint32_t nPackets = 1;
CommandLine cmd;
cmd.AddValue("nPackets", "Antal paket som ska ekas", nPackets);
cmd.Parse (argc, argv);
...Rulla ner till den punkt i skriptet dÀr vi sÀtter attributet MaxPackets och Àndra det sÄ att det Àr instÀllt pÄ variabeln nPackets istÀllet för konstanten 1, som visas nedan.
echoClient.SetAttribute ("MaxPackets", UintegerValue (nPackets));Nu, om du kör skriptet och anger argumentet --PrintHelp, borde du se det nya anvÀndarargumentet. listat pÄ hjÀlpskÀrmen. Skriv in,
$ .\/waf --run "scratch\/myfirst --PrintHelp"
Waf: GÄr in i katalogen `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
Waf: LĂ€mnar katalogen `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
'build' avslutades framgÄngsrikt (0.403s)
--PrintHelp: Skriv ut detta hjÀlpbok.
--PrintGroups: Skriv ut listan över grupper.
--PrintTypeIds: Skriv ut alla TypeIds.
--PrintGroup=[group]: Skriv ut alla TypeIds för gruppen.
--PrintAttributes=[typeid]: Skriv ut alla attribut för typeid.
--PrintGlobals: Skriv ut listan över globala vÀrden.
AnvÀndarargument:
--nPackets: Antal paket att echoureOm du vill Ă€ndra antalet överförda paket kan du göra det genom att stĂ€lla in argumentet -â-nPackets i kommandoraden.
$ .\/waf --run "scratch\/myfirst --nPackets=2"Nu bör du se
Waf: GÄr in i katalogen `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
Waf: LĂ€mnar katalogen `\/home\/craigdo\/repos\/ns-3-allinone\/ns-3-dev\/build'
'build' avslutades framgÄngsrikt (0.404s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Skickade 1024 bytes till 10.1.1.2
2.25732s Mottog 1024 bytes frÄn 10.1.1.1
2.25732s Echouerande paket
Mottog 1024 bytes frÄn 10.1.1.2
Skickade 1024 bytes till 10.1.1.2
3.25732s Mottog 1024 bytes frÄn 10.1.1.1
3.25732s Echouerande paket
Mottog 1024 bytes frÄn 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()Du har nu skickat tvÄ paket. Ganska enkelt, eller hur?
Du kan se att som en anvĂ€ndare av nsâ3 kan du anvĂ€nda kommandoradssystemet för att styra globala vĂ€rden och attribut. Om du Ă€r modellförfattare kan du lĂ€gga till nya attribut till dina objekt, och de kommer automatiskt att vara tillgĂ€ngliga för konfiguration av dina anvĂ€ndare via kommandoradssystemet. Om du Ă€r skriptförfattare kan du lĂ€gga till nya variabler i dina skript och smidigt koppla dem till kommandoradssystemet.
5.3 AnvÀndning av spÄrningssystemet
Syftet med simulering Ă€r att skapa utdata för vidare undersökning, och nsâ3:s spĂ„rningssystem Ă€r den primĂ€ra mekanismen för detta. Eftersom nsâ3 Ă€r ett program i C++ kan man anvĂ€nda standardmetoder för att generera utdata i program skrivna i C++:
#include <iostream>
...
int main ()
{
...
std::cout << "The value of x is " << x << std::endl;
...
}Du kan till och med anvÀnda loggningsmodulen för att lÀgga till lite struktur i din lösning. MÄnga problem kan uppstÄ med denna metod, och för att lösa dessa problem har vi tillhandahÄllit ett gemensamt system för hÀndelsetransaktioner.
De huvudsakliga mĂ„len med nsâ3:s spĂ„rningssystem:
För grundlÀggande uppgifter ska spÄrningssystemet möjliggöra för anvÀndaren att generera standardspÄrning för populÀra kÀllor och vÀlja objekt som genererar spÄrning.
Mellanliggande anvÀndare bör kunna utvidga spÄrningssystemet för att Àndra det genererade utdataformatet eller för att infoga nya spÄrningskÀllor utan att modifiera simulatorns kÀrna;
Erfarna anvÀndare kan modifiera simulatorns kÀrna för att lÀgga till nya kÀllor och mottagare av spÄrning. Ns-3:s spÄrningssystem bygger pÄ principerna för oberoende spÄrningskÀllor och mottagare samt ett enhetligt mekanism för att koppla kÀllor till konsumenter.
Ns-3:s spÄrningssystem bygger pÄ principerna för oberoende spÄrningskÀllor och mottagare samt ett enhetligt mekanism för att koppla kÀllor till mottagare. SpÄrningskÀllor Àr objekt som kan signalera om hÀndelser som intrÀffar i simuleringen och ge tillgÄng till intressanta grundlÀggande uppgifter. Till exempel kan en spÄrningskÀlla indikera nÀr en nÀtverksenhet har mottagit ett paket och ge tillgÄng till paketets innehÄll för intresserade spÄrningsmottagare.
SpÄrningskÀllor Àr i sig sjÀlva vÀrdelösa om de inte "ansluts" till andra delar av koden som faktiskt gör nÄgot anvÀndbart med informationen som tillhandahÄlls av mottagaren. SpÄrare Àr konsumenter av hÀndelser och data som tillhandahÄlls av spÄrningskÀllor. Till exempel kan man skapa en spÄrningsmottagare som (vid anslutning till spÄrningskÀllan frÄn det tidigare exemplet) skriver ut intressanta delar av det mottagna paketet.
En rimlig grund för en sÄdan tydlig separation Àr att tillÄta anvÀndare att koppla nya typer av mottagare till befintliga spÄrningskÀllor utan att behöva redigera och rekonstruera simulatorns kÀrna. DÀrför kan anvÀndaren i det ovanstÄende exemplet definiera en ny spÄrare i sitt skript och koppla den till en befintlig spÄrningskÀlla som definieras i simuleringskÀrnan, endast genom att redigera anvÀndarskriptet.
I den hÀr guiden gÄr vi igenom vissa fördefinierade kÀllor och mottagare och visar hur de kan konfigureras med minimal anstrÀngning frÄn anvÀndarens sida. Se ns-3-guiden eller avsnitt med instruktioner för information om avancerad spÄrningskonfiguration, inklusive utvidgning av spÄrningsnamnutrymmet och skapande av nya spÄrningskÀllor.
5.3.1 ASCII SpÄrning
ns-3 tillhandahÄller hjÀlpfunktionalitet som erbjuder ett lÄgnivÄ spÄrningssystem för att hjÀlpa dig med detaljerna nÀr du stÀller in enkla paketspÄrningar. Om du aktiverar denna funktion kommer du att se output i ASCII-filer. För dem som Àr bekanta med ns-2:s output, Àr denna typ av spÄrning liknande out.tr, som genereras av en mÀngd skript.
LÄt oss komma till saken och lÀgga till lite ASCII-spÄrningsresultat i vÄrt skript scratch/myfirst.cc. Precis före anropet till Simulator::Run(), lÀgg till följande kodrader:
AsciiTraceHelper ascii;
pointToPoint.EnableAsciiAll(ascii.CreateFileStream("myfirst.tr"));Som i mÄnga andra idiomer i ns-3, anvÀnder denna kod ett hjÀlpbject för att skapa ASCII-spÄrningar. Den andra raden innehÄller tvÄ inbÀddade metodanrop. Metoden 'inuti' CreateFileStream() anvÀnder en anonym objektidiom för att skapa ett filströmobjekt pÄ stacken (utan objektnamn) och skickar det till den anropade metoden. I framtiden kommer vi att fördjupa oss i detta Àmne, men allt du behöver veta för tillfÀllet Àr att du skapar ett objekt som representerar en fil med namnet myfirst.tr och överför det till ns-3. Vi överlÄter ns-3 ansvaret för det skapade objektet under hela dess livslÀngd, under vilken problem som orsakas av det okÀnda (avsiktliga) begrÀnsningen relaterat till kopierande konstruktörer av C++ strömobjekt hanteras.
Det externa anropet EnableAsciiAll() informerar hjÀlparen att du vill aktivera ASCII-spÄrning för alla punkt-till-punkt-enhetsanslutningar i din simulering och att du vill att de (specificerade) spÄrningsmottagarna ska registrera information om paketens rörelse i ASCII-format.
För dem som Àr bekanta med ns-2 Àr de spÄrade hÀndelserna ekvivalenta med de kÀnda spÄrningspunkterna som loggar hÀndelserna '+', '-', 'd' och 'r'.
Nu kan du kompilera skriptet och köra det frÄn kommandoraden:
$ ./waf --run scratch/myfirstSĂ„ mĂ„nga gĂ„nger tidigare har du sett flera meddelanden frĂ„n Waf, och sedan "âbuildâ finished successfully" (bygget slutfördes framgĂ„ngsrikt) med ett antal meddelanden frĂ„n programmet som körs.
NÀr programmet körs, kommer det att skapa en fil med namnet myfirst.tr. PÄ grund av programmets egenskaper Waf, skapas filen som standard inte i den lokala katalogen, utan i den översta katalogen av repositoryt. Om du vill Àndra sökvÀgen dÀr spÄren sparas, kan du ange den för Waf-parametern --cwd. Vi gjorde inte det, sÄ för att titta pÄ ASCII-spÄrfilen myfirst.tr i din favoritredigerare, mÄste vi gÄ till den översta katalogen i vÄrt repository.
Parsing av ASCII spÄrning
Det finns mycket information i en ganska kompakt form, men det första att notera Àr att filen bestÄr av separata rader. Detta kommer att bli tydligt om du breddar visningsfönstret.
Varje rad i filen motsvarar en spĂ„rningshĂ€ndelse. I det hĂ€r fallet spĂ„rar vi hĂ€ndelser i överföringskön som finns i varje punkt-till-punkt-nĂ€tverksenhet i simuleringen. Ăverföringskön Ă€r den kö genom vilken varje paket mĂ„ste passera för punkt-till-punkt-kanalen. Observera att varje rad i spĂ„rningsfilen inleds med en ensam symbol (och har ett mellanrum efter sig). Denna symbol kommer att ha följande betydelse:
+: en operation för att sÀtta i kö skedde i enhetens kö;
-: en operation för att ta bort ett element skedde i enhetens kö;
d: paketet avvisades, vanligtvis eftersom kön var full;
r: paketet mottogs av nÀtverksenheten.
LÄt oss titta mer detaljerat pÄ den första raden i spÄrningsfilen. Jag kommer att dela upp den i delar (med indrag för tydlighet) och radnumret till vÀnster:
0 +
1 2
2 \/NodeList\/0\/DeviceList\/0\/$ns3::PointToPointNetDevice\/TxQueue\/Enqueue
3 ns3::PppHeader (
4 Punkt-till-Punkt-protokoll: IP (0x0021))
6 ns3::Ipv4Header (
7 tos 0x0 ttl 64 id 0 protokoll 17 offset 0 flaggor [inga]
8 lÀngd: 1052 10.1.1.1 > 10.1.1.2)
9 ns3::UdpHeader (
10 lÀngd: 1032 49153 > 9)
11 Payload (storlek=1024)Den första sektionen av detta utökade spÄrningshÀndelse (rad 0) Àr operationen. HÀr har vi symbolen +, som motsvarar en operation för att sÀtta i kö för överföring. Den andra sektionen (rad 1) Àr simuleringstiden, uttryckt i sekunder. Du kanske kommer ihÄg att vi bad om UdpEchoClientApplication starta paketöverföringen om tvÄ sekunder. HÀr ser vi en bekrÀftelse pÄ att detta faktiskt sker.
I nÀsta avsnitt av tracerouten (frÄn rad 2) visas vilken kÀlla som genererat denna hÀndelse (namnrymden anges). Du kan tÀnka pÄ namnrymden i tracerouten ungefÀr som en filsystemnamnrymd. Roten av namnrymden Àr NodeList. Detta motsvarar en behÄllare som hanteras i huvudsak av ns-3-koden. Den innehÄller alla noder som skapas i skriptet. Liksom ett filsystem kan ha flera kataloger i roten, kan vi i NodeList ha mÄnga noder. SÄledes refererar raden /NodeList/0 till nod noll i NodeList, som vi vanligtvis förstÄr som 'nod 0'. I varje nod finns en lista över enheter som har installerats. Denna lista ligger i nÀsta namnrymd. Du kan se att denna traceroute-hÀndelse kommer frÄn DeviceList/0, som Àr den nollstÀllda enheten installerad pÄ noden.
Den följande understrÀngen, $ ns3::PointToPointNetDevice, anger vilken enhet som befinner sig i nollposition: enhetslistan för nod noll. Det bör noteras att operationen + som finns pÄ rad 0 innebar att ett element lades till i enhetens överföringskö. Detta Äterspeglas i de senaste segmenten av "tracern": TxQueue/Enqueue.
De ÄterstÄende sektionerna i tracerouten bör vara ganska intuitiva. Raderna 3-4 visar att paketet Àr inkapslat i punkt-till-punkt-protokollet. Raderna 5-7 visar att paketet har en IP4-versionens rubrik och har sin ursprung frÄn IP-adressen 10.1.1.1 och Àr avsett för 10.1.1.2. Raderna 8-9 visar att detta paket har en UDP-rubrik och slutligen visar rad 10 att nyttolasten Àr förvÀntade 1024 byte.
Den följande raden i traceroute-filen visar att samma paket har tagits bort frÄn överföringskön pÄ samma nod.
Den tredje raden i traceroute-filen visar att paketet har tagits emot av nÀtverksenheten pÄ noden med echoservern. Jag Äterges denna hÀndelse nedan.
0 r
1 2.25732
2 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/MacRx
3 ns3::Ipv4Header (
4 tos 0x0 ttl 64 id 0 protokoll 17 offset 0 flaggor [inga]
5 lÀngd: 1052 10.1.1.1 > 10.1.1.2)
6 ns3::UdpHeader (
7 lÀngd: 1032 49153 > 9)
8 Nyttolast (storlek=1024)Observera att spÄrningsoperationen nu Àr r, och simuleringstiden har ökat till 2,25732 sekunder. Om du noggrant följde instruktionerna i handledningen betyder detta att du lÀmnade DataRate för nÀtverksenheter och kanalens fördröjning pÄ sina standardvÀrden. Denna tid borde vara bekant, som du redan har sett i föregÄende avsnitt.
Namnrymden för spĂ„rningskĂ€llan (rad 2) har Ă€ndrats för att Ă„terspegla att denna hĂ€ndelse kommer frĂ„n nod 1 (\/NodeList/1) Đž паĐșĐ”Ń ĐżŃĐžĐœŃŃ ĐžŃŃĐŸŃĐœĐžĐșĐŸĐŒ ŃŃаŃŃĐžŃĐŸĐČĐșĐž (/MacRx). Det bör vara ganska enkelt att följa paketets rörelse genom topologin genom att titta pĂ„ de kvarvarande stigen i spĂ„rningsfilen.
5.3.2 PCAP SpÄrning
ns-3-enhetens hjÀlpare kan ocksÄ anvÀndas för att skapa spÄrningsfiler i .pcap-format. Akronymen pcap (vanligtvis skrivet med smÄ bokstÀver) stÄr för paketfÄngst och Àr i sjÀlva verket ett API som inkluderar definitionen av .pcap filformatet. Det mest populÀra programmet som kan lÀsa och visa detta format Àr Wireshark (tidigare kallad Ethereal). Det finns dock mÄnga paketanalysatorer som anvÀnder detta paketformat. Vi rekommenderar anvÀndare att anvÀnda en mÀngd olika verktyg som Àr tillgÀngliga för analys av pcap-spÄr. I denna handledning kommer vi att fokusera pÄ att visa pcap-spÄr med hjÀlp av Fungerar libdns korrekt? => Kör.
Aktiveringen av pcap-spÄrning görs med en kodrad.
pointToPoint.EnablePcapAll ("myfirst");SĂ€tt denna kodrad efter ASCII-spĂ„rningskoden som vi just har lagt till i scratch/myfirst.cc. Observera att vi endast har skickat strĂ€ngen "myfirst", inte "myfirst.pcap" eller nĂ„got liknande. Detta beror pĂ„ att parametern Ă€r ett prefix, inte ett fullstĂ€ndigt filnamn. Under simuleringen kommer hjĂ€lpen faktiskt att skapa en spĂ„rningsfil för varje punkt-till-punkt-enhet. Filnamnen kommer att byggas med hjĂ€lp av prefixet, nodnumret, enhetsnumret och suffixet â.pcap».
För vĂ„rt exempel pĂ„ skript kommer vi slutligen att se filer med namnen âmyfirst-0-0.pcap" och "myfirst-1-0.pcap,â som Ă€r pcap-spĂ„r för nod 0-enhet 0 och nod 1-enhet 0 respektive. NĂ€r du har lagt till kodraden för att aktivera pcap-spĂ„rning, kan du köra skriptet pĂ„ vanligt sĂ€tt:
$ ./waf --run scratch/myfirstOm du kollar i rotkatalogen för din distribution bör du se tre filer: en ASCII-spĂ„rningsfil, myfirst.trsom vi studerade tidigare, filer myfirst-0-0.pcap och myfirst-1-0.pcap â nya pcap-filer som vi precis har genererat.
LĂ€ser utdata med tcpdump
För nÀrvarande Àr det enklast att anvÀnda tcpdump för att visa pcap-filer.
$ tcpdump -nn -tt -r myfirst-0-0.pcap
lÀser frÄn filen myfirst-0-0.pcap, lÀnktyp PPP (PPP)
2.000000 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, lÀngd 1024
2.514648 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, lÀngd 1024
tcpdump -nn -tt -r myfirst-1-0.pcap
lÀser frÄn filen myfirst-1-0.pcap, lÀnktyp PPP (PPP)
2.257324 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, lÀngd 1024
2.257324 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, lÀngd 1024I dumpen myfirst-0-0.pcap (klientapparat) kan du se att ekopaketet skickas efter 2 sekunder av simulering. Om du tittar pÄ den andra dumpen (myfirst-1-0.pcap), kommer du att se att paketet tas emot vid 2,257324 sekunder. Du kommer att se i den andra dumpen att paketet Äterkommer vid 2,257324 sekunder och slutligen att paketet har mottagits av klienten tillbaka i den första dumpen vid 2,514648 sekunder.
LĂ€ser utdata med Wireshark
Om du inte Ă€r bekant med Wireshark, finns det en webbplats dĂ€r du kan ladda ner program och dokumentation: . Wireshark â det Ă€r ett grafiskt anvĂ€ndargrĂ€nssnitt som kan anvĂ€ndas för att visa dessa spĂ„rningsfiler. Om du har Wireshark kan du öppna valfri av spĂ„rningsfilerna och visa innehĂ„llet som om du hade fĂ„ngat paket med en paketanalysator.
KĂ€lla: habr.com
