ns-3 nethermir kennsla. 4. kafli

ns-3 nethermir kennsla. 4. kafli
kafli 1,2
kafli 3

4 Yfirlit yfir hugtak
4.1 Lykilútdrættir
4.1.1 Hnútur
4.1.2 Umsókn
4.1.3 Rás
4.1.4 Nettæki
4.1.5 Staðfræðilegir aðstoðarmenn
4.2 Fyrsta ns-3 handritið
4.2.1 Boilerplate kóða
4.2.2 Viðbætur
4.2.3 ns3 nafnrými
4.2.4 Skráning
4.2.5 Aðalhlutverk
4.2.6 Notkun staðfræðiaðstoðarmanna
4.2.7 Notkun forrits
4.2.8 Hermir
4.2.9 Byggja upp handritið þitt
4.3 ns-3 Frumkóði

4 kafli

Yfirlit yfir hugtak

Það fyrsta sem við þurfum að gera áður en við byrjum að læra eða skrifa ns-3 kóða er að útskýra nokkur grunnhugtök og ágrip í kerfinu. Margt af þessu kann að virðast augljóst fyrir suma, en við mælum með að gefa þér tíma til að lesa þennan kafla til að tryggja að þú byrjir á traustum grunni.

4.1 Lykilútdrættir

Í þessum hluta munum við skoða nokkur hugtök sem eru almennt notuð á vefnum en hafa sérstaka merkingu í ns-3.

4.1.1 Hnútur

Í hrognamáli á netinu er tölvutæki sem tengist netkerfi kallað hýsil eða stundum endakerfi. Þar sem ns-3 er nethermir en ekki nethermir notum við vísvitandi hugtakið hýsingaraðili, þar sem þetta er nátengt internetinu og samskiptareglum þess. Þess í stað notum við almennara hugtak, einnig notað af öðrum hermum, sem á uppruna sinn í línuritafræði: hnútur (hnút).

Í ns-3 er undirliggjandi útdráttur tölvubúnaðar kallaður hnútur. Þessi útdráttur er táknaður í C++ með Node bekknum. bekk NodeNode (hnútur) veitir aðferðir til að vinna með framsetningu á tölvutækjum í uppgerðum.

Þú verður að skilja Hnút eins og tölvu sem þú bætir virkni við. Þú munt bæta við hlutum eins og forritum, samskiptareglum og jaðarkortum með reklum sem gera tölvunni kleift að vinna gagnlega vinnu. Við notum sama grunnlíkanið í ns-3.

4.1.2 Umsókn

Almennt er tölvuhugbúnaður skipt í tvo breiða flokka. Kerfishugbúnaður skipuleggur ýmsar tölvuauðlindir eins og minni, hringrás örgjörva, disk, netkerfi o.s.frv. samkvæmt einhverju tölvulíkani. Kerfishugbúnaður notar venjulega ekki þessi úrræði til að framkvæma verkefni sem gagnast notandanum beint. Notandi keyrir venjulega forrit til að ná ákveðnu markmiði, sem aflar og notar auðlindir sem stjórnað er af kerfishugbúnaðinum.

Oft er skilin á milli kerfis og forritshugbúnaðar dregin við breytingar á forréttindastigi sem eiga sér stað í stýrikerfisgildrum. ns-3 hefur enga raunverulega hugmynd um stýrikerfi og því engin hugmynd um forréttindastig eða kerfiskall. Við erum hins vegar með hugmynd að appi. Rétt eins og í „raunverulegum heimi“ hugbúnaðarforrit keyra á tölvum til að framkvæma verkefni, keyra ns-3 forrit á ns-3 hnútum til að stjórna eftirlíkingum í hermaheiminum.

Í ns-3 er grunnútdráttur fyrir notendaforrit sem býr til einhverja virkni fyrir líkanagerð forrit. Þessi útdráttur er táknaður í C++ með umsóknarflokknum. Forritaflokkurinn býður upp á aðferðir til að meðhöndla skoðanir á útgáfu okkar af forritum á notendastigi í uppgerðum. Gert er ráð fyrir að hönnuðir sérhæfi forritaflokkinn í hlutbundinni forritunarskilningi til að búa til ný forrit. Í þessari kennslu munum við nota sérhæfingar í forritaflokknum sem kallast UdpEchoClientApplication и UdpEchoServerApplication. Eins og þú gætir búist við, mynda þessi forrit sett af biðlara/miðlaraforritum sem notuð eru til að búa til og bergmála netpakka.

4.1.3 Rás

Í hinum raunverulega heimi er hægt að tengja tölvu við net. Oft er miðillinn sem gögn eru send yfir í þessum netum kallaðir rásir. Þegar þú tengir Ethernet snúru í innstungu ertu að tengja tölvuna við Ethernet tengil. Í herma ns-3 heiminum er hnút tengdur við hlut sem táknar samskiptarás. Hér er grunnútdráttur samskiptaundirnetsins kölluð rás og er táknuð í C++ með Channel bekknum.

Class RásRás veitir aðferðir til að stjórna samspili undirnetshluta og tengja hnúta við þá. Rásir geta einnig verið sérhæfðar af forriturum í hlutbundinni forritun. Sérhæfing rásar getur líkan eitthvað eins einfalt og vír. Sérstök rás getur líka líkan flókna hluti eins og stóran Ethernet-rofa eða þrívítt rými fullt af hindrunum ef um þráðlaus netkerfi er að ræða.

Við munum nota sérhæfðar útgáfur af rásinni í þessari kennslu sem heitir CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel и WifiChannelWifiChannel. CsmaChannel, til dæmis, líkir útgáfu af samskiptaundirneti sem útfærir margþætt fjarskiptaumhverfi með skynjun flutningsaðila. Þetta gefur okkur Ethernet-eins og virkni.

4.1.4 Nettæki

Það var áður fyrr að ef þú vildir tengja tölvu við net, þá þurfti að kaupa sérstaka netsnúru og vélbúnað sem kallast (í tölvuhugtökum) jaðarkort sem þurfti að setja í tölvuna. Ef jaðarkort innleiddi einhverjar netaðgerðir voru þær kölluð netviðmótskort eða netkort. Í dag eru flestar tölvur með samþættan netviðmótsbúnað og er ekki litið á notendur sem aðskilin tæki.

Netkort virkar ekki án hugbúnaðarrekla sem stjórnar vélbúnaði þess. Í Unix (eða Linux) er jaðarbúnaður flokkaður sem tæki. Tæki eru stjórnað með tækjarekla og nettækjum (NIC) er stjórnað með nettækjarekla (Rekla fyrir nettæki) og eru sameiginlega kölluð nettæki (net tæki). Í Unix og Linux vísarðu til nettækja með nöfnum eins og eth0.

Í ns-3 nær útdráttur netbúnaðar yfir bæði hugbúnaðardrifinn og vélbúnaðinn sem verið er að móta. Í uppgerðinni er nettæki "sett upp" í hnút til að leyfa því að eiga samskipti við aðra hnúta í gegnum rásir. Rétt eins og alvöru tölva er hægt að tengja hnút við margar rásir í gegnum mörg tæki NetTæki.

Netútdráttur tækis er táknaður í C++ með bekknum NetTæki. bekk NetTæki veitir aðferðir til að stjórna tengingum við hnút og rásarhluti; og geta verið sérhæfðir af forriturum í skilningi hlutbundinnar forritunar. Í þessari kennslu munum við nota nokkrar sérhæfðar útgáfur af NetDevice sem kallast CsmaNetDevice, PointToPointNetDevice и WifiNetDevice. Rétt eins og Ethernet net millistykki er hannað til að vinna með neti Ethernet, CsmaNetDevice hannað til að vinna með CsmaChannel, PointToPointNetDevice hannað til að vinna með PointToPointChannelOg WifiNetDevice - hannað til að vinna með WifiChannel.

4.1.5 Staðfræðilegir aðstoðarmenn

Í raunverulegu neti finnurðu hýsingartölvur með netkortum bætt við (eða innbyggð). Í ns-3 myndum við segja að þú munt sjá hnúta með NetDevices tengdum. Í stóru hermakerfi þarftu að skipuleggja tengingar á milli margra hluta Hnút, NetTæki и Sund.

Frá því að tengja NetDevices við hnúta, NetDevices við tengla, úthluta IP tölum osfrv. í ns-3 eru algengt verkefni, til að gera þetta eins auðvelt og hægt er útvegum við svokallaða staðfræðihjálp. Til dæmis, til að búa til NetDevice, þarftu að framkvæma margar ns-3 kjarnaaðgerðir, bæta við MAC vistfangi, setja upp nettækið í Node, stilla samskiptareglur hnútsins og tengja síðan NetDevice við rásina. Enn meiri vinna mun þurfa að tengja mörg tæki við fjölpunktstengla og tengja síðan einstök net við Internetworks net. Við útvegum staðfræðihjálparhluti sem sameina þessar fjölmörgu aðgerðir í auðvelt í notkun fyrir þínar þægindi.

4.2 Fyrsta ns-3 handritið

Ef þú settir upp kerfið eins og lagt er til hér að ofan muntu hafa ns-3 útgáfuna í möppu sem heitir repos í heimaskránni þinni. Farðu í möppu gefa út

Ef þú ert ekki með slíka möppu þýðir það að þú tilgreindir ekki úttaksskrána þegar þú byggðir útgáfuútgáfuna af ns-3, byggðu svona:
$ ./waf configure —build-profile=sleppa —out=byggja/sleppa,
$ ./waf byggingu

þar ættir þú að sjá möppuskipulag svipað og eftirfarandi:

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

Farðu í möppu dæmi/kennsla. Þú ættir að sjá skrá staðsett þar sem heitir fyrst.cc. Þetta er forskrift sem mun búa til einfalda punkt-til-punkt tengingu milli tveggja hnúta og senda einn pakka á milli hnútanna. Við skulum skoða þetta handrit línu fyrir línu; til að gera þetta skaltu opna first.cc í uppáhalds ritlinum þínum.

4.2.1 Boilerplate kóða
Fyrsta línan í skránni er ritstjórahamlínan emacs. Það segir emacs um sniðsvenjur (kóðun stíl) sem við notum í frumkóðanum okkar.

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

Þetta er alltaf nokkuð umdeilt mál, þannig að við þurfum að setja metið beint til að koma því úr vegi strax. ns-3 verkefnið, eins og flest stór verkefni, hefur tekið upp kóðunarstíl sem allur innlagður kóði verður að vera í samræmi við. Ef þú vilt leggja kóðann þinn til verkefnisins verður þú að lokum að samræmast ns-3 kóðunarstaðlinum, eins og lýst er í skránni doc/codingstd.txt eða sýnt á vefsíðu verkefnisins: https://www.nsnam.org/develop/contributing-code/coding-style/.

Við mælum með því að þú venjir þig á útlit ns-3 kóðans og notir þennan staðal hvenær sem þú vinnur með kóðann okkar. Allt þróunarteymið og þátttakendur samþykktu þetta eftir nokkurt nöldur. Emacs hamlínan hér að ofan gerir það auðvelt að forsníða rétt ef þú ert að nota emacs ritilinn.

ns-3 hermir hefur leyfi til að nota GNU General Public License. Þú munt sjá viðeigandi GNU lagalegan haus í hverri ns-3 dreifingarskrá. Oft sérðu höfundarréttartilkynningu fyrir eina af þeim stofnunum sem taka þátt í ns-3 verkefninu fyrir ofan GPL textann og höfundinn, sýndur hér að neðan.

/* 
* 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 Viðbætur

Kóðinn sjálfur byrjar á röð af yfirlýsingum um skráningu (fela).

#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"

Til að hjálpa notendum okkar með forskriftarforskriftir á háu stigi að takast á við fjölda hausskráa sem eru til staðar í kerfinu, flokkum við þær eftir notkun þeirra í stórar einingar. Við bjóðum upp á eina hausskrá sem mun endurtekið hlaða allar hausskrár sem notaðar eru í tiltekinni einingu. Í stað þess að þurfa að leita að nákvæmlega hvaða haus þú þarft og hugsanlega fá réttan lista yfir ósjálfstæði, gefum við þér möguleika á að hlaða niður hópi skráa í mikilli nákvæmni. Þetta er ekki skilvirkasta aðferðin, en hún auðveldar vissulega að skrifa handrit.

Hver af ns-3 include skránum er sett í möppu sem heitir ns3 (byggja undirskrá) til að koma í veg fyrir skráarnafnaárekstra meðan á smíðaferlinu stendur. Skrá ns3/core-module.h samsvarar ns-3 einingunni, sem þú finnur í möppunni src/kjarna í útgáfunni sem þú settir upp. Í skráningu þessarar möppu finnur þú mikinn fjölda hausskráa. Þegar þú gerir samsetninguna, Waf setur opinberar hausskrár í ns3 möppuna í undirmöppu byggja/kemba

Ef þú ert ekki með slíka möppu þýðir það að þú tilgreindir ekki úttaksskrána þegar þú byggðir útgáfuútgáfuna af ns-3, byggðu svona:
$ ./waf configure --build-profile=bug --out=build/bug
$ ./waf byggingu
eða
$ ./waf configure --build-profile=bjartsýni --out=byggt/bjartsýni
$ ./waf byggingu

eða byggja/bjartsýni, allt eftir stillingum þínum. Waf mun einnig sjálfkrafa búa til einingu með skrá til að hlaða öllum almennum hausskrám. Þar sem þú ert að sjálfsögðu að fylgja þessari handbók af trúarbrögðum, hefur þú nú þegar gert það

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

að stilla verkefnið til að keyra villuleit sem innihalda dæmi og próf. Þú gerðir það líka

$ ./waf

að setja saman verkefnið. Svo núna þegar þú lítur í möppuna ../../build/debug/ns3, þá finnur þú meðal annars hausskrár einingar fjögurra sem sýndar eru hér að ofan. Þú getur skoðað innihald þessara skráa og komist að því að þær innihalda allar opinberu skrárnar sem samsvarandi einingar nota.

4.2.3 ns3 nafnrými

Næsta lína í handriti fyrst.cc er nafnrýmisyfirlýsing.

using namespace ns3;

ns-3 verkefnið er útfært í C++ nafnrými sem kallast ns3. Þetta flokkar allar ns-3 tengdar yfirlýsingar í umfang utan hins alþjóðlega nafnrýmis, sem mun vonandi hjálpa til við samþættingu við annan kóða. Með því að nota C++ rekstraraðilann kynnir ns-3 nafnrýmið inn í núverandi (alþjóðlega) yfirlýsingarsvæði. Þetta er fín leið til að segja að eftir þessa yfirlýsingu þarftu ekki að slá inn ns3::scope leyfisveitanda fyrir allan ns-3 kóðann þinn til að nota hann. Ef þú þekkir ekki nafnarými skaltu vísa í næstum hvaða C++ kennslubók sem er og bera saman ns3 nafnrýmið með því að nota std nafnrýmið og yfirlýsinguna using namespace std; í dæmum um að vinna með úttaksstjóranum cout og læki.

4.2.4 Skráning

Næsta lína í handritinu er,

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Við munum nota þessa yfirlýsingu sem þægilegan stað til að ræða skjalakerfið okkar doxygen. Ef þú skoðar vefsíðu ns-3 verkefnisins finnurðu skjalatengil á yfirlitsstikunni. Ef þú smellir á þennan tengil færðu þig á skjalasíðuna okkar. Það er "Nýjasta útgáfa" hlekkur sem fer með þig í skjölin fyrir nýjustu stöðugu útgáfuna af ns-3. Ef þú velur tengilinn „API Documentation“ verðurðu fluttur á ns-3 API skjölunarsíðuna.

Vinstra megin á síðunni finnur þú myndræna framsetningu á skjalaskipulaginu. Góður staður til að byrja er Modules ns-3 "bókin" í ns-3 siglingatrénu. Ef þú opinberar Modules, munt þú sjá lista yfir ns-3 einingarskjöl. Eins og fjallað er um hér að ofan er hugmyndin um einingu hér beintengd við skrárnar sem eru í einingunni hér að ofan. Fjallað er um ns-3 skógarhögg undirkerfið í kafla Notkun á skráningareiningunni, svo við munum koma aftur að því síðar í þessari kennslu, en þú getur lært um yfirlýsinguna hér að ofan með því að skoða eininguna Coreog opna svo bókina Kembiforritog veldu síðan síðuna Annálar. Smelltu á Annálar.

Þú ættir nú að skoða skjölin doxygen fyrir mát Annálar. Í listanum yfir fjölva efst á síðunni muntu sjá færslu fyrir NS_LOG_COMPONENT_DEFINE. Áður en þú smellir á hlekkinn, vertu viss um að skoða „Nákvæma lýsingu“ á skráningareiningunni til að skilja hvernig hún virkar almennt. Til að gera þetta geturðu skrunað niður eða valið „Meira...“ fyrir neðan töfluna.

Þegar þú hefur almenna hugmynd um hvað er að gerast skaltu fara á undan og skoða skjölin fyrir tiltekna NS_LOG_COMPONENT_DEFINE. Ég mun ekki afrita skjölin hér, en til að draga saman þá lýsir þessi lína yfir skráningarhluta sem heitir FirstScriptExample, sem gerir þér kleift að virkja eða slökkva á stjórnborðsskráningu skilaboða með tilvísun í nafn.

4.2.5 Aðalhlutverk

Í eftirfarandi línum handritsins muntu sjá,

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

Þetta er einfaldlega yfirlýsing um aðalhlutverk forritsins þíns (handrit). Eins og með öll C++ forrit þarftu að skilgreina aðalaðgerð, þetta er keyrt fyrst. Það er ekkert sérstakt hérna. ns-3 handritið þitt er bara C++ forrit. Eftirfarandi lína stillir tímaupplausnina á 1 nanósekúndu, sem er sjálfgefið:

Time::SetResolution (Time::NS);

Tímaupplausn, eða einfaldlega upplausn, er minnsta tímagildi sem hægt er að nota (minnsti munur á milli tveggja tíma). Þú getur breytt upplausninni nákvæmlega einu sinni. Vélbúnaðurinn sem veitir þennan sveigjanleika eyðir minni, þannig að þegar upplausnin er sérstaklega stillt, losum við minnið og komum í veg fyrir frekari uppfærslur. (Ef þú stillir ekki upplausnina sérstaklega verður hún sjálfgefið ein nanósekúndu og minnið losnar þegar uppgerðin byrjar.)

Eftirfarandi tvær línur af skriftu eru notaðar til að virkja tvo skráningarhluta sem eru innbyggðir í forrit EchoClient и EchoServer:

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

Ef þú lest skjölin fyrir skráningarhlutann muntu sjá að það eru nokkur stig skráningar/kornunar sem þú getur virkjað á hverjum íhlut. Þessar tvær línur af kóða gera kleift að villuleita skráningu á INFO-stigið fyrir echo-biðlara og netþjóna. Á þessu stigi mun forritið prenta skilaboð þegar það sendir og tekur á móti pökkum meðan á uppgerð stendur.

Nú förum við að því að búa til staðfræði og keyra uppgerðina. Við notum staðfræði hjálparhluti til að gera þetta starf eins auðvelt og mögulegt er.

4.2.6 Notkun staðfræðiaðstoðarmanna

Næstu tvær línur af kóða í handritinu okkar munu í raun búa til Node ns-3 hlutina sem munu tákna tölvurnar í uppgerðinni.

NodeContainer nodes;
nodes.Create (2);

Áður en við höldum áfram skulum við finna skjölin fyrir bekkinn NodeContainer. Önnur leið til að komast að skjölunum fyrir tiltekinn bekk er í gegnum flipann Flokkar á síðunum doxygen. Ef þú ert nú þegar með Doxygen opið skaltu einfaldlega fletta upp efst á síðunni og velja flipann Classes. Þú ættir að sjá nýtt sett af flipa, einn þeirra er listi yfir flokka. Undir þessum flipa muntu sjá lista yfir alla ns-3 flokka. Skrunaðu niður að ns3::NodeContainer. Þegar þú finnur bekk, veldu hann til að fara í skjölin fyrir bekkinn.

Eins og við munum er ein af helstu útdráttum okkar hnúturinn. Það táknar tölvuna sem við ætlum að bæta hlutum við eins og samskiptareglur, forritum og jaðarkortum. Aðstoðarmaður jarðfræði NodeContainer veitir þægilega leið til að búa til, stjórna og fá aðgang að hvaða hlutum sem er Hnút, sem við búum til til að keyra uppgerðina. Fyrsta línan fyrir ofan lýsir einfaldlega yfir NodeContainer, sem við köllum hnúta. Önnur línan kallar á Create aðferðina á hnútahlutnum og biður ílátið um að búa til tvo hnúta. Eins og lýst er í doxygen, ílátið biður um að ns-3 kerfið búi til tvo hluti Hnút og geymir vísbendingar um þessa hluti innbyrðis.

Hnútarnir sem eru búnir til í handritinu gera ekkert ennþá. Næsta skref í uppbyggingu staðfræðinnar er að tengja hnúta okkar við netið. Einfaldasta netformið sem við styðjum er punkt-til-punkt tenging milli tveggja hnúta. Við munum nú búa til slíka tengingu.

PointToPointHelper

Við búum til punkt-til-punkt tengingu með því að nota kunnuglegt mynstur, notum staðfræðihjálparhlut til að vinna þá lágu vinnu sem þarf fyrir tenginguna. Mundu að tveir helstu abstrakt okkar NetTæki и Sund. Í hinum raunverulega heimi samsvara þessi hugtök nokkurn veginn jaðarkort og netsnúrur. Venjulega eru þessir tveir hlutir náskyldir hvor öðrum og enginn getur treyst á að deila td tækjum Ethernet yfir þráðlausa rás. Gróðurfræðihjálparar okkar fylgjast með þessu nána sambandi og því munt þú nota einn hlut í þessari atburðarás PointToPointHelper til að setja upp og tengja ns-3 hluti PointToPointNetDevice и PointToPointChannel. Næstu þrjár línur í handritinu:

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

Fyrsta lína,

PointToPointHelper pointToPoint;

býr til dæmi um hlut á staflanum PointToPointHelper. Frá efsta stigi sjónarhorni eftirfarandi lína,

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

segir hluturinn PointToPointHelper notaðu gildið "5 Mbit/s" (fimm megabit á sekúndu) sem "Gagnahraði'.

Frá sértækara sjónarhorni samsvarar strengurinn „DataRate“ því sem við köllum eigind PointToPointNetDevice. Ef þú horfir á doxygen fyrir bekk ns3::PointToPointNetDevice og í skjölum fyrir aðferðina GetTypeId þú munt finna lista yfir eiginleika sem eru skilgreindir fyrir tækið. Meðal þeirra verður eiginleiki "Gagnahraði" Flestir notendasýnilegir ns-3 hlutir hafa svipaða lista yfir eiginleika. Við notum þetta kerfi til að setja uppgerðina auðveldlega upp án endursamsetningar, eins og þú munt sjá í næsta kafla.

Svipað "Gagnahraði" í PointToPointNetDevice finnurðu "Delay" eigindina sem tengist PointToPointChannel. Lokalínan

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

segir PointToPointHelper notaðu gildið "2 ms" (tvær millisekúndur) sem útbreiðslu seinkun gildi fyrir punkt-til-punkt hlekkinn sem hann býr til í kjölfarið.

NetDeviceContainer

Í augnablikinu höfum við í handritinu NodeContainer, sem inniheldur tvo hnúta. Við höfum PointToPointHelper, sem er undirbúið til að búa til hluti PointToPointNetDevices og tengja þá með PointToPointChannel hlut. Rétt eins og við notuðum NodeContainer topology hjálparhlutinn til að búa til hnúta, munum við spyrja PointToPointHelper framkvæma vinnu fyrir okkur sem tengist gerð, uppsetningu og uppsetningu tækja okkar. Við þurfum lista yfir alla búna hluti NetTæki, svo við notum NetDeviceContainer að geyma þau á sama hátt og við notuðum NodeContainer til að geyma hnútana sem við bjuggum til. Næstu tvær línur af kóða,

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

ljúka uppsetningu tækis og rásar. Fyrsta línan lýsir yfir tækisílátinu sem nefnt er hér að ofan og sú seinni gerir aðalverkið. Aðferð setja mótmæla PointToPointHelper tekur NodeContainer sem breytu. Inni NetDeviceContainer fyrir hvern hnút sem staðsettur er í NodeContainer er búið til (fyrir punkt-til-punkt samskipti verða að vera nákvæmlega tveir þeirra) PointToPointNetDevice er búið til og vistað í tækisílátinu. PointToPointChannel er búið til og tveir fylgja því PointToPointNetDevices. Eftir að hafa búið til hluti eru eiginleikarnir geymdir í PointToPointHelper, eru notuð til að frumstilla samsvarandi eiginleika í búnum hlutum.

Eftir að hafa hringt pointToPoint.Install (hnútar) við munum hafa tvo hnúta, hver með punkt-til-punkt nettæki uppsett og einn punkt-til-punkt tengil á milli þeirra. Bæði tækin verða stillt til að senda gögn á fimm megabita hraða á sekúndu með sendingartöf upp á tvær millisekúndur yfir rásina.

InternetStackHelper

Við erum nú með hnúta og tæki stillt, en hnútar okkar eru ekki með samskiptareglur uppsettar. Næstu tvær línur af kóða sjá um þetta.

InternetStackHelper stack;
stack.Install (nodes);

InternetStackHelper - er staðfræðihjálp fyrir netstafla, svipað og PointToPointHelper fyrir punkt-til-punkt nettæki. Aðferð setja tekur NodeContainer sem færibreytu. Þegar það er keyrt mun það setja upp internetstafla (TCP, UDP, IP, osfrv.) á hverjum gámahnút.

IPv4 Address Helper

Þá þurfum við að tengja tækin okkar við IP tölur. Við bjóðum upp á staðfræðiaðstoðarmann til að stjórna IP-töluúthlutun. Eina API sem er sýnilegt notanda er að stilla grunn IP tölu og netmaska ​​til að nota þegar raunveruleg dreifing heimilisfangs er framkvæmd (þetta er gert á lægra stigi innan hjálparans). Næstu tvær línur af kóða í dæminu okkar fyrst.cc,

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

lýstu yfir aðseturshjálparhlutinn og segðu honum að hann ætti að byrja að úthluta IP-tölum frá neti 10.1.1.0 með því að nota bitamaskann 255.255.255.0 til að ákvarða. Sjálfgefið er að úthlutað heimilisföng byrja á einu og hækka eintóna, þannig að fyrsta heimilisfangið sem úthlutað er frá þessum grunni verður 10.1.1.1, síðan 10.1.1.2 o.s.frv. Í raun og veru, á lágu stigi, man ns-3 kerfið allar úthlutaðar IP tölur og myndar banvæna villu ef þú skapar óvart aðstæður þar sem sama heimilisfangið er búið til tvisvar (við the vegur, þessa villu er erfitt að kemba).

Eftirfarandi kóðalína,

Ipv4InterfaceContainer interfaces = address.Assign (devices);

sinnir raunverulegu heimilisfangsúthlutuninni. Í ns-3 komum við á tengingu milli IP tölu og tækis sem notar hlutinn IPv4 viðmót. Rétt eins og við þurfum stundum lista yfir nettæki sem aðstoðarmaðurinn hefur búið til til síðari nota, þurfum við stundum lista yfir hluti IPv4 viðmót. IPv4Interface Container veitir þessa virkni.

Við byggðum upp punkt-til-punkt net, með stafla uppsetta og IP-tölum úthlutað. Nú þurfum við forrit í hverjum hnút til að búa til umferð.

4.2.7 Notkun forrits

Önnur helsta útdráttur ns-3 kerfisins er Umsókn (umsókn). Í þessari atburðarás erum við að nota tvær grunnflokka sérhæfingar Umsókn ns-3 kallaður UdpEchoServerApplication и UdpEchoClientApplication. Eins og í fyrri tilvikum notum við hjálparhluti til að stilla og stjórna grunnhlutunum. Hér notum við UdpEchoServerHelper и UdpEchoClientHelper hlutir til að gera líf okkar auðveldara.

UdpEchoServerHelper

Eftirfarandi kóðalínur í first.cc dæmiforskriftinni okkar eru notaðar til að stilla UDP echo server forrit á einum af hnútunum sem við bjuggum til áðan.

UdpEchoServerHelper echoServer (9);

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

Fyrsta línan af kóða í ofangreindu brotinu býr til UdpEchoServerHelper. Eins og venjulega er þetta ekki forrit sjálft, það er hlutur sem hjálpar okkur að búa til raunveruleg forrit. Ein af venjum okkar er að senda nauðsynlega eiginleika til smíðaaðila hjálparhlutarins. Í þessu tilviki getur aðstoðarmaðurinn ekki gert neitt gagnlegt nema hann fái gáttanúmerið sem þjónninn mun hlusta á eftir pökkum, þetta númer verður einnig að vera þekkt fyrir viðskiptavininn. Í þessu tilviki sendum við gáttarnúmerið til hjálparsmiðsins. Smiðurinn gerir það aftur á móti einfaldlega SetEigind með samþykkt gildi. Seinna, ef þess er óskað, geturðu notað SetAttribute til að stilla annað gildi fyrir Port eigindina.

Eins og margir aðrir hjálparhlutir, er hluturinn UdpEchoServerHelper hefur aðferð setja. Með því að framkvæma þessa aðferð skapast á áhrifaríkan hátt grunn echo server forrit og bindur það við hýsilinn. Athyglisvert er aðferðin setja tekur NodeContainer sem breytu alveg eins og hinir setja aðferðir sem við höfum séð.

C++ óbein umbreytingin sem vinnur hér tekur niðurstöðu aðferðarinnar hnút.Fá(1) (sem skilar snjallbendi í hnúthlutinn - Ptr ) og notar það í smiðinum fyrir nafnlausa hlutinn NodeContainersem síðan fer yfir í aðferðina setja. Ef þú getur ekki ákvarðað í C++ kóða hvaða aðferðarundirskrift er tekin saman og keyrð, skoðaðu þá meðal óbeinna umbreytinga.

Nú sjáum við það echoServer.Install um að setja upp forritið UdpEchoServerApplication á að finna í NodeContainersem við notum til að stjórna hnútunum okkar, hnút með vísitölu 1. Aðferð setja mun skila gámi sem inniheldur ábendingar í öll forrit (í þessu tilviki eitt, þar sem við fórum framhjá nafnlausu NodeContainer, sem inniheldur einn hnút) búin til af hjálparanum.

Forrit þurfa að tilgreina hvenær á að byrja að búa til umferð "byrja" og gæti þurft að tilgreina tíma þegar á að hætta því "hættu". Við bjóðum upp á báða valkostina. Þessir tímar eru stilltir með aðferðunum Umsóknarílát Home и Hætta. Þessar aðferðir taka við breytum af gerðinni tími. Í þessu tilfelli notum við skýra röð C++ umbreytinga til að taka C++ tvöfaldast 1.0 og umbreyta því í tns-3 Time hlut sem notar Seconds hlutinn til að breyta í sekúndur. Mundu að umbreytingarreglunum getur verið stjórnað af höfundi líkansins og C++ hefur sínar eigin reglur, þannig að þú getur ekki alltaf treyst á að færibreytunum sé breytt eins og þú bjóst við. Tvær línur

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

mun valda því að echo server forritið ræsist (kveikir sjálfkrafa) einni sekúndu eftir að uppgerðin byrjar og hættir (slökkva) eftir tíu sekúndur af uppgerðinni. Vegna þeirrar staðreyndar að við lýstum yfir hermiatburði (application stop event), sem verður framkvæmt eftir tíu sekúndur, verður hermt eftir að minnsta kosti tíu sekúndum af netvirkni.

UdpEchoClientHelper

Umsókn viðskiptavinar sakna stillt á næstum svipaðan hátt og þjónninn. Það er grunnhlutur UdpEchoClientApplication, sem er stjórnað
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));;

Hins vegar, fyrir echo viðskiptavininn, þurfum við að stilla fimm mismunandi eiginleika. Fyrstu tveir eiginleikarnir eru stilltir á sköpunartíma UdpEchoClientHelper. Við sendum færibreytur sem eru notaðar (inni í hjálparanum) til að stilla eiginleikana "Fjaraðfang" и "RemotePort" í samræmi við samkomulag okkar um að senda nauðsynlegar breytur til hjálparsmiðsins.

Við skulum muna að við notuðum IPv4Interface Container til að fylgjast með IP-tölum sem við höfum úthlutað tækjum okkar. Núllviðmótið í viðmótsílátinu mun samsvara IP tölu núllhnútsins í hnútagámnum. Fyrsta viðmótið í viðmótsílátinu samsvarar IP tölu fyrsta hnútsins í hnútagámnum. Svo, í fyrstu línu kóðans (fyrir ofan), búum við til hjálpar og segjum honum að fjarvistfang viðskiptavinarins verði IP-talan sem úthlutað er til gestgjafans þar sem þjónninn er staðsettur. Við segjum líka að við þurfum að gera ráðstafanir til að senda pakka í höfn níu.

„MaxPackets“ eigindin segir viðskiptavininum hámarksfjölda pakka sem við getum sent meðan á uppgerðinni stendur. "Interval" eigindin segir viðskiptavininum hversu lengi á að bíða á milli pakka og "PacketSize" eigindin segir viðskiptavininum hversu stór farmur pakkans ætti að vera. Með þessari eiginleikasamsetningu segjum við viðskiptavininum að senda einn 1024-bæta pakka.

Eins og með echo netþjóninn, stillum við eiginleika echo biðlarans Home и Hætta, en hér ræsum við biðlarann ​​sekúndu eftir að kveikt er á þjóninum (tveimur sekúndum eftir að uppgerðin hefst).

4.2.8 Hermir

Á þessum tímapunkti þurfum við að keyra uppgerðina. Þetta er gert með því að nota alþjóðlega aðgerðina Hermir::Run.

Simulator::Run ();

Þegar við kölluðum áður aðferðir,

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

við áætluðum í raun atburði í herminum á 1,0 sekúndur, 2,0 sekúndur og tvo viðburði á 10,0 sekúndum. Eftir símtalið Hermir::Run, mun kerfið byrja að skoða lista yfir áætlaða atburði og framkvæma þá. Það mun fyrst kveikja á atburði eftir 1,0 sekúndur, sem mun kveikja á echo server forritinu (þessi atburður getur aftur tímasett marga aðra viðburði). Það mun síðan skjóta upp atburði sem er áætlaður á t=2,0 sekúndum sem mun ræsa echo biðlaraforritið. Aftur, þessi viðburður gæti haft marga fleiri viðburði fyrirhugaða. Upphafsviðburðarútfærslan í echo biðlaranum mun hefja gagnaflutningsfasa uppgerðarinnar með því að senda pakka til þjónsins.

Athöfnin að senda pakka á netþjóninn mun koma af stað atburðakeðju sem verður sjálfkrafa tímasett á bak við tjöldin og sem mun útfæra vélbúnaðinn við að senda bergmálspakka í samræmi við tímasetningarbreyturnar sem við höfum stillt í handritinu.

Þar af leiðandi, þar sem við erum að senda aðeins einn pakka (mundu, eiginleikann MaxPackets var stillt á einn), lýkur atburðarásinni sem hófst af þessu eina biðlarapingi og uppgerðin fer í biðham. Þegar þetta hefur gerst verða viðburðirnir sem eftir eru áætlaðir viðburðir Hætta fyrir netþjón og viðskiptavin. Þegar þessir atburðir eru framkvæmdir verða engir atburðir eftir til frekari úrvinnslu og Hermir::Run mun skila stjórn. Uppgerðinni er lokið.

Það eina sem er eftir er að þrífa upp eftir sig. Þetta er gert með því að kalla á alþjóðlega fallið Hermir::eyðileggja. Vegna þess að kallað var á hjálparaðgerðirnar (eða lágstigs ns-3 kóði), sem eru skipulagðar þannig að krókar voru settir inn í herminn til að eyða öllum hlutum sem voru búnir til. Þú þurftir ekki að fylgjast með neinum af þessum hlutum sjálfur - það eina sem þú þurftir að gera var að hringja Hermir::eyðileggja og farðu út. ns-3 kerfið mun vinna þessa erfiðu vinnu fyrir þig. Línurnar sem eftir eru af fyrsta ns-3 handritinu okkar, first.cc, gera einmitt það:

Simulator::Destroy ();
return 0;
}

Hvenær hættir hermirinn?

ns-3 er stakur atburður (DE) hermir. Í slíkum hermi er hver atburður tengdur framkvæmdartíma sínum og uppgerðin heldur áfram með því að vinna atburði í þeirri röð sem þeir gerast eftir því sem líður á uppgerðina. Atburðir geta valdið því að framtíðarviðburðir séu tímasettir (til dæmis getur tímamælir endurstillt sig til að ljúka talningu á næsta tímabili).

Upphafsviðburðir eru venjulega settir af stað af einingunni, til dæmis mun IPv6 tímasetja uppgötvun þjónustu á netinu, beiðnir frá nágranna osfrv. Forritið skipuleggur fyrsta pakkasendingarviðburðinn og svo framvegis. Þegar atburður er unnin getur hann myndað núll, einn eða fleiri atburði. Þegar líður á uppgerðina gerast atburðir, annaðhvort enda eða búa til nýjar. Uppgerðin stöðvast sjálfkrafa ef viðburðarröð er tóm eða sérstakur atburður greinist Hætta. Viðburður Hætta mynduð af aðgerðinni Hermir::Hættu (stöðvunartími).

Það er dæmigert tilvik þar sem Simulator::Stop er algjörlega nauðsynlegt til að stöðva uppgerðina: þegar það eru sjálfbærir atburðir. Sjálfbærir (eða endurteknir) atburðir eru atburðir sem eru alltaf endurteknir. Þar af leiðandi halda þeir viðburðarröðinni alltaf tómri. Það eru margar samskiptareglur og einingar sem innihalda endurtekna atburði, til dæmis:

• FlowMonitor - reglubundin athugun á týndum pakka;

• RIPng – reglubundin útsending af leiðartöfluuppfærslum;

• o.s.frv.

Í slíkum tilfellum Hermir::Hættu nauðsynlegt til að stöðva uppgerðina rétt. Að auki, þegar ns-3 er í hermiham, er RealtimeSimulator notaður til að samstilla hermiklukkuna við vélklukkuna, og Hermir::Hættu nauðsynlegt til að stöðva ferlið.

Mörg hermiforritin í kennslubókinni hringja ekki Hermir::Hættu beinlínis, þar sem þeim lýkur sjálfkrafa þegar viðburðir í biðröð eru uppurnir. Hins vegar munu þessi forrit einnig samþykkja Simulator::Stop call. Til dæmis myndi eftirfarandi viðbótaryfirlýsing í fyrsta dæmiforritinu skipuleggja skýrt stopp á 11 sekúndum:

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

Ofangreint mun í raun ekki breyta hegðun þessa forrits, þar sem þessari tilteknu uppgerð lýkur náttúrulega eftir 10 sekúndur. En ef þú myndir breyta stöðvunartímanum í yfirlýsingunni hér að ofan úr 11 sekúndum í 1 sekúndu, myndirðu taka eftir því að uppgerðin hættir áður en einhver framleiðsla lendir á skjánum (þar sem framleiðslan á sér stað eftir um það bil 2 sekúndur af hermitíma).

Það er mikilvægt að hringja í Simulator::Stöðva áður en þú hringir í Simulator::Run; annars gæti Simulator::Run aldrei skilað stjórn til aðalforritsins til að framkvæma stöðvunina!

4.2.9 Byggja upp handritið þitt

Við höfum gert einföldu forskriftirnar þínar léttvægar. Allt sem þú þarft að gera er að setja handritið þitt í klóra möppuna og það verður sjálfkrafa smíðað ef þú keyrir Waf. Reynum. Farðu aftur í möppuna á efstu stigi og afritaðu dæmi/kennsla/first.cc í vörulistann klóra

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

Búðu nú til fyrsta sýnishornið þitt með því að nota vaf:

$ ./waf

Þú ættir að sjá skilaboð sem gefa til kynna að fyrsta dæmið þitt hafi verið búið til.

Waf: Entering directory `/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: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (2.357s)

Nú geturðu keyrt dæmið (athugaðu að ef þú byggir forritið þitt í klóra möppunni, þá verður þú að keyra það frá klóra):

$ ./waf --run scratch/myfirst

Þú ættir að sjá svipað úttak:

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) Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
Received 1024 bytes from 10.1.1.2

Hér getur þú séð að byggingarkerfið staðfestir að skráin hafi verið byggð og keyrir hana síðan. Þú sérð færslu íhluta á echo biðlaranum gefur til kynna að hann hafi sent einn 1024-bæta pakka til echo server 10.1.1.2. Þú sérð líka skráningarhlutinn á echo-þjóninum til að segja að hann hafi fengið 1024 bæti frá 10.1.1.1. Bergmálsþjónninn spilar pakkann hljóðlaust aftur og þú getur séð í logbók echo biðlarans að hann hafi fengið pakkann sinn til baka frá netþjóninum.

4.3 ns-3 Frumkóði

Nú þegar þú hefur notað nokkra af ns-3 hjálparunum geturðu kíkt á frumkóðann sem útfærir þessa virkni. Nýjasta kóðann er hægt að skoða á vefþjóninum okkar á eftirfarandi hlekk: https://gitlab.com/nsnam/ns-3-dev.git. Þar muntu sjá Mercurial samantektarsíðuna fyrir ns-3 þróunartréð okkar. Efst á síðunni muntu sjá nokkra tengla,

summary | shortlog | changelog | graph | tags | files

Farðu á undan og veldu skráartengilinn. Svona mun efsta stig flestra geymsla okkar líta út:

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

Dæmi forskriftir okkar eru í möppunni dæmi. Ef þú smellir á dæmin muntu sjá lista yfir undirmöppur. Ein af skránum í undirmöppunni kennsla - first.cc. Ef þú smellir á fyrst.cc þú munt sjá kóðann sem þú varst að læra.

Kóðinn er aðallega staðsettur í möppunni src. Þú getur skoðað frumkóðann með því að smella á skráarheitið eða smella á skráartengilinn hægra megin við skráarheitið. Ef þú smellir á src möppuna færðu lista yfir src undirmöppur. Ef þú smellir síðan á kjarnaundirskrána finnurðu lista yfir skrár. Fyrsta skráin sem þú munt sjá (þegar þú skrifar þessa handbók) er hætta.h. Ef þú smellir á hlekkinn hætta.h, þú verður sendur í frumskrána fyrir hætta.h, sem inniheldur gagnlegar fjölvi til að hætta við forskriftir ef óeðlilegar aðstæður finnast. Frumkóðann fyrir hjálparana sem við notuðum í þessum kafla er að finna í möppunni src/Applications/helper. Ekki hika við að pota í möpputréð til að finna út hvar er hvar og skilja stíl ns-3 forrita.

Heimild: www.habr.com

Bæta við athugasemd