Handbok för nÀtverkssimulatorn ns-3. Kapitel 4

Handbok för nÀtverkssimulatorn ns-3. Kapitel 4
kapitel 1,2
kapitel 3

4 Översikt av konceptet
4.1 Nyckelabstraktioner
4.1.1 Nod
4.1.2 Applikation
4.1.3 Kanal
4.1.4 NĂ€tverksenhet
4.1.5 Topologiska hjÀlpmedel
4.2 Första ns-3 skriptet
4.2.1 Grundkod
4.2.2 TillÀggsmoduler
4.2.3 Namnutrymme ns3
4.2.4 Loggning
4.2.5 Huvudfunktion
4.2.6 AnvÀndning av topologiska hjÀlpmedel
4.2.7 AnvÀndning av Applikation
4.2.8 Simulator
4.2.9 Bygga ditt scenario
4.3 ns-3 KĂ€llkod

Kapitel 4

Översikt av konceptet

Det första vi mÄste göra innan vi börjar studera eller skriva ns-3 kod Àr att förklara nÄgra grundlÀggande begrepp och abstraktioner i systemet. Mycket av detta kan för vissa verka uppenbart, men vi rekommenderar att du tar dig tid att lÀsa detta avsnitt för att sÀkerstÀlla att du börjar pÄ en stabil grund.

4.1 Nyckelabstraktioner

I detta avsnitt kommer vi att titta pÄ vissa termer som vanligtvis anvÀnds i nÀtverksmiljöer, men som har en specifik betydelse i ns-3.

4.1.1 Nod

I internet-jargong kallas en dator som Àr ansluten till nÀtverket för en vÀrd eller ibland en slutlig system. Eftersom ns-3 Àr en nÀtverkssimulator och inte en internet-simulator, anvÀnder vi medvetet inte termen vÀrd, dÄ det Àr nÀra kopplat till internet och dess protokoll. IstÀllet anvÀnder vi en mer generell term, som Àven anvÀnds av andra simulatorer, som hÀrstammar frÄn grafteori - nod (node).

I ns-3 Àr den grundlÀggande abstraktionen av en dator en nod. Denna abstraktion representeras i C++ av klassen Node. Klassen NodeNode (nod) ger metoder för att hantera representationerna av datorer i simulationerna.

Du mÄste förstÄ Node hur en dator fungerar, som du kan lÀgga till funktionalitet till. Du kommer att lÀgga till komponenter som applikationer, protokollstackar och grÀnssnittskort med drivrutiner som gör det möjligt för datorn att utföra nyttig verksamhet. Vi anvÀnder samma grundlÀggande modell i ns-3.

4.1.2 Applikation

I allmÀnhet delas datorprogramvara in i tvÄ breda klasser. Systemprogramvaran organiserar olika datorresurser som minne, processorcykler, disk, nÀtverk och sÄ vidare i enlighet med en viss berÀkningsmodell. Systemprogramvara anvÀnds vanligtvis inte för att hantera resurser för att utföra uppgifter som ger direkt nytta för anvÀndaren. För att uppnÄ ett visst mÄl startar anvÀndaren vanligtvis en applikation som fÄr och anvÀnder resurser som kontrolleras av systemprogramvaran.

Ofta dras grÀnsen mellan systemprogramvara och programvaruapplikationer vid förÀndringen av privilegienivÄer, vilket intrÀffar i operativsystemets avbrott. I ns-3 finns ingen verklig koncept av operativsystem och dÀrmed inga begrepp för privilegienivÄer eller systemanrop. Vi har dock en idé om applikationer. Precis som i "den verkliga vÀrlden" arbetar programvaruapplikationer pÄ datorer för att utföra uppgifter, arbetar ns-3-applikationer pÄ ns-3-noder för att hantera simulationer i den simulerade vÀrlden.

I ns-3 Àr den grundlÀggande abstraktionen för anvÀndarprogram som genererar viss aktivitet för modellering en applikation. Denna abstraktion representeras i C++ av klassen Application. Klassen Application tillhandahÄller metoder för att hantera representationerna av vÄr version av anvÀndarnivÄapplikationer i simulationerna. Det förvÀntas av utvecklarna att de ska specialisera klassen Application för att skapa nya applikationer i enlighet med objektorienterad programmering. I den hÀr guiden kommer vi att anvÀnda specialiseringar av klassen Application som kallas UdpEchoClientApplication och UdpEchoServerApplication. Som förvÀntat utgör dessa applikationer en uppsÀttning klient/server-applikationer som anvÀnds för att generera och echo-simulera nÀtverkspaket.

4.1.3 Kanal

I den verkliga vÀrlden kan en dator kopplas till ett nÀtverk. Ofta kallas de miljöer dÀr data överförs i dessa nÀtverk för kanaler. NÀr du kopplar en Ethernet-kabel till ett vÀgguttag kopplar du datorn till en Ethernet-kommunikationskanal. I den simulerade vÀrlden ns-3 kopplas en nod till ett objekt som representerar en kommunikationskanal. HÀr kallas den huvudsakliga abstraktionen av kommunikationsundersystemet för kanal och representeras i C++ av klassen Channel (kanal).

Klassen ChannelChannel tillhandahÄller metoder för att hantera interaktionen mellan objekt i undersystemet och kopplingen till noder. Kanaler kan ocksÄ specialiseras av utvecklare i termer av objektorienterad programmering. Specialiseringen av en kanal kan modellera nÄgot sÄ enkelt som en sladd. En specialiserad kanal kan ocksÄ modellera komplexa saker som en stor Ethernet-switch eller ett tre-dimensionellt utrymme fyllt med hinder i fallet med trÄdlösa nÀtverk.

I den hÀr guiden kommer vi att anvÀnda specialiserade versioner av kanalen som kallas CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel och WifiChannelWifiChannel. CsmaChannel, till exempel, modellerar en version av kommunikationsundersystemet som implementerar en kommunikationsmiljö för fleranvÀndartillgÄng med bÀrarkontroll. Detta ger oss Ethernet-liknande funktionalitet.

4.1.4 NĂ€tverksenhet

Tidigare var det sÄ att om du ville koppla en dator till ett nÀtverk, behövde du köpa en specifik nÀtverkskabel och en hÄrdvaruenhet som kallas (i PC-terminologi) ett expansionskort, som behövde installeras i datorn. Om vissa nÀtverksfunktioner var implementerade pÄ expansionskortet kallades de nÀtverksgrÀnssnittskort eller nÀtverkskort. Idag levereras de flesta datorer med integrerad nÀtverksutrustning och anvÀndare ser dem inte som separata enheter.

Ett nÀtverkskort fungerar inte utan en programdrivrutin som styr dess hÄrdvara. I Unix (eller Linux) klassificeras en del of perifera enheter som en device. Enheter styrs med hjÀlp av enhetsdrivrutiner (device drivers), och nÀtverksenheter (NIC) styrs med hjÀlp av nÀtverksenhetsdrivrutiner (network device drivers) och har den samlande termen nÀtverksenheter (net devices). I Unix och Linux refererar du till nÀtverksenheter med namn som till exempel eth0.

I ns-3 omfattar abstraktionen av nÀtverksenheter bÄde en programdrivrutin och den simulerade hÄrdvaran. Vid simulering "installeras" nÀtverksenheten i en nod för att möjliggöra kommunikation med andra noder via kanaler. Precis som i en verklig dator kan en nod vara ansluten till flera kanaler genom flera enheter. NetDevices.

NĂ€tverksabstraktionen av en enhet representeras i C++ genom klassen NetDevice. Klassen NetDevice tillhandahĂ„ller metoder för att hantera anslutningar till objekt av typen Node och Channel; och kan specialanpassas av utvecklare inom objektorienterad programmering. I denna guide kommer vi att anvĂ€nda flera specialanpassade versioner av NetDevice med namnen CsmaNetDevice, PointToPointNetDevice och WifiNetDevice. Precis som en Ethernet-nĂ€tverksadapter Ă€r avsedd att fungera med nĂ€tverket, Ă€r Ethernet, CsmaNetDevice avsedd att fungera med CsmaChannel, PointToPointNetDevice avsedd att fungera med PointToPointChannel, och WifiNetDevice — Ă€r avsedd att fungera med WifiChannel.

4.1.5 Topologiska hjÀlpmedel

I ett verkligt nÀtverk hittar du vÀrddatorer med tillagda (eller inbyggda) nÀtverkskort. I ns-3 skulle vi sÀga att du ser noder med anslutna NetDevices. I ett stort simulerat nÀtverk behöver du organisera anslutningar mellan mÄnga objekt. Node, NetDevice och Channel.

Eftersom anslutningen av NetDevices till noder, NetDevices till kanaler, tilldelning av IP-adresser osv. i ns-3 Ă€r en gemensam uppgift, sĂ„ för att göra detta sĂ„ enkelt som möjligt erbjuder vi sĂ„ kallade topologiska hjĂ€lpmedel. Till exempel, för att skapa en NetDevice mĂ„ste du utföra mĂ„nga grundlĂ€ggande operationer i ns-3, lĂ€gga till en MAC-adress, installera denna nĂ€tverksenhet i Node, konfigurera protokollstacken för noden och sedan koppla NetDevice till Channel. Ännu fler operationer krĂ€vs för att koppla flera enheter till multipointkanaler och sedan ansluta separata nĂ€tverk till ett gemensamt nĂ€tverk (Internetworks). Vi erbjuder hjĂ€lpapparater för topologi som, för din bekvĂ€mlighet, kombinerar dessa mĂ„nga operationer i en lĂ€ttanvĂ€nd modell.

4.2 Första ns-3 skriptet

Om du har installerat systemet enligt ovan, kommer du att ha ns-3-versionen i en katalog med namnet repos i din hemkatalog. GĂ„ till katalogen. release

Om du inte har en sÄdan katalog har du inte angivit utmatningskatalogen vid kompileringen av releaseversionen av ns-3. Kör kompileringen sÄ hÀr:
$ ./waf configure —build-profile=release —out=build/release,
$ ./waf build

dÀr bör du se en katalogstruktur som liknar följande:

AUTHORS       examples      scratch       utils       waf.bat*
bindings      LICENSE       src           utils.py    waf-tools
build         ns3           test.py*      utils.pyc   wscript
CHANGES.html  README        testpy-output VERSION     wutils.py
doc           RELEASE_NOTES testpy.supp   waf*        wutils.pyc

GÄ till mappen examples/tutorial. Du bör se en fil dÀr som heter first.cc. Detta Àr ett skript som kommer att skapa en enkel punkt-till-punkt-anslutning mellan tvÄ noder och överföra ett paket mellan noderna. LÄt oss titta pÄ detta skript rad för rad genom att öppna first.cc i din favoriteditor.

4.2.1 Grundkod
Den första raden i filen Àr redigerarens lÀgenrad emacs. Den informerar emacs om formateringskonventionerna (kodningsstil) som vi ska anvÀnda i vÄr kÀllkod.

/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */

Detta Àr alltid en ganska kontroversiell frÄga, sÄ vi mÄste klargöra detta för att omedelbart fÄ det ur vÀgen. Projektet ns-3, precis som de flesta större projekt, har antagit en kodningsstil som all kod som tillhandahÄlls mÄste följa. Om du vill bidra med din kod till projektet mÄste du sÄ smÄningom följa ns-3:s kodningsstandard, som beskrivs i filen doc/codingstd.txt eller som visas pÄ projektets webbplats: https://www.nsnam.org/develop/contributing-code/coding-style/.

Vi rekommenderar att du vÀnjer dig vid utseendet pÄ kod i ns-3 och tillÀmpar denna standard varje gÄng du arbetar med vÄr kod. Hela utvecklingsteamet och bidragsgivare har kommit överens om detta efter en del gnÀll. Emacs-lÀget som nÀmns ovan underlÀttar korrekt formatering om du anvÀnder editorn emacs.

Simulatorn ns-3 licensieras under GNU General Public License. Du kommer att se den relevanta juridiska rubriken för GNU i varje fil i ns-3:s distribution. Ofta kan du se en upplysning om upphovsrÀtt för en av de deltagande institutionerna i ns-3-projektet ovanför texten GPL och författaren som visas nedan.

/* 
* This program is free software; you can redistribute it and/or modify 
* it under the terms of the GNU General Public License version 2 as 
* published by the Free Software Foundation; 
*
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
* GNU General Public License for more details. 
* 
* You should have received a copy of the GNU General Public License 
* along with this program; if not, write to the Free Software 
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
*/

4.2.2 TillÀggsmoduler

Den faktiska koden börjar med en rad include-direktiv (include).

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"

För att hjÀlpa vÄra anvÀndare av hög nivÄ-skript att hantera det stora antalet header-filer som finns i systemet grupperar vi dem efter deras anvÀndning i stora moduler. Vi tillhandahÄller en header-fil som rekursivt kommer att ladda alla header-filer som anvÀnds i den aktuella modulen. IstÀllet för att söka efter vilken header du behöver och kanske fÄ rÀtt lista över beroenden ger vi dig möjlighet att ladda en grupp filer med hög detaljnivÄ. Det Àr kanske inte det mest effektiva tillvÀgagÄngssÀttet, men det gör definitivt skriptskrivning mycket enklare.

Varje inkluderad fil i ns‑3 placeras i en katalog med namnet ns3 (underkatalog för byggnation), för att undvika namnkonflikter under byggprocessen. Filen ns3/core-module.h motsvarar ns‑3-modulen som du kommer att hitta i katalogen src/core i den version du har installerat. I listningen av denna katalog hittar du ett stort antal header-filer. NĂ€r du gör byggnation Waf placeras de offentliga header-filerna i katalogen ns3 i underkatalogen build/debug

Om du inte har en sÄdan katalog har du inte angivit utmatningskatalogen vid kompileringen av releaseversionen av ns-3. Kör kompileringen sÄ hÀr:
$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
eller
$ ./waf configure --build-profile=optimized --out=build/optimized
$ ./waf build

eller build/optimized, beroende pÄ din konfiguration. Waf kommer ocksÄ automatiskt att generera en inkluderingsfil för modulen för att ladda alla offentliga header-filer. Eftersom du sjÀlvklart strikt följer denna guide har du redan utfört

$ ./waf -d debug --enable-examples --enable-tests configure

för att konfigurera projektet för att köra debug-byggnader som inkluderar exempel och tester. Du har ocksÄ utfört

$ .\/waf

för att bygga projektet. SÄ nu, nÀr du tittar i katalogen ../..../build/debug/ns3, sÄ kommer du dÀr, bland annat, att hitta header-filerna frÄn de fyra modulerna som nÀmns ovan. Du kan ta en titt pÄ innehÄllet i dessa filer och upptÀcka att de inkluderar alla offentliga filer som anvÀnds av de berörda modulerna.

4.2.3 Namnutrymme ns3

Den nÀsta raden i skriptet first.cc Àr deklarationen av namnutrymmet.

using namespace ns3;

Projektet ns‑3 Ă€r implementerat i ett C++-namnrymde som kallas ns3. Detta grupperar alla ns‑3-relaterade deklarationer inom en synlighet utanför det globala namnrymden, vilket vi hoppas kommer att underlĂ€tta integrationen med annan kod. AnvĂ€ndningen av C++-operatören införlivar namnrymden ns‑3 i det aktuella (globala) deklarativa omrĂ„det. Detta Ă€r ett snobbigt sĂ€tt att sĂ€ga att efter denna deklaration behöver du inte ange operatören ns3:: scope före all ns‑3-kod för att anvĂ€nda den. Om du inte Ă€r bekant med namnrymder, kolla pĂ„ nĂ€stan vilken C++-lĂ€robok som helst och jĂ€mför namnrymden ns3 med anvĂ€ndningen av namnrymden std och deklarationer. using namespace std; i exempel med utmatningsoperatören cout och strömmarna.

4.2.4 Loggning

NÀsta rad i skriptet Àr sÄ hÀr:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Vi kommer att anvĂ€nda detta pĂ„stĂ„ende som en bekvĂ€m plats för att diskutera vĂ„rt dokumentationssystem. DoxygenOm du tittar pĂ„ ns‑3-projektets webbplats hittar du en lĂ€nk till "Dokumentation" i navigeringspanelen. Om du vĂ€ljer denna lĂ€nk hamnar du pĂ„ vĂ„r dokumentationssida. Det finns en lĂ€nk till "Senaste utgĂ„van", som tar dig till dokumentationen för den senaste stabila versionen av ns‑3. Om du vĂ€ljer lĂ€nken "API Documentation" kommer du till ns‑3:s API-dokumentationssida.

Till vĂ€nster pĂ„ sidan finner du en grafisk representation av dokumentationsstrukturen. En bra plats att börja Ă€r "boken" Modules ns‑3 i ns‑3:s navigeringstrĂ€d. Om du expanderar Moduler, kommer du att se en lista över dokumentationen för ns‑3-moduler. Som diskuterats ovan Ă€r begreppet modul hĂ€r direkt kopplat till filerna som inkluderas i modulen ovan. Ns‑3:s loggningssystem diskuteras i avsnittet AnvĂ€ndning av loggningsmodulen, dĂ€rför kommer vi att Ă„terkomma till den senare i denna guide, men du kan lĂ€ra dig mer om det ovanstĂ„ende uttalandet genom att titta pĂ„ modulen Core, och sedan öppna boken Debugging tools, och sedan vĂ€lja sidan Logging. Klicka pĂ„ Logging.

Nu bör du granska dokumentationen Doxygen för modulen Logging. I listan över makron högst upp pĂ„ sidan ser du en post för NS_LOG_COMPONENT_DEFINE. Innan du följer lĂ€nken, se till att kolla pĂ„ "Detaljerad beskrivning" av loggmodulen för att förstĂ„ dess funktioner. För att göra detta kan du scrolla ner eller vĂ€lja "More
" under diagrammet.

NÀr du har en allmÀn förstÄelse av vad som pÄgÄr, gÄ vidare och se dokumentationen för specifika NS_LOG_COMPONENT_DEFINE. Jag kommer inte att duplicera dokumentationen hÀr, men för att sammanfatta kan jag sÀga att denna rad deklarerar en loggkomponent med namnet FirstScriptExample, som gör det möjligt att aktivera och deaktivira konsol-loggning av meddelanden via lÀnken till namnet.

4.2.5 Huvudfunktion

I de följande raderna av skriptet ser du,

int 
main (int argc, char *argv[])
{ 

Detta Àr bara en deklaration av huvudfunktionen i ditt program (skript). Precis som i varje C++-program mÄste du definiera huvudfunktionen, som körs först. HÀr Àr det inget speciellt. Ditt ns-3-skript Àr helt enkelt ett C++-program. NÀsta rad stÀller in tidupplösningen pÄ 1 nanosekund, vilket Àr standardvÀrdet:

Time::SetResolution (Time::NS);

Tidupplösning eller helt enkelt upplösning Àr det minsta tidsvÀrdet som kan anvÀndas (den minsta tÀnkbara skillnaden mellan tvÄ tidsvÀrden). Du kan Àndra upplösningen exakt en gÄng. Mekanismen som möjliggör denna flexibilitet förbrukar minne, sÄ nÀr upplösningen har stÀllts in explicit frigör vi minnet för att förhindra ytterligare uppdateringar. (Om du inte stÀller in upplösningen explicit kommer den som standard att vara en nanosekund, och minnet kommer att frigöras vid simuleringens början.)

De följande tvÄ raderna av skriptet anvÀnds för att aktivera tvÄ loggkomponenter som Àr inbyggda i applikationerna EchoClient och EchoServer:

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO); LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);

Om du har lÀst dokumentationen för komponenten Logging, har du sett att det finns flera nivÄer av loggning/detaljeringsgrad som du kan aktivera pÄ varje komponent. Dessa tvÄ rader kod inkluderar felsökning pÄ INFO-nivÄ för echo-klienter och servrar. PÄ denna nivÄ kommer applikationen att skriva ut meddelanden vid sÀndning och mottagning av paket under simuleringen.

Nu gÄr vi direkt till att skapa topologin och starta simuleringen. Vi kommer att anvÀnda topologiska hjÀlpare för att göra detta sÄ enkelt som möjligt.

4.2.6 AnvÀndning av topologiska hjÀlpmedel

De följande tvĂ„ raderna kod i vĂ„rt skript kommer faktiskt att skapa Node ns‑3-objekt som representerar datorer i simuleringen.

NodeContainer nodes;
nodes.Create (2);

Innan vi fortsĂ€tter, lĂ„t oss hitta dokumentationen för klassen NodeContainer. Ett annat sĂ€tt att komma Ă„t dokumentationen för denna klass Ă€r genom fliken Classes pĂ„ sidorna Doxygen. Om du redan har Doxygen öppet, blĂ€ddra bara upp till toppen av sidan och vĂ€lj fliken Classes. Du bör se en ny uppsĂ€ttning flikar, en av vilka Ă€r klasslistan. Under denna flik kommer du att se en lista över alla klasser ns‑3. BlĂ€ddra ner till ns3 :: NodeContainer. NĂ€r du hittar klassen, vĂ€lj den för att gĂ„ till dokumentationen för klassen.

Som vi minns, Ă€r en av vĂ„ra centrala abstraktioner en nod. Den representerar datorn som vi kommer att lĂ€gga till saker som protokollstackar, applikationer och grĂ€nssnittskort till. Den topologiska hjĂ€lpen NodeContainer ger ett bekvĂ€mt sĂ€tt att skapa, hantera och komma Ă„t alla objekt Node, som vi skapar för att köra simuleringen. Den första raden ovan deklarerar NodeContainer, som vi kallar nodes. Den andra raden anropar metoden Create för objektet nodes och ber containern att skapa tvĂ„ noder. Som beskrivet i Doxygen, ber containern systemet ns‑3 att skapa tvĂ„ objekt Node och lagrar pekare pĂ„ dessa objekt inuti sig.

De noder som skapades i skriptet gör fortfarande inget. NÀsta steg i att bygga topologin Àr att koppla vÄra noder till nÀtverket. Den enklaste formen av nÀtverk som vi stöder Àr en punkt-till-punkt-anslutning mellan tvÄ noder. Vi kommer nu att skapa en sÄdan koppling.

PointToPointHelper

Vi skapar en tvÄpunktsanslutning genom att anvÀnda en bekant mall och en topologisk hjÀlpare för att utföra det lÄgnivÄarbete som krÀvs för anslutningen. Vi pÄminner om att vÄra tvÄ nyckelabstraktioner NetDevice och Channel. I den verkliga vÀrlden motsvarar dessa termer ungefÀr perifera kort och nÀtverkskablar. Som regel Àr dessa tvÄ saker nÀra kopplade till varandra, och ingen kan förlita sig pÄ att byta, till exempel, enheter Ethernet via en trÄdlös kanal. VÄra topologiska hjÀlpare följer denna nÀra koppling och dÀrför kommer du i detta scenario att anvÀnda ett objekt PointToPointHelper för att konfigurera och ansluta ns-3 objekt PointToPointNetDevice och PointToPointChannel. De följande tre raderna i scenariot:

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

Den första raden,

PointToPointHelper pointToPoint;

skapar en instans av objektet i stacken. PointToPointHelperSett ur ett högre perspektiv sÀger nÀsta rad,

pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));

att objektet PointToPointHelper ska anvÀnda vÀrdet "5 Mbps" (fem megabit per sekund) som "DataRate».

Sett ur ett mer specifikt perspektiv motsvarar raden "DataRate" det som vi kallar en attribut. PointToPointNetDevice. Om du ser pÄ Doxygen för klassen ns3::PointToPointNetDevice och i dokumentationen för metoden GetTypeId kommer du att hitta en lista med attribut som definieras för enheten. Bland dessa kommer det att finnas attributet "DataRate". De flesta anvÀndarobjekt i ns-3 har liknande listor av attribut. Vi anvÀnder denna mekanism för enkel konfiguration av simuleringen utan omkompilering, som du kommer att se i nÀsta avsnitt.

PÄ liknande sÀtt som "DataRate" i PointToPointNetDevice, hittar du attributet "Delay" kopplat till PointToPointChannel. Den slutliga raden,

pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

sÀger PointToPointHelper anvÀnder vÀrdet "2 ms" (tvÄ millisekunder) som vÀrde för fördröjningen av signalen genom den punkt-till-punktkanalen som den senare skapar.

NetDeviceContainer

Hittills har vi i scenariot NodeContainer, som innehÄller tvÄ noder. Vi har PointToPointHelper, som Àr redo att skapa objekt PointToPointNetDevices och ansluta dem med hjÀlp av objektet PointToPointChannel. PÄ samma sÀtt som vi anvÀnde en topologisk hjÀlpare NodeContainer för att skapa noder, kommer vi att be PointToPointHelper att utföra det arbete som rör skapandet, konfigurationen och installationen av vÄra enheter. Vi kommer att behöva en lista över alla skapade objekt. NetDevice, dÀrför anvÀnder vi NetDeviceContainer för deras lagring precis som vi anvÀnde NodeContainer för att lagra de noder vi har skapat. De följande tvÄ kodraderna,

NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);

slutför instÀllningen av enheter och kanalen. Den första raden deklarerar enhetens behÄllare, nÀmnd ovan, och den andra gör det huvudsakliga arbetet. Metoden Installera anlÀggningen. PointToPointHelper accepterar NodeContainer som parameter. Inuti NetDeviceContainer för varje nod som finns i NodeContainer skapas (för punkt-till-punkt-kopplingar mÄste det finnas exakt tvÄ) PointToPointNetDevice skapas och lagras i enhetsbehÄllaren. PointToPointChannel skapas, och tvÄ PointToPointNetDevices. Efter skapandet av objekten anvÀnds attributen som lagrades i PointToPointHelper, för att initiera motsvarande attribut i de skapade objekten.

Efter anropet av pointToPoint.Install (nodes) kommer vi att ha tvÄ noder, var och en med en installerad "punkt-till-punkt" nÀtverksenhet och en "punkt-till-punkt" kanal mellan dem. BÄda enheterna kommer att konfigureras för att överföra data med en hastighet av fem megabit per sekund med en överföringsfördröjning pÄ tvÄ millisekunder.

InternetStackHelper

Nu har vi konfigurerat noder och enheter, men vÄra noder saknar protokollstackar. De följande tvÄ kodraderna kommer att ta hand om detta.

InternetStackHelper stack;
stack.Install (nodes);

InternetStackHelper Àr en topologihjÀlpare för internetstackar, liknande PointToPointHelper för punkt-till-punkt nÀtverksenheter. Metoden Installera tar en NodeContainer som parameter. NÀr den körs kommer den att installera internetstacken (TCP, UDP, IP etc.) pÄ varje nod i behÄllaren.

Ipv4AddressHelper

Sedan behöver vi koppla vÄra enheter till IP-adresser. Vi tillhandahÄller en topologihjÀlpare för hantering av distributionen av IP-adresser. Den enda anvÀndarbar API:n synlig för anvÀndaren Àr att stÀlla in en grundlÀggande IP-adress och nÀtmask för anvÀndning vid utförandet av den faktiska adresstilldelningen (detta görs pÄ en lÀgre nivÄ inuti hjÀlparen). De följande tvÄ kodraderna i vÄrt exempel skript first.cc,

Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");

deklarerar ett hjÀlpbjekt för adresser och berÀttar för det att det ska börja tilldela IP-adresser frÄn nÀtverket 10.1.1.0, med hjÀlp av en nÀtmask pÄ 255.255.255.0 för att avgöra detta. Som standard kommer tilldelade adresser att börja med ett och öka monotoniskt, sÄ den första adressen som tilldelas frÄn denna bas blir 10.1.1.1, följt av 10.1.1.2 och sÄ vidare. I verkligheten hÄller systemet ns-3 vid lÄgnivÄ koll pÄ alla tilldelade IP-adresser och genererar ett fatalt fel om du av misstag skapar en situation dÀr samma adress genereras tvÄ gÄnger (för övrigt Àr detta fel svÄrt att debugga).

Följande kodrad,

Ipv4InterfaceContainer interfaces = address.Assign (devices);

utför den faktiska adressallokeringen. I ns-3 upprÀttar vi en koppling mellan IP-adressen och enheten genom att anvÀnda objektet Ipv4Interface. Precis som vi ibland behöver en lista över nÀtverksenheter skapade av hjÀlparen för senare anvÀndning, behöver vi ibland en lista över objekt. Ipv4Interface. Ipv4InterfaceContainer erbjuder denna funktionalitet.

Vi har byggt ett punkt-till-punkt-nÀtverk, med installerade stackar och tilldelade IP-adresser. Nu behöver vi tillÀmpningar i varje nod för att generera trafik.

4.2.7 AnvÀndning av Applikation

En annan av de grundlÀggande abstraktionerna i systemet ns-3 Àr Application (applikation). I detta scenario anvÀnder vi tvÄ specialiseringar av basklassen Application ns-3 som heter UdpEchoServerApplication och UdpEchoClientApplication. Som i de tidigare fallen anvÀnder vi hjÀlpbjekt för att konfigurera och hantera basobjekten. HÀr anvÀnder vi UdpEchoServerHelper och UdpEchoClientHelperobjekt för att göra vÄrt liv enklare.

UdpEchoServerHelper

Följande kodrader i vÄrt exempel skript first.cc anvÀnds för att konfigurera en UDP-eko serverapplikation pÄ en av noderna som vi skapade tidigare.

UdpEchoServerHelper echoServer (9);

ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));

Den första kodraden i den angivna koden skapar UdpEchoServerHelper. Precis som vanligt Àr detta inte en applikation i sig, utan ett objekt som hjÀlper oss att skapa verkliga applikationer. En av vÄra överenskommelser Àr att överlÀmna nödvÀndiga attribut till konstruktorn för hjÀlpobjektet. I det hÀr fallet kan hjÀlpen inte göra nÄgot anvÀndbart om den inte fÄr portnumret som servern kommer att vÀnta pÄ paket, detta nummer mÄste ocksÄ vara kÀnt för klienten. I detta fall överlÀmnar vi portnumret till konstruktorn för hjÀlpen. Konstruktorn utför i sin tur bara SetAttribute med det överlÀmnade vÀrdet. Senare, om sÄ önskas, kan du med hjÀlp av SetAttribute stÀlla in ett annat vÀrde för attributet "Port".

Liksom mÄnga andra hjÀlpapparater har objektet UdpEchoServerHelper en metod Installera. Att utföra denna metod leder faktiskt till att en grundlÀggande echo-serverapplikation skapas och kopplas till noden. Intressant nog har metoden Installera accepterar NodeContainter ett parameterliknande andra Installera metoder som vi har sett.

Den implicita omvandlingen i C++, som fungerar hĂ€r, tar resultatet frĂ„n metoden node.Get (1) (som returnerar en smart pekare pĂ„ nodobjektet — Ptr) och anvĂ€nder den i konstruktorn för det anonyma objektet NodeContainer, som sedan överlĂ€mnas till metoden Installera. Om du inte kan identifiera i C++-koden vilken metod med vilken signatur som kompileras och körs, bör du titta bland de implicita omvandlingarna.

Nu ser vi att echoServer.Install planerar att installera applikationen UdpEchoServerApplication pÄ den som hittades i NodeContainer, som vi anvÀnder för att hantera vÄra noder, noden med index 1. Metoden Installera Äterkommer med en behÄllare som innehÄller pekare till alla applikationer (i detta fall en, eftersom vi överlÀmnade en anonym NodeContainer, som innehÄller en nod) skapad av hjÀlpen.

Applikationerna mĂ„ste ange nĂ€r trafikgenereringen ska starta "start" och kan behöva ytterligare ange tiden dĂ„ den ska stoppas "stop". Vi tillhandahĂ„ller bĂ„da parametrarna. Dessa tider stĂ€lls in med hjĂ€lp av metoderna ApplicationContainer Start och Stoppa. Dessa metoder tar parameter av typen Tid. I detta fall anvĂ€nder vi explicita C++-omvandlingar för att ta en C++ double 1.0 och konvertera det till objektet tns‑3 Time, som anvĂ€nder objektet Seconds för att konvertera till sekunder. Kom ihĂ„g att omvandlingsreglerna kan kontrolleras av modellens skapare, och C++ har sina egna regler, sĂ„ du kan inte alltid lita pĂ„ att parametrarna omvandlas som du förvĂ€ntade dig. TvĂ„ rader,

serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));

kommer att leda till att echoserverapplikationen startar (aktiveras automatiskt) efter en sekund frÄn simuleringens början och stoppar (avaktiveras) efter tio sekunder av simuleringen. Eftersom vi har deklarerat en simuleringshÀndelse (applikationsstoppande hÀndelse) som kommer att genomföras efter tio sekunder, sÄ kommer nÀtverksdriften att simuleras under minst tio sekunder.

UdpEchoClientHelper

Klientapplikationen echo konfigureras pÄ ett sÀtt som praktiskt taget liknar servern. Det finns ett grundlÀggande objekt UdpEchoClientApplication, som hanteras av
UdpEchoClientHelper.

UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));;

Men för echoklienten behöver vi stÀlla in fem olika attribut. De första tvÄ attributen stÀlls in vid skapandet UdpEchoClientHelper. Vi överför parametrarna som anvÀnds (inuti hjÀlparen) för att stÀlla in attributen "RemoteAddress" och "RemotePort" i enlighet med vÄr överenskommelse om att överföra de nödvÀndiga parametrarna till hjÀlparens konstruktor.

Vi pÄminner om att vi anvÀnde Ipv4InterfaceContainer för att spÄra IP-adresserna som vi har tilldelat vÄra enheter. NollgrÀnssnittet i grÀnssnittskontainern kommer att motsvara IP-adressen för nollnoden i nodkontainern. Första grÀnssnittet i grÀnssnittskontainern motsvarar IP-adressen för första noden i nodkontainern. SÄ, i den första raden av koden (överst) skapar vi hjÀlparen och informerar den om att klientens fjÀrradress kommer att vara IP-adressen som tilldelats noden dÀr servern finns. Vi sÀger ocksÄ att paket mÄste skickas till nionde porten.

Attributet „MaxPackets“ informerar klienten om det maximala antalet paket som vi kan skicka under simuleringen. Attributet „Interval“ meddelar klienten hur lĂ€nge man ska vĂ€nta mellan paketen, och attributet „PacketSize“ informerar klienten om hur stora paketets nyttolast ska vara. Med denna kombination av attribut ber vi klienten att skicka ett 1024-byte paket.

Som med echoservern sÀtter vi ocksÄ attributen för ekoch klienten Start och Stoppa, men hÀr startar vi klienten en sekund efter servern aktiveras (tvÄ sekunder efter att simuleringen har börjat).

4.2.8 Simulator

Vid detta steg behöver vi starta simuleringen. Detta görs med hjÀlp av den globala funktionen Simulator::Run.

Simulator::Run ();

NĂ€r vi tidigare anropade metoder,

serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
... 
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));

har vi faktiskt schemalagt evenemang i simuleringen pĂ„ 1,0 sekunder, 2,0 sekunder och tvĂ„ evenemang pĂ„ 10,0 sekunder. Efter anropet Simulator::Run, kommer systemet att börja gĂ„ igenom listan över schemalagda evenemang och utföra dem. Först kommer det att starta evenemanget efter 1,0 sekunder, vilket aktiverar echoserverapplikationen (detta evenemang kan i sin tur schemalĂ€gga mĂ„nga andra evenemang). Sedan kommer det att starta evenemanget som Ă€r schemalagt för t = 2,0 sekunder, vilket startar ekoch klientapplikationen. Återigen kan detta evenemang schemalĂ€gga mĂ„nga andra evenemang. Genomförandet av start-evenemanget i ekoch klienten kommer att pĂ„börja datatransfersteget för simuleringen genom att skicka ett paket till servern.

Skickandet av paketet till servern kommer att aktivera en kedja av evenemang som automatiskt kommer att schemalÀggas i bakgrunden och som kommer att implementera mekaniken för att skicka echosignals paket i enlighet med de synkroniseringsparametrar som vi har stÀllt in i scenariot.

Som en följd av detta, eftersom vi bara skickar ett paket (kom ihÄg att attributet MaxPackets var instÀllt pÄ ett), kommer kedjan av evenemang som initierades av denna enda klient-echo-förfrÄgan att avslutas, och simuleringen kommer att gÄ in i vÀntelÀge. NÀr detta sker kommer de ÄterstÄende schemalagda evenemangen att vara evenemang Stoppa för servern och klienten. NÀr dessa evenemang har genomförts finns det inga evenemang kvar för vidare behandling och Simulator::Run tillbaka kontrollen. Simuleringen Àr avslutad.

Det Ă€r bara att stĂ€da upp efter sig. Detta görs genom att anropa den globala funktionen Simulator::DestroyEftersom hjĂ€lpfunktioner (eller lĂ„gnivĂ„kod för ns-3) anropades, organiserade de sig sĂ„ att hookar för att förstöra alla skapade objekt skulle sĂ€ttas in i simulatorn. Du behöver inte spĂ„ra nĂ„got av dessa objekt sjĂ€lv – allt du behövde göra var att anropa Simulator::Destroy och avsluta. Systemet ns-3 kommer att göra det hĂ€r tunga arbetet Ă„t dig. De Ă„terstĂ„ende raderna i vĂ„r första ns-3-skript, first.cc, gör just detta:

Simulator::Destroy ();
return 0;
}

NĂ€r stoppas simulatorn?

ns-3 Àr en simulering av diskreta hÀndelser (DE). I en sÄdan simulator Àr varje hÀndelse kopplad till tidpunkten för dess utförande, och simuleringen fortsÀtter genom att bearbeta hÀndelser i den ordning de intrÀffar under simuleringens gÄng. HÀndelser kan leda till att framtida hÀndelser planeras (till exempel kan en timer omplanera sig sjÀlv för att avsluta en nedrÀkning under nÀsta intervall).

Inledande hÀndelser initieras vanligtvis av ett objekt, till exempel kommer IPv6 att planera upptÀckten av tjÀnster i nÀtverket, grannförfrÄgningar etc. Applikationen planerar den första hÀndelsen för paketutsÀndning etc. NÀr en hÀndelse bearbetas kan den generera noll, en eller flera hÀndelser. Allteftersom simuleringen fortgÄr intrÀffar hÀndelser, antingen avslutas de eller generar nya. Simuleringen kommer automatiskt att stoppa om hÀndelsekön Àr tom eller ett speciellt hÀndelse upptÀckts. StoppaEn hÀndelse Stoppa genereras av funktionen Simulator::Stop (stoppa tiden).

Det finns ett typiskt fall dÀr Simulator::Stop Àr absolut nödvÀndigt för att stoppa simuleringen: nÀr det finns sjÀlvupprepande hÀndelser. SjÀlvupprepande (eller Äterkommande) hÀndelser Àr sÄdana hÀndelser som alltid omplaneras. Som ett resultat hÄller de alltid hÀndelsekön inte tom. Det finns mÄnga protokoll och moduler som innehÄller Äterkommande hÀndelser, sÄsom:

‱ FlowMonitor – periodisk kontroll av förlorade paket;

‱ RIPng – periodisk sĂ€ndning av uppdateringar av routingtabeller;

‱ osv.

I sÄdana fall Simulator::Stop Àr nödvÀndig för att korrekt stoppa simuleringen. Dessutom, nÀr ns-3 Àr i emuleringslÀge, anvÀnds RealtimeSimulator för att synkronisera simuleringens klocka med maskinens klocka, och Simulator::Stop Àr nödvÀndig för att stoppa processen.

MÄnga av simuleringsprogrammen i lÀroboken anropar inte Simulator::Stop Det Àr uppenbart, eftersom de avslutas automatiskt nÀr hÀndelserna i kön Àr slut. Men dessa program kommer ocksÄ att ta emot anropet Simulator::Stop. Till exempel, följande extra rad i det första programmet schemalÀgger en uttrycklig stoppning vid sekund 11:

+ Simulator::Stop (Seconds (11.0));
  Simulator::Run ();
  Simulator::Destroy ();
  return 0;
}

Det ovanstÄende kommer faktiskt inte att Àndra programmet, eftersom denna specifika simulering naturligtvis avslutas efter 10 sekunder. Men om du Àndrade stopp-tiden i den angivna raden ovan frÄn 11 sekunder till 1 sekund, skulle du mÀrka att simuleringen stoppar innan nÄgon utmatning nÄr skÀrmen (eftersom utmatningen sker ungefÀr efter 2 sekunders simuleringstid).

Det Àr viktigt att anropa Simulator::Stop innan du anropar Simulator::Run; annars kan Simulator::Run aldrig Äterge kontrollen till huvudprogrammet för att utföra stoppet!

4.2.9 Bygga ditt scenario

Vi har gjort skapandet av dina enkla skript trivialt. Allt du behöver göra Àr att placera ditt skript i scratch-katalogen, sÄ kommer det att kompileras automatiskt nÀr du kör Waf. LÄt oss prova. GÄ tillbaka till rotkatalogen och kopiera examples/tutorial/first.cc i katalogen scratch

$ cd ../..
$ cp examples/tutorial/first.cc scratch/myfirst.cc

Nu ska du kompilera ditt första exempel pÄ skript med waf:

$ .\/waf

Du bör se meddelanden om att ditt första exempel har skapats framgÄngsrikt.

Waf: GÄr in i katalogen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
[614/708] cxx: scratch/myfirst.cc -> build/debug/scratch/myfirst_3.o
[706/708] cxx_link: build/debug/scratch/myfirst_3.o -> build/debug/scratch/myfirst
Waf: LĂ€mnar katalogen `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' avslutades framgÄngsrikt (2.357s)

Nu kan du köra exemplet (observera att om du kompilerar ditt program i scratch-katalogen, sÄ mÄste du ocksÄ köra det frÄn scratch):

$ ./waf --run scratch/myfirst

Du bör se en liknande utmatning:

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

HÀr ser du att byggsystemet kontrollerar att filen har byggts och sedan kör den. Du ser att en komponentpost pÄ echo-klienten indikerar att den har skickat en 1024-byte paket till echo-servern 10.1.1.2. Du kan ocksÄ se komponenten för loggning pÄ echo-servern som visar att den fick 1024 byte frÄn 10.1.1.1. Echo-servern skickar tyst tillbaka paketet, och du ser i loggen pÄ echo-klienten att den fÄtt sitt paket tillbaka frÄn servern.

4.3 ns-3 KĂ€llkod

Nu nÀr du har anvÀnt nÄgra av ns-3:s hjÀlpverktyg kan du ta en titt pÄ nÄgra av kÀllkoderna som implementerar denna funktionalitet. Den senaste koden kan ses pÄ vÄr webbserver via följande lÀnk: https://gitlab.com/nsnam/ns-3-dev.git. DÀr kommer du att se en sammanfattande sida i Mercurial för vÄrt ns-3 utvecklingstrÀd. I toppen av sidan ser du nÄgra lÀnkar:

summary | shortlog | changelog | graph | tags | files

FortsÀtt och vÀlj lÀnken till filerna. SÄ hÀr ser det översta nivÄn ut i de flesta av vÄra förrÄd:

drwxr-xr-x                               [up]
drwxr-xr-x                               bindings python  files
drwxr-xr-x                               doc              files
drwxr-xr-x                               examples         files
drwxr-xr-x                               ns3              files
drwxr-xr-x                               scratch          files
drwxr-xr-x                               src              files
drwxr-xr-x                               utils            files
-rw-r--r-- 2009-07-01 12:47 +0200 560    .hgignore        file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 1886   .hgtags          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 1276   AUTHORS          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 30961  CHANGES.html     file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 17987  LICENSE          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 3742   README           file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 16171  RELEASE_NOTES    file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 6      VERSION          file | revisions | annotate
-rwxr-xr-x 2009-07-01 12:47 +0200 88110  waf              file | revisions | annotate
-rwxr-xr-x 2009-07-01 12:47 +0200 28     waf.bat          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 35395  wscript          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 7673   wutils.py        file | revisions | annotate

VĂ„ra exempel pĂ„ skript finns i katalogen examples. Om du klickar pĂ„ exempel, kommer du att se en lista över underkataloger. En av filerna i underkatalogen tutorial — first.cc. Om du klickar pĂ„ first.cc ser du koden som du just har studerat.

KĂ€llkoden finns huvudsakligen i katalogen src. Du kan visa koden genom att klicka pĂ„ katalognamnet eller genom att klicka pĂ„ lĂ€nken "filer" till höger om katalognamnet. Om du klickar pĂ„ katalogen src fĂ„r du en lista över underkataloger i src. Om du sedan klickar pĂ„ underkatalogen core hittar du en lista över filer. Den första filen du ser (vid skrivandet av denna guide) — abort.h. Om du klickar pĂ„ lĂ€nken abort.h, kommer du att skickas till kĂ€llfilen för abort.h, som innehĂ„ller anvĂ€ndbara makron för att avsluta skript om onormala tillstĂ„nd upptĂ€cks. Koden för hjĂ€lparna som vi anvĂ€nde i detta kapitel finns i katalogen src/Applications/helper. Tveka inte att grĂ€va i katalogtrĂ€det för att förstĂ„ vad som finns och för att fĂ„ en kĂ€nsla för ns‑3:s programmeringsstil.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster