ns-3 rezo similatè leson patikilye. Chapit 4

ns-3 rezo similatè leson patikilye. Chapit 4
chapit 1,2
chapit 3

4 Apèsi sou konsèp
4.1 Abstraksyon kle
4.1.1 Ne
4.1.2 Aplikasyon
4.1.3 Chanèl
4.1.4 Aparèy nèt
4.1.5 Asistan topolojik
4.2 Premye script ns-3
4.2.1 Kòd boilerplate
4.2.2 Plug-ins
4.2.3 espas non ns3
4.2.4 Anrejistre
4.2.5 Fonksyon prensipal
4.2.6 Sèvi ak asistan topoloji
4.2.7 Sèvi ak Aplikasyon
4.2.8 Similatè
4.2.9 Bati script ou a
4.3 ns-3 Kòd sous

Chapter 4

Apèsi sou konsèp

Premye bagay nou bezwen fè anvan nou kòmanse aprann oswa ekri kòd ns-3 se eksplike kèk konsèp debaz ak abstraksyon nan sistèm nan. Anpil nan sa a ka parèt evidan pou kèk, men nou rekòmande pou pran tan pou li seksyon sa a pou asire w ap kòmanse sou yon fondasyon solid.

4.1 Abstraksyon kle

Nan seksyon sa a, nou pral gade kèk tèm ki souvan itilize sou entènèt la men ki gen yon siyifikasyon espesifik nan ns-3.

4.1.1 Ne

Nan jagon Entènèt, yon aparèy òdinatè ki konekte nan yon rezo yo rele yon lame oswa pafwa yon sistèm final. Paske ns-3 se yon similatè rezo epi li pa yon similatè Entènèt, nou fè espre pa sèvi ak tèm lame a, paske sa a se pre relasyon ak entènèt la ak pwotokòl li yo. Olye de sa, nou itilize yon tèm ki pi jeneral, ki itilize tou pa lòt similatè, ki soti nan teyori graf: node (ne).

Nan ns-3, abstraksyon ki kache nan yon aparèy enfòmatik yo rele yon ne. Abstraksyon sa a reprezante nan C++ pa klas la Node. Klas NodeNode (nœud) bay metòd pou manipile reprezantasyon aparèy informatique nan simulation.

Ou dwe konprann Node tankou yon òdinatè kote ou ajoute fonctionnalités. Ou pral ajoute bagay tankou aplikasyon, pil pwotokòl, ak kat periferik ak chofè ki pèmèt òdinatè a fè travay itil. Nou itilize menm modèl debaz la nan ns-3.

4.1.2 Aplikasyon

Anjeneral, lojisyèl òdinatè divize an de klas laj. Lojisyèl sistèm òganize divès resous òdinatè tankou memwa, sik processeur, disk, rezo, elatriye dapre kèk modèl informatique. Lojisyèl sistèm anjeneral pa sèvi ak resous sa yo pou fè travay ki benefisye dirèkteman itilizatè a. Yon itilizatè anjeneral kouri yon aplikasyon pou reyalize yon objektif espesifik, ki jwenn epi sèvi ak resous ki kontwole pa lojisyèl sistèm lan.

Souvan liy separasyon ant sistèm ak lojisyèl aplikasyon trase nan nivo privilèj chanjman ki fèt nan pyèj sistèm opere. ns-3 pa gen okenn konsèp reyèl nan yon sistèm opere ak Se poutèt sa pa gen okenn konsèp nan nivo privilèj oswa apèl sistèm. Sepandan, nou gen yon lide pou yon aplikasyon. Menm jan nan aplikasyon lojisyèl "monn reyèl" yo kouri sou òdinatè pou fè travay, aplikasyon ns-3 kouri sou ns-3 nœuds pou kontwole simulation nan mond lan simulation.

Nan ns-3, abstraksyon debaz pou yon pwogram itilizatè ki jenere kèk aktivite pou modèl se yon aplikasyon. Abstraksyon sa a reprezante nan C++ pa klas Aplikasyon an. Klas Aplikasyon an bay metòd pou manipile opinyon sou vèsyon aplikasyon pou itilizatè nou an nan simulation. Devlopè yo espere espesyalize klas Aplikasyon an nan yon sans pwogram oryante objè pou kreye nouvo aplikasyon. Nan leson patikilye sa a, nou pral sèvi ak espesyalizasyon nan klas Aplikasyon yo rele UdpEchoClientApplication и UdpEchoServerApplication. Kòm ou ta ka espere, aplikasyon sa yo fè yon seri aplikasyon kliyan/sèvè yo itilize pou jenere ak eko pake rezo.

4.1.3 Chanèl

Nan mond reyèl la, ou ka konekte yon òdinatè nan yon rezo. Souvan medya yo sou ki done yo transmèt nan rezo sa yo yo rele chanèl. Lè w ploge yon kab Ethernet nan yon priz miray, w ap konekte òdinatè w lan ak yon lyen Ethernet. Nan mond lan simulation ns-3, yon ne konekte ak yon objè ki reprezante yon kanal kominikasyon. Isit la, abstraksyon debaz la nan sou-rezo kominikasyon yo rele yon kanal epi yo reprezante nan C++ pa klas la Chèn.

Gwoup ChannelChannel bay metòd pou jere entèraksyon an nan objè subnet ak konekte nœuds yo. Chanèl yo kapab tou espesyalize pa devlopè nan yon sans pwogram oryante objè. Espesyalizasyon chanèl ka modèl yon bagay senp tankou yon fil. Yon chanèl devwe kapab tou modèl bagay konplèks tankou yon gwo switch Ethernet oswa yon espas ki genyen twa dimansyon plen ak obstak nan ka a nan rezo san fil.

Nou pral sèvi ak vèsyon espesyalize nan kanal la nan leson patikilye sa a ki rele CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel и WifiChannelWifiChannel. CsmaChannel, pou egzanp, modèl yon vèsyon nan yon sous-rezo kominikasyon ki aplike yon anviwònman kominikasyon ak aksè miltip transpòtè. Sa a ban nou Ethernet-tankou fonctionnalités.

4.1.4 Aparèy nèt

Li te konn fè ke si ou te vle konekte yon òdinatè nan yon rezo, ou te oblije achte yon kab rezo espesifik ak yon aparèy pyès ki nan konpitè ki rele (nan tèminoloji PC) yon kat periferik ki bezwen enstale nan òdinatè a. Si yon kat periferik te aplike kèk fonksyon rezo, yo te rele yo kat koòdone rezo oswa kat rezo. Jodi a, pifò òdinatè yo vini ak pyès ki nan konpitè koòdone rezo entegre epi itilizatè yo pa wè yo kòm aparèy separe.

Yon kat rezo p ap travay san yon chofè lojisyèl ki kontwole pyès ki nan konpitè. Nan Unix (oswa Linux), yon moso nan ekipman periferik klase kòm yon aparèy. Aparèy yo jere lè l sèvi avèk chofè aparèy, ak aparèy rezo (NICs) yo jere lè l sèvi avèk chofè aparèy rezo (chofè aparèy rezo yo) epi yo rele kolektivman aparèy rezo (aparèy nèt). Nan Unix ak Linux, ou refere a aparèy rezo pa non tankou eth0.

Nan ns-3, abstraksyon aparèy rezo a kouvri tou de chofè lojisyèl an ak pyès ki nan konpitè yo te modle. Nan simulation, yon aparèy rezo "enstale" nan yon ne pou pèmèt li kominike ak lòt nœuds atravè chanèl. Menm jan ak yon òdinatè reyèl, yon ne ka konekte ak plizyè chanèl atravè plizyè aparèy NetDevices.

Abstraksyon rezo yon aparèy reprezante nan C++ pa klas la NetDevice. Klas NetDevice bay metòd pou jere koneksyon ak objè Node ak Chèn; epi yo ka espesyalize pa devlopè nan sans pwogram oryante objè. Nan leson patikilye sa a nou pral sèvi ak plizyè vèsyon espesyalize nan NetDevice rele CsmaNetDevice, PointToPointNetDevice и WifiNetDevice. Menm jan yon adaptè rezo Ethernet fèt pou travay avèk yon rezo Ethernet, CsmaNetDevice fèt pou travay avèk CsmaChannel, PointToPointNetDevice fèt pou travay avèk PointToPointChannelAk WifiNetDevice - fèt pou travay avèk WifiChannel.

4.1.5 Asistan topolojik

Nan yon rezo reyèl, ou pral jwenn òdinatè lame ak kat rezo te ajoute (oswa bati-an). Nan ns-3 nou ta di ke ou pral wè nœuds ak NetDevices tache. Nan yon gwo rezo simulation, w ap bezwen òganize koneksyon ant anpil bagay Node, NetDevice и Chèn.

Depi konekte NetDevices ak nœuds, NetDevices ak lyen, bay adrès IP, elatriye. nan ns-3 yo se yon travay komen, fè sa a pi fasil ke posib nou bay sa yo rele èd topoloji. Pou egzanp, pou kreye yon NetDevice, ou bezwen fè anpil operasyon nwayo ns-3, ajoute yon adrès MAC, enstale aparèy rezo a nan Node, konfigirasyon pil pwotokòl nod la, ak Lè sa a, konekte NetDevice a Chèn nan. Menm plis travay yo pral oblije konekte plizyè aparèy nan lyen miltipwen epi konekte rezo endividyèl yo nan yon rezo Internetworks. Nou bay objè asistan topoloji ki konbine anpil operasyon sa yo nan yon modèl fasil-a-itilize pou konvenyans ou.

4.2 Premye script ns-3

Si ou enstale sistèm nan jan yo sijere pi wo a, w ap gen lage ns-3 nan yon anyè ki rele repos nan anyè lakay ou. Ale nan anyè divilge

Si ou pa gen yon anyè konsa, sa vle di ou pa t presize anyè pwodiksyon an lè w te bati vèsyon an lage ns-3, bati tankou sa a:
$ ./waf configure —build-profile=release —out=build/release,
$ ./waf bati

la ou ta dwe wè yon estrikti anyè ki sanble ak sa ki annapre yo:

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

Ale nan anyè egzanp / leson patikilye. Ou ta dwe wè yon dosye ki sitiye la rele premye.cc. Sa a se yon script ki pral kreye yon senp koneksyon pwen-a-pwen ant de nœuds epi transmèt yon pake ant nœuds yo. Ann gade script sa a liy pa liy, pou fè sa, louvri first.cc nan editè pi renmen ou.

4.2.1 Kòd boilerplate
Premye liy nan dosye a se liy mòd editè a emak. Li di emacs sou konvansyon fòma yo (style kodaj) ke nou itilize nan kòd sous nou an.

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

Sa a se toujou yon pwoblèm byen kontwovèsyal, kidonk nou bezwen mete dosye a dwat pou fè li soti nan chemen an touswit. Pwojè ns-3 a, tankou pifò pwojè gwo, te adopte yon style kodaj ke tout kòd kontribye dwe konfòme yo. Si ou vle kontribye kòd ou a nan pwojè a, ou pral evantyèlman gen konfòme yo ak estanda kodaj ns-3, jan sa dekri nan dosye a. doc/codingstd.txt oswa montre sou paj wèb pwojè a: https://www.nsnam.org/develop/contributing-code/coding-style/.

Nou rekòmande pou w abitye ak aparans kòd ns-3 epi aplike estanda sa a chak fwa w ap travay ak kòd nou an. Tout ekip devlopman ak kontribitè yo te dakò ak sa apre kèk bougonnen. Liy mòd emacs ki anwo a fè li fasil pou fòma kòrèkteman si w ap itilize editè emacs la.

Se simulateur ns-3 ki gen lisans pou itilize Gnou Jeneral Piblik Lisans pou. Ou pral wè header legal GNU ki apwopriye a nan chak dosye distribisyon ns-3. Souvan w ap wè yon avi sou copyright pou youn nan enstitisyon k ap patisipe yo nan pwojè ns-3 anlè tèks GPL ak otè a, yo montre anba a.

/* 
* 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 Plug-ins

Kòd la tèt li kòmanse ak yon seri deklarasyon enklizyon (gen ladan yo).

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

Pou ede itilizatè scripting wo nivo nou yo fè fas ak gwo kantite fichye header ki prezan nan sistèm nan, nou gwoupe yo dapre itilizasyon yo an gwo modil. Nou bay yon sèl dosye header ki pral rekursiv chaje tout dosye header yo itilize nan yon modil bay yo. Olye pou nou chèche egzakteman ki header ou bezwen epi pètèt jwenn lis depandans ki kòrèk la, nou ba ou kapasite pou telechaje yon gwoup fichye nan gwo granularite. Li pa apwòch ki pi efikas, men li sètènman fè ekri scripts anpil pi fasil.

Chak nan ns-3 enkli fichye yo mete yo nan yon anyè ki rele ns3 (konstwi sou-anyè) pou evite konfli non fichye pandan pwosesis konstriksyon an. File ns3/core-module.h koresponn ak modil ns-3, ke w ap jwenn nan anyè a src/nwayo nan lage ou enstale a. Nan lis anyè sa a ou pral jwenn yon gwo kantite dosye header. Lè ou fè asanble a, Waf mete fichye header piblik yo nan anyè ns3 nan yon sous-anyè bati/debug

Si ou pa gen yon anyè konsa, sa vle di ou pa t presize anyè pwodiksyon an lè w te bati vèsyon an lage ns-3, bati tankou sa a:
$ ./waf konfigirasyon --build-profile=debug --out=konstwi/debug
$ ./waf bati
oswa
$ ./waf configure --build-profile=optimize --out=konstwi/optimize
$ ./waf bati

oswa konstwi/optimize, depann sou konfigirasyon ou. Waf pral tou otomatikman jenere yon modil enkli fichye pou chaje tout fichye header piblik yo. Depi w ap suiv gid sa a nan domèn relijye, ou deja fè

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

konfigirasyon pwojè a pou kouri debug bati ki gen ladan egzanp ak tès yo. Ou te fè tou

$ ./waf

pou rasanble pwojè a. Se konsa, kounye a lè ou gade nan anyè a ../../build/debug/ns3, Lè sa a, ou pral jwenn, pami lòt moun, dosye yo header nan kat modil yo montre pi wo a. Ou ka gade sa ki nan dosye sa yo epi jwenn ke yo gen ladan yo tout fichye piblik yo itilize pa modil korespondan yo.

4.2.3 espas non ns3

Pwochen liy nan script premye.cc se yon deklarasyon espas non.

using namespace ns3;

Pwojè ns-3 aplike nan yon espas non C++ ki rele ns3. Sa a gwoupe tout deklarasyon ki gen rapò ak ns-3 nan yon dimansyon deyò espas non mondyal la, ki pral èspere ke ede ak entegrasyon ak lòt kòd. Sèvi ak operatè C++ a entwodui espas non ns-3 nan rejyon aktyèl la (global) deklaratif. Sa a se yon fason anpenpan pou di ke apre deklarasyon sa a, ou pa pral bezwen tape operatè pèmisyon ns3::scope anvan tout kòd ns-3 ou pou itilize li. Si ou pa abitye ak espas non, al gade nan prèske nenpòt liv C++ epi konpare espas non ns3 lè l sèvi avèk espas non ak deklarasyon std. using namespace std; nan egzanp travay ak operatè pwodiksyon an pri ak kouran dlo.

4.2.4 Anrejistre

Pwochen liy script la se,

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Nou pral sèvi ak deklarasyon sa a kòm yon bon kote pou diskite sou sistèm dokiman nou an Oksijèn. Si w gade sou sit entènèt pwojè ns-3 la, w ap jwenn yon lyen Dokimantasyon nan ba navigasyon an. Si w klike sou lyen sa a, w ap mennen w nan paj dokimantasyon nou an. Gen yon lyen "Dènye Release" ki pral mennen ou nan dokiman an pou dènye vèsyon ki estab nan ns-3. Si w chwazi lyen "API Dokimantasyon", y ap mennen w nan paj ns-3 API dokiman an.

Sou bò gòch paj la w ap jwenn yon reprezantasyon grafik estrikti dokimantasyon an. Yon bon kote pou kòmanse se Modules ns-3 "liv" nan pye bwa navigasyon ns-3 la. Si ou revele Modil, ou pral wè yon lis dokiman ns-3 modil yo. Kòm diskite pi wo a, konsèp nan yon modil isit la se dirèkteman gen rapò ak dosye ki enkli nan modil ki anwo a. Sou-sistèm anrejistreman ns-3 la diskite nan seksyon Sèvi ak Modil Logging la, kidonk nou pral tounen sou li pita nan leson patikilye sa a, men ou ka aprann sou deklarasyon ki anwo a lè w gade modil la. Nwayoepi apre sa ouvè liv la Depouyman zoutiak Lè sa a, chwazi paj la Antre. Klike sou Antre.

Ou ta dwe kounye a revize dokiman an Oksijèn pou modil Antre. Nan lis makro ki anlè paj la, w ap wè yon antre pou NS_LOG_COMPONENT_DEFINE. Anvan w klike sou lyen an, asire w ke w gade "Detaye Deskripsyon" modil enskripsyon an pou w konprann kijan li fonksyone an jeneral. Pou fè sa ou ka desann oswa chwazi "Plis..." anba tablo a.

Yon fwa ou gen yon lide jeneral sou sa k ap pase, ale pi devan epi gade nan dokiman an pou NS_LOG_COMPONENT_DEFINE espesifik la. Mwen pa pral kopi dokiman an isit la, men pou rezime, liy sa a deklare yon eleman anrejistreman yo rele FirstScriptExample, ki pèmèt ou aktive oswa enfim konsole antre nan mesaj pa referans a yon non.

4.2.5 Fonksyon prensipal

Nan liy sa yo nan script la ou pral wè,

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

Sa a se tou senpleman yon deklarasyon sou fonksyon prensipal pwogram ou an (script). Menm jan ak nenpòt pwogram C++, ou bezwen defini yon fonksyon prensipal, sa a egzekite an premye. Pa gen anyen espesyal isit la. Script ns-3 ou se jis yon pwogram C++. Liy sa a mete rezolisyon tan an nan 1 nanosegond, ki se default la:

Time::SetResolution (Time::NS);

Rezolisyon tan, oswa tou senpleman rezolisyon, se pi piti valè tan ki ka itilize (pi piti diferans ki reprezante ant de fwa). Ou ka chanje rezolisyon an egzakteman yon fwa. Mekanis ki bay fleksibilite sa a konsome memwa, kidonk yon fwa yo fikse rezolisyon an klèman, nou libere memwa a, sa ki anpeche plis mizajou. (Si ou pa mete rezolisyon an klèman, li pral default nan yon nanosegond epi memwa a pral libere lè simulation la kòmanse.)

Yo itilize de liy script sa yo pou pèmèt de konpozan anrejistreman ki entegre nan aplikasyon yo EchoClient и EchoServer:

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

Si ou li dokimantasyon an pou konpozan Logging, ou pral wè ke gen plizyè nivo antre/granularite ke ou ka aktive sou chak eleman. De liy kòd sa yo pèmèt debug antre nan nivo INFO pou kliyan eko ak sèvè. Nan nivo sa a, aplikasyon an pral enprime mesaj pandan li voye ak resevwa pakè pandan simulation.

Koulye a, nou pral desann nan biznis la nan kreye topoloji a ak kouri simulation la. Nou itilize objè asistan topoloji pou fè travay sa a pi fasil ke posib.

4.2.6 Sèvi ak asistan topoloji

Pwochen de liy kòd yo nan script nou an pral aktyèlman kreye objè yo Node ns-3 ki pral reprezante òdinatè yo nan simulation la.

NodeContainer nodes;
nodes.Create (2);

Anvan nou kontinye, ann jwenn dokimantasyon pou klas la NodeContainer. Yon lòt fason pou ale nan dokiman an pou yon klas bay se atravè tab la Klas sou paj yo Oksijèn. Si ou deja gen Doxygen louvri, tou senpleman woule jiska anlè paj la epi chwazi tab la Klas. Ou ta dwe wè yon nouvo seri onglè, youn nan yo se yon lis klas yo. Anba tab sa a ou pral wè yon lis tout klas ns-3 yo. Scroll desann nan ns3::NodeContainer. Lè ou jwenn yon klas, chwazi li pou ale nan dokimantasyon pou klas la.

Kòm nou sonje, youn nan abstraksyon kle nou an se ne la. Li reprezante òdinatè nou pral ajoute bagay tankou pil pwotokòl, aplikasyon, ak kat periferik. Asistan topoloji NodeContainer bay yon fason pratik pou kreye, jere ak jwenn aksè nan nenpòt objè Node, ke nou kreye pou kouri simulation la. Premye liy ki anwo a tou senpleman deklare NodeContainer, ke nou rele nœuds. Dezyèm liy lan rele metòd Kreye sou objè a nœuds epi li mande veso a pou kreye de nœuds. Jan sa dekri nan Oksijèn, veso a mande sistèm ns-3 pou kreye de objè Node epi estoke endikasyon sou objè sa yo anndan an.

Nœuds ki te kreye nan script la pa fè anyen ankò. Pwochen etap la nan bati topoloji a se konekte nœuds nou yo ak rezo a. Fòm ki pi senp nan rezo ke nou sipòte se yon koneksyon pwen-a-pwen ant de nœuds. Nou pral kounye a kreye yon koneksyon konsa.

PointToPointHelper

Nou kreye yon koneksyon pwen-a-pwen lè l sèvi avèk yon modèl abitye, lè l sèvi avèk yon objè asistan topoloji pou fè travay ki ba nivo ki nesesè pou koneksyon an. Sonje byen ke de abstraksyon kle nou yo NetDevice и Chèn. Nan mond reyèl la, tèm sa yo apeprè koresponn ak kat periferik ak câbles rezo. Tipikman, de bagay sa yo gen rapò youn ak lòt, e pesonn pa ka konte sou pataje, pou egzanp, aparèy. Ethernet sou yon chanèl san fil. Asistan topoloji nou yo swiv relasyon sere sa a epi kidonk ou pral sèvi ak yon sèl objè nan senaryo sa a PointToPointHelper pou mete kanpe ak konekte objè ns-3 PointToPointNetDevice и PointToPointChannel. Twa liy kap vini yo nan script la:

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

Premye liy,

PointToPointHelper pointToPoint;

kreye yon egzanp yon objè sou pil la PointToPointHelper. Soti nan yon pwen de vi nivo siperyè liy sa a,

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

di objè a PointToPointHelper sèvi ak valè "5 Mbit/s" (senk megabit pou chak segonn) kòm "DataRate'.

Soti nan yon pwen de vi ki pi espesifik, fisèl "DataRate" koresponn ak sa nou rele yon atribi PointToPointNetDevice. Si ou gade Oksijèn pou klas ns3::PointToPointNetDevice ak nan dokiman an pou metòd la GetTypeId w ap jwenn yon lis atribi defini pou aparèy la. Pami yo pral gen atribi a "DataRate" Pifò objè ki vizib itilizatè ns-3 gen lis atribi ki sanble. Nou itilize mekanis sa a fasil pou mete sou pye simulation san recompilation, jan ou pral wè nan pwochen seksyon an.

Menm jan ak "DataRate" nan PointToPointNetDevice, w ap jwenn atribi "Reta" ki asosye ak PointToPointChannel la. Liy final la

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

di PointToPointHelper sèvi ak valè "2 ms" (de milisgond) kòm valè reta pwopagasyon pou lyen pwen-a-pwen li kreye apre sa.

NetDeviceContainer

Nan moman sa a nou gen nan script la NodeContainer, ki gen de nœuds. Nou genyen PointToPointHelper, ki se prepare pou kreye objè PointToPointNetDevices epi konekte yo lè l sèvi avèk yon objè PointToPointChannel. Menm jan nou te itilize objè k ap ede topoloji NodeContainer pou kreye nœuds, nou pral mande PointToPointHelper fè travay pou nou ki gen rapò ak kreyasyon, konfigirasyon ak enstalasyon aparèy nou yo. Nou bezwen yon lis tout objè kreye yo NetDevice, se konsa nou itilize NetDeviceContainer sere yo menm jan nou te itilize a NodeContainer pou estoke nœuds nou te kreye yo. De pwochen liy kòd yo,

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

konplè aparèy ak konfigirasyon chanèl. Premye liy la deklare veso a aparèy mansyone pi wo a, ak dezyèm nan fè travay prensipal la. Metòd Enstale objè PointToPointHelper pran NodeContainer kòm yon paramèt. Anndan NetDeviceContainer pou chak ne ki sitiye nan NodeContainer se kreye (pou kominikasyon pwen-a-pwen dwe genyen egzakteman de nan yo) PointToPointNetDevice se kreye epi sove nan veso aparèy la. PointToPointChannel se kreye epi de yo tache ak li PointToPointNetDevices. Apre kreye objè, atribi yo estoke nan PointToPointHelper, yo itilize pou inisyalize atribi korespondan yo nan objè yo kreye.

Apre w fin fè yon apèl pointToPoint.Install (nœuds) nou pral gen de nœuds, chak ak yon aparèy rezo pwen-a-pwen enstale ak yon lyen pwen-a-pwen ant yo. Tou de aparèy yo pral configuré pou transmèt done nan yon vitès senk megabit pou chak segonn ak yon reta transmisyon de milisgond sou kanal la.

InternetStackHelper

Nou kounye a gen nœuds ak aparèy configuré, men nœuds nou yo pa gen pil pwotokòl enstale. De pwochen liy kòd yo pral pran swen sa a.

InternetStackHelper stack;
stack.Install (nodes);

InternetStackHelper - se yon èd topoloji pou pile entènèt, menm jan ak PointToPointHelper pou aparèy rezo pwen-a-pwen. Metòd Enstale pran NodeContainer kòm yon paramèt. Lè egzekite, li pral enstale chemine Entènèt la (TCP, UDP, IP, elatriye) sou chak ne veso.

IPv4AddressHelper

Lè sa a, nou bezwen asosye aparèy nou yo ak adrès IP. Nou bay yon asistan topoloji pou jere alokasyon adrès IP. Sèl API ki vizib pou itilizatè a se mete adrès IP debaz la ak netmask pou itilize lè w ap fè distribisyon adrès aktyèl la (sa a fèt nan yon nivo pi ba nan asistan an). Pwochen de liy kòd yo nan script egzanp nou an premye.cc,

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

deklare objè asistan adrès la epi di li ke li ta dwe kòmanse asiyen adrès IP nan rezo 10.1.1.0, lè l sèvi avèk 255.255.255.0 bitmask la pou detèmine. Pa default, adrès atribye ba yo ap kòmanse nan yon sèl epi ogmante monotone, kidonk premye adrès ki resevwa lajan nan baz sa a pral 10.1.1.1, Lè sa a, 10.1.1.2, elatriye. An reyalite, nan yon nivo ki ba, sistèm ns-3 a sonje tout adrès IP yo resevwa ak jenere yon erè fatal si ou aksidantèlman kreye yon sitiyasyon kote se menm adrès la pwodwi de fwa (pa chemen an, erè sa a se difisil a debogaj).

Liy kòd sa a,

Ipv4InterfaceContainer interfaces = address.Assign (devices);

fè devwa adrès aktyèl la. Nan ns-3 nou etabli yon koneksyon ant yon adrès IP ak yon aparèy lè l sèvi avèk objè a IPv4Interface. Menm jan nou pafwa bezwen yon lis aparèy rezo ki te kreye pa asistan an pou itilize pita, pafwa nou bezwen yon lis objè. IPv4Interface. IPv4InterfaceContainer bay fonksyonalite sa a.

Nou bati yon rezo pwen-a-pwen, ak pil enstale ak adrès IP asiyen. Koulye a, nou bezwen aplikasyon nan chak ne pou jenere trafik.

4.2.7 Sèvi ak Aplikasyon

Yon lòt nan abstraksyon prensipal yo nan sistèm nan ns-3 se aplikasyon (aplikasyon). Nan senaryo sa a nou ap itilize de baz espesyalizasyon klas aplikasyon ns-3 rele UdpEchoServerApplication и UdpEchoClientApplication. Kòm nan ka anvan yo, nou itilize objè oksilyè pou konfigirasyon ak jere objè debaz yo. Isit la nou itilize UdpEchoServerHelper и UdpEchoClientHelper objè pou rann lavi nou pi fasil.

UdpEchoServerHelper

Liy kòd sa yo nan script egzanp first.cc nou yo itilize pou konfigirasyon yon aplikasyon sèvè eko UDP sou youn nan nœuds nou te kreye pi bonè.

UdpEchoServerHelper echoServer (9);

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

Premye liy kòd nan snippet ki anwo a kreye UdpEchoServerHelper. Kòm dabitid, sa a se pa yon aplikasyon tèt li, li se yon objè ki ede nou kreye aplikasyon reyèl. Youn nan konvansyon nou yo se pase atribi obligatwa yo bay konstrukteur objè asistan an. Nan ka sa a, èd la pa ka fè anyen ki itil sof si yo bay nimewo pò a sou ki sèvè a pral koute pou pake, nimewo sa a dwe konnen tou kliyan an. Nan ka sa a, nou pase nimewo pò a bay konstrukteur asistan an. Konstriksyon an, nan vire, tou senpleman fè SetAttribute ak valè pase a. Apre sa, si ou vle, ou ka itilize SetAttribute pou mete yon valè diferan pou atribi Port la.

Tankou anpil lòt objè oksilyè, objè a UdpEchoServerHelper gen yon metòd Enstale. Egzekite metòd sa a efektivman kreye yon aplikasyon sèvè eko debaz epi li mare li ak lame a. Enteresan, metòd la Enstale pran NodeContainer kòm yon paramèt menm jan ak lòt yo Enstale metòd nou te wè.

C++ konvèsyon implicite k ap travay isit la pran rezilta metòd la node.Get(1) (ki retounen yon konsèy entelijan nan objè a ne - Ptr ) epi sèvi ak li nan konstrukteur a pou objè a anonim NodeContainerki Lè sa a, pase nan metòd la Enstale. Si ou pa ka detèmine nan kòd C++ ki metòd siyati yo konpile ak egzekite, Lè sa a, gade nan mitan konvèsyon yo implicite.

Kounye a nou wè sa echoServer.Enstale sou yo enstale aplikasyon an UdpEchoServerApplication on jwenn nan NodeContainerki nou itilize pou jere nœuds nou yo, ne ak endèks 1. Metòd Enstale pral retounen yon veso ki gen endikasyon sou tout aplikasyon yo (nan ka sa a youn, depi nou te pase yon anonim NodeContainer, ki gen yon sèl ne) kreye pa moun k'ap ede a.

Aplikasyon yo bezwen presize lè yo kòmanse jenere trafik "kòmanse" epi yo ka bezwen anplis presize yon lè lè yo sispann li "sispann". Nou bay tou de opsyon. Tan sa yo fikse lè l sèvi avèk metòd yo Application Container Kòmanse и Sispann. Metòd sa yo aksepte paramèt kalite Tan. Nan ka sa a nou itilize yon sekans klè nan C++ konvèsyon yo pran C++ double 1.0 epi konvèti li nan yon objè tan tns-3 ki sèvi ak objè Seconds pou konvèti an segonn. Sonje ke règ konvèsyon yo ka kontwole pa otè modèl la, epi C++ gen pwòp règ li yo, kidonk ou pa ka toujou konte sou paramèt yo te konvèti fason ou te espere. De liy

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

pral lakòz aplikasyon sèvè eko kòmanse (limen otomatikman) yon segonn apre simulation la kòmanse epi sispann (fèmen) apre dis segonn nan simulation la. Akòz lefèt ke nou te deklare yon evènman simulation (evènman sispann aplikasyon), ki pral egzekite nan dis segonn, omwen dis segonn nan operasyon rezo yo pral simulation.

UdpEchoClientHelper

Aplikasyon kliyan an manke configuré nan yon fason prèske menm jan ak sèvè a. Gen yon objè debaz UdpEchoClientApplication, ki kontwole
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));;

Sepandan, pou kliyan an eko nou bezwen mete senk atribi diferan. De premye atribi yo mete nan moman kreyasyon an UdpEchoClientHelper. Nou pase paramèt ke yo itilize (andedan asistan an) pou mete atribi yo "RemoteAddress" и "RemotePort" an akò ak akò nou yo pase paramèt ki nesesè yo bay konstrukteur a k ap ede.

Ann sonje ke nou te itilize IPv4InterfaceContainer pou swiv adrès IP nou te asiyen nan aparèy nou yo. Koòdone a nil nan veso a interfaces pral koresponn ak adrès IP nan ne a nil nan veso a nœuds. Premye koòdone nan veso a interfaces koresponn ak adrès IP premye ne nan veso a nœuds. Se konsa, nan premye liy kòd la (pi wo a), nou kreye yon asistan epi di li ke adrès aleka kliyan an pral adrès IP ki asiyen nan lame a kote sèvè a sitiye. Nou osi dir ki nou bezwen aranz pou anvoy bann pake lo port nef.

Atribi "MaxPackets" la di kliyan an kantite maksimòm pake nou ka voye pandan simulation an. Atribi "Entèval" di kliyan an konbyen tan pou tann ant pake yo, ak atribi "PacketSize" di kliyan an ki jan gwo chaj pake a ta dwe. Avèk konbinezon atribi sa a nou di kliyan an voye yon sèl pake 1024-byte.

Menm jan ak sèvè a eko, nou mete atribi yo nan kliyan an eko Kòmanse и Sispann, men isit la nou kòmanse kliyan an yon dezyèm apre sèvè a vire sou (de segonn apre kòmansman an nan simulation).

4.2.8 Similatè

Nan pwen sa a nou bezwen kouri simulation la. Sa a se fè lè l sèvi avèk fonksyon mondyal la Similatè::Kouri.

Simulator::Run ();

Lè nou te deja rele metòd,

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

nou aktyèlman pwograme evènman nan similatè a nan 1,0 segonn, 2,0 segonn, ak de evènman nan 10,0 segonn. Apre apèl la Similatè::Kouri, sistèm nan ap kòmanse wè lis evènman pwograme yo epi egzekite yo. Li pral premye dife yon evènman apre 1,0 segonn, ki pral deklanche aplikasyon an sèvè eko (evènman sa a ka nan vire pwograme anpil lòt evènman). Lè sa a, li pral tire yon evènman pwograme nan t = 2,0 segonn ki pral lanse aplikasyon an kliyan eko. Yon fwa ankò, evènman sa a ka gen anpil plis evènman te planifye. Enplemantasyon evènman an kòmanse nan kliyan an eko pral kòmanse faz transfè done nan simulation la pa voye yon pake nan sèvè a.

Zak la voye yon pake nan sèvè a pral deklanche yon chèn nan evènman ki pral otomatikman pwograme dèyè sèn nan epi ki pral aplike mekanik yo nan voye yon pake eko dapre paramèt yo distribisyon nou te mete nan script la.

Kòm yon rezilta, depi nou ap voye yon sèl pake (sonje, atribi a MaxPackets te mete nan yon sèl), chèn nan evènman inisye pa sa a ping kliyan sèl pral fini ak simulation a pral antre nan mòd sibstiti. Yon fwa sa rive, rès evènman pwograme yo pral evènman yo Sispann pou sèvè ak kliyan. Lè evènman sa yo egzekite, p'ap gen okenn evènman ki rete pou plis traitement Et Similatè::Kouri pral retounen kontwòl. Simulasyon an konplè.

Tout sa ki rete se netwaye apre tèt ou. Sa a se fè lè w rele fonksyon mondyal la Similatè::Detwi. Paske fonksyon k ap ede yo (oswa kòd ns-3 ki ba-nivo) yo te rele, ki òganize pou kwòk yo te mete nan similatè a pou detwi tout objè ki te kreye yo. Ou pa t 'bezwen swiv nenpòt nan objè sa yo tèt ou - tout sa ou te dwe fè se te rele Similatè::Detwi epi ale deyò. Sistèm ns-3 a pral fè travay di sa a pou ou. Liy ki rete yo nan premye script ns-3 nou an, first.cc, fè sa:

Simulator::Destroy ();
return 0;
}

Ki lè similatè a pral sispann?

ns-3 se yon similatè evènman disrè (DE). Nan yon similatè sa a, chak evènman asosye ak tan ekzekisyon li yo, epi simulation la ap kontinye pa trete evènman yo nan lòd yo rive pandan simulation la ap pwogrese. Evènman yo ka lakòz evènman nan lavni yo dwe pwograme (pa egzanp, yon revèy ka repwograme tèt li pou fini konte nan entèval kap vini an).

Premye evènman yo anjeneral inisye pa antite a, pou egzanp IPv6 pral pwograme dekouvèt la nan sèvis sou rezo a, demann vwazen, elatriye. Aplikasyon an pwograme premye evènman voye pake a, ak sou sa. Lè yon evènman trete, li ka jenere zewo, youn, oswa plis evènman. Kòm simulation la ap pwogrese, evènman yo rive, swa fini oswa kreye nouvo. Simulation an ap sispann otomatikman si keu evènman an vid oswa si yon evènman espesyal detekte Sispann. Evènman Sispann ki te pwodwi pa fonksyon an Similatè::Stop (sispann tan).

Gen yon ka tipik kote Simulator::Stop se absoliman nesesè yo sispann simulation la: lè gen evènman endepandan. Evènman pwòp tèt ou yo (oswa repete) yo se evènman ki toujou repwograme. Kòm yon konsekans, yo toujou kenbe keu evènman an pa vid. Gen anpil pwotokòl ak modil ki gen evènman repete, pa egzanp:

• FlowMonitor - tcheke peryodik pou pake ki pèdi;

• RIPng – emisyon peryodik mizajou tablo routage;

• elatriye.

Nan ka sa yo Similatè::Stop nesesè yo sispann simulation la kòrèkteman. Anplis de sa, lè ns-3 nan mòd imitasyon, RealtimeSimulator la itilize pou senkronize revèy simulation ak revèy machin lan, epi Similatè::Stop nesesè yo sispann pwosesis la.

Anpil nan pwogram simulation nan liv la pa rele Similatè::Stop klèman, depi yo sispann otomatikman lè evènman yo nan keu yo fin itilize. Sepandan, pwogram sa yo pral aksepte tou Simulator::Stop apèl la. Pa egzanp, deklarasyon adisyonèl sa a nan premye pwogram egzanp lan ta pwograme yon arè klè nan 11 segonn:

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

Pi wo a pa pral aktyèlman chanje konpòtman an nan pwogram sa a, depi simulation patikilye sa a natirèlman fini apre 10 segonn. Men, si ou ta chanje tan an sispann nan deklarasyon ki anwo a soti nan 11 segonn a 1 segonn, ou ta remake ke simulation la sispann anvan nenpòt pwodiksyon frape ekran an (depi pwodiksyon an rive apre apeprè 2 segonn nan tan simulation).

Li enpòtan pou rele Simulator::Stop anvan ou rele Simulator::Run; otreman Simulator::Run pa janm ka retounen kontwòl nan pwogram prensipal la pou egzekite arè!

4.2.9 Bati script ou a

Nou te fè kreye scripts senp ou trivial. Tout sa ou dwe fè se mete script ou a nan anyè a grate epi li pral otomatikman bati si ou kouri Waf. Ann eseye. Tounen nan anyè ki pi wo a epi kopi egzanp/tutorial/first.cc nan katalòg la grate

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

Koulye a, bati premye echantiyon script ou lè l sèvi avèk waf:

$ ./waf

Ou ta dwe wè mesaj ki endike ke premye egzanp ou a te kreye avèk siksè.

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)

Koulye a, ou ka kouri egzanp lan (remake ke si ou bati pwogram ou a nan anyè a grate, Lè sa a, ou dwe kouri li soti nan grate):

$ ./waf --run scratch/myfirst

Ou ta dwe wè pwodiksyon menm jan an:

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

Isit la ou ka wè ke sistèm nan bati verifye ke fichye a te bati ak Lè sa a, kouri li. Ou wè antre nan eleman sou kliyan an eko endike ke li voye yon sèl pake 1024-byte nan sèvè eko 10.1.1.2. Ou menm tou ou wè konpozan enregistrement sou sèvè eko pou di ke li te resevwa 1024 octets de 10.1.1.1. Sèvè eko a an silans rejoue pake a epi ou ka wè nan jounal kliyan eko a ke li te resevwa pake li tounen soti nan sèvè a.

4.3 ns-3 Kòd sous

Kounye a ke ou te itilize kèk nan ns-3 èd yo, ou ka pran yon gade nan kèk nan kòd sous la ki aplike fonksyonalite sa a. Ou ka wè dènye kòd la sou sèvè entènèt nou an nan lyen sa a: https://gitlab.com/nsnam/ns-3-dev.git. La ou pral wè paj rezime Mercurial pou pyebwa devlopman ns-3 nou an. Nan tèt paj la ou pral wè plizyè lyen,

summary | shortlog | changelog | graph | tags | files

Ale pi devan epi chwazi lyen dosye yo. Men ki jan pi wo nivo pi fò nan depo nou yo pral sanble:

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

Scripts egzanp nou yo nan anyè a egzanp. Si ou klike sou egzanp yo ou pral wè yon lis sou-repertoires. Youn nan fichye yo nan sous-anyè a leson patikilye - first.cc... Si ou klike sou premye.cc ou pral wè kòd ou jis aprann.

Kòd sous la sitou sitiye nan anyè a src. Ou ka wè kòd sous la lè w klike sou non anyè a oswa klike sou lyen dosye ki adwat non anyè a. Si w klike sou anyè src a, w ap jwenn yon lis sou-dosyè src. Lè sa a, si ou klike sou sou-anyè debaz la, w ap jwenn yon lis dosye. Premye fichye w ap wè (nan moman w ap ekri gid sa a) se avòte.h. Si w klike sou lyen an avòte.h, ou pral voye nan dosye sous la pou avòte.h, ki gen makro itil pou sòti nan scripts si yo detekte kondisyon nòmal. Ou ka jwenn kòd sous pou moun k ap ede nou itilize nan chapit sa a nan anyè a src/Aplikasyon/asistan. Ou lib pou fouye pye bwa anyè a pou w konnen ki sa ki kote epi konprann estil pwogram ns-3 yo.

Sous: www.habr.com

Add nouvo kòmantè