Ns-3 tarmoq simulyatori bo'yicha qo'llanma. 4-bob

Ns-3 tarmoq simulyatori bo'yicha qo'llanma. 4-bob
1,2-bob
3-bob

4 Kontseptsiyaga umumiy nuqtai
4.1 Asosiy abstraktsiyalar
4.1.1 Tugun
4.1.2 Ilova
4.1.3 Kanal
4.1.4 Tarmoq qurilmasi
4.1.5 Topologik yordamchilar
4.2 Birinchi ns-3 skripti
4.2.1 Boilerplate kodi
4.2.2 Plaginlar
4.2.3 ns3 nom maydoni
4.2.4 Jurnalga yozish
4.2.5 Asosiy funksiya
4.2.6 Topologiya yordamchilaridan foydalanish
4.2.7 Ilovadan foydalanish
4.2.8 Simulyator
4.2.9 Skriptingizni yaratish
4.3 ns-3 Manba kodi

bob 4

Kontseptsiyaga umumiy nuqtai

Biz ns-3 kodini o'rganish yoki yozishni boshlashdan oldin qilishimiz kerak bo'lgan birinchi narsa tizimdagi bir nechta asosiy tushunchalar va abstraksiyalarni tushuntirishdir. Bularning aksariyati ba'zilar uchun tushunarli bo'lib tuyulishi mumkin, ammo biz bu qismni o'qishga vaqt ajratishni tavsiya qilamiz, bu sizni mustahkam poydevor ustida boshlaganingizga ishonch hosil qilish uchun.

4.1 Asosiy abstraktsiyalar

Ushbu bo'limda biz Internetda keng qo'llaniladigan, ammo ns-3 da o'ziga xos ma'noga ega bo'lgan ba'zi atamalarni ko'rib chiqamiz.

4.1.1 Tugun

Internet jargonida tarmoqqa ulanadigan kompyuter qurilmasi xost yoki ba'zan oxirgi tizim deb ataladi. Ns-3 internet simulyatori emas, balki tarmoq simulyatori bo'lgani uchun biz atayin xost atamasidan foydalanmaymiz, chunki bu Internet va uning protokollari bilan chambarchas bog'liq. Buning o'rniga biz grafik nazariyasidan kelib chiqqan boshqa simulyatorlar tomonidan qo'llaniladigan umumiyroq atamadan foydalanamiz: tugun (Tugunni tanlang).

Ns-3 da hisoblash qurilmasining asosiy abstraksiyasi tugun deb ataladi. Bu abstraksiya C++ da Node sinfi bilan ifodalanadi. Sinf NodeNode (tugun) simulyatsiyalarda hisoblash qurilmalari tasvirlarini manipulyatsiya qilish usullarini taqdim etadi.

Siz tushunishingiz kerak Node funksiyalarni qo'shadigan kompyuter kabi. Siz ilovalar, protokollar to'plami va kompyuterga foydali ishlarni bajarishga imkon beruvchi drayverlarga ega periferik kartalar kabi narsalarni qo'shasiz. Biz ns-3 da bir xil asosiy modeldan foydalanamiz.

4.1.2 Ilova

Umuman olganda, kompyuter dasturlari ikkita keng sinfga bo'linadi. Tizim dasturiy ta'minoti ba'zi bir hisoblash modeliga ko'ra xotira, protsessor davrlari, disk, tarmoq va boshqalar kabi turli xil kompyuter resurslarini tashkil qiladi. Tizim dasturiy ta'minoti odatda foydalanuvchiga bevosita foyda keltiradigan vazifalarni bajarish uchun ushbu resurslardan foydalanmaydi. Foydalanuvchi odatda ma'lum maqsadga erishish uchun dasturni ishga tushiradi, u tizim dasturiy ta'minoti tomonidan boshqariladigan resurslarni oladi va foydalanadi.

Ko'pincha tizim va amaliy dasturiy ta'minot o'rtasidagi ajratish chizig'i operatsion tizim tuzoqlarida yuzaga keladigan imtiyozlar darajasidagi o'zgarishlarda chiziladi. ns-3 operatsion tizimning haqiqiy tushunchasiga ega emas va shuning uchun imtiyoz darajalari yoki tizim chaqiruvlari tushunchasi yo'q. Biroq, bizda ilova uchun g'oya bor. Xuddi "haqiqiy dunyo" dasturiy ta'minot ilovalari vazifalarni bajarish uchun kompyuterlarda ishlaydi, ns-3 ilovalari simulyatsiya qilingan dunyoda simulyatsiyalarni boshqarish uchun ns-3 tugunlarida ishlaydi.

ns-3 da, modellashtirish uchun ba'zi faoliyatni yaratuvchi foydalanuvchi dasturi uchun asosiy abstraksiya ilova hisoblanadi. Bu abstraksiya C++ da Application sinfi bilan ifodalanadi. Ilovalar sinfi simulyatsiyalarda ilovalarning foydalanuvchi darajasidagi versiyasini ko'rishni boshqarish usullarini taqdim etadi. Ishlab chiquvchilar yangi ilovalar yaratish uchun dastur sinfini ob'ektga yo'naltirilgan dasturlash ma'nosida ixtisoslashtirishlari kutilmoqda. Ushbu qo'llanmada biz Ilovalar sinfining mutaxassisliklaridan foydalanamiz UdpEchoClientApplication и UdpEchoServerApplication. Siz kutganingizdek, ushbu ilovalar tarmoq paketlarini yaratish va aks ettirish uchun foydalaniladigan mijoz/server ilovalari to'plamini tashkil qiladi.

4.1.3 Kanal

Haqiqiy dunyoda siz kompyuterni tarmoqqa ulashingiz mumkin. Ko'pincha ushbu tarmoqlarda ma'lumotlar uzatiladigan media kanallar deb ataladi. Ethernet kabelini rozetkaga ulaganingizda, siz kompyuteringizni Ethernet havolasiga ulaysiz. Simulyatsiya qilingan ns-3 dunyosida aloqa kanalini ifodalovchi ob'ektga tugun ulanadi. Bu erda aloqa quyi tarmog'ining asosiy abstraktsiyasi kanal deb ataladi va C++ tilida Channel klassi bilan ifodalanadi.

sinf ChannelChannel quyi tarmoq ob'ektlarining o'zaro ta'sirini boshqarish va ularga tugunlarni ulash usullarini taqdim etadi. Kanallar, shuningdek, ishlab chiquvchilar tomonidan ob'ektga yo'naltirilgan dasturlash ma'nosida ixtisoslashtirilgan bo'lishi mumkin. Kanal ixtisoslashuvi sim kabi oddiy narsalarni modellashtirishi mumkin. Ajratilgan kanal, shuningdek, simsiz tarmoqlarda katta chekilgan kalit yoki to'siqlarga to'la uch o'lchovli bo'shliq kabi murakkab narsalarni modellashtirishi mumkin.

deb nomlangan ushbu qo'llanmada kanalning maxsus versiyalaridan foydalanamiz CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel и WifiChannelWifiChannel. CsmaChannel, masalan, tashuvchi-sezuvchi bir nechta kirish aloqa muhitini amalga oshiradigan aloqa quyi tarmog'ining versiyasini modellashtiradi. Bu bizga Ethernet-ga o'xshash funksiyalarni beradi.

4.1.4 Tarmoq qurilmasi

Ilgari, agar siz kompyuterni tarmoqqa ulashni istasangiz, ma'lum bir tarmoq kabelini va kompyuterga o'rnatilishi kerak bo'lgan (kompyuter terminologiyasida) periferik karta deb nomlangan apparat qurilmasini sotib olishingiz kerak edi. Agar periferik karta ba'zi tarmoq funktsiyalarini amalga oshirgan bo'lsa, ular tarmoq interfeysi kartalari yoki tarmoq kartalari deb ataladi. Bugungi kunda ko'pchilik kompyuterlar o'rnatilgan tarmoq interfeysi apparati bilan ta'minlangan va foydalanuvchilar tomonidan alohida qurilmalar sifatida ko'rilmaydi.

Tarmoq kartasi uning apparatini boshqaradigan dasturiy ta'minot drayverisiz ishlamaydi. Unix (yoki Linux) da periferik uskunaning bir qismi qurilma sifatida tasniflanadi. Qurilmalar qurilma drayverlari yordamida boshqariladi va tarmoq qurilmalari (NICs) tarmoq qurilmalari drayverlari yordamida boshqariladi (tarmoq qurilmalari drayverlari) va birgalikda tarmoq qurilmalari (tarmoq qurilmalari). Unix va Linuxda siz tarmoq qurilmalariga kabi nomlar bilan murojaat qilasiz eth0.

ns-3da tarmoq qurilmasining abstraktsiyasi dasturiy ta'minot drayverini ham, modellashtirilayotgan apparatni ham qamrab oladi. Simulyatsiyada tarmoq qurilmasi boshqa tugunlar bilan kanallar orqali muloqot qilish imkonini beradigan tugunga "o'rnatiladi". Haqiqiy kompyuter kabi, tugun bir nechta qurilmalar orqali bir nechta kanallarga ulanishi mumkin NetDevices.

Qurilmaning tarmoq abstraktsiyasi C++ da sinf tomonidan ifodalanadi NetDevice. Sinf NetDevice Node va Channel obyektlariga ulanishlarni boshqarish usullarini taqdim etadi; va ob'ektga yo'naltirilgan dasturlash ma'nosida ishlab chiquvchilar tomonidan ixtisoslashtirilgan bo'lishi mumkin. Ushbu qo'llanmada biz NetDevice deb nomlangan bir nechta maxsus versiyalaridan foydalanamiz CsmaNetDevice, PointToPointNetDevice и WifiNetDevice. Xuddi Ethernet tarmoq adapteri tarmoq bilan ishlash uchun mo'ljallangan Ethernet, CsmaNetDevice bilan ishlash uchun mo'ljallangan CsmaChannel, PointToPointNetDevice bilan ishlash uchun mo'ljallangan PointToPointChannelva WifiNetDevice - bilan ishlash uchun mo'ljallangan Wifi kanali.

4.1.5 Topologik yordamchilar

Haqiqiy tarmoqda siz tarmoq kartalari qo'shilgan (yoki o'rnatilgan) asosiy kompyuterlarni topasiz. Ns-3 da siz NetDevices biriktirilgan tugunlarni ko'rasiz, deb aytamiz. Katta simulyatsiya qilingan tarmoqda siz ko'plab ob'ektlar orasidagi ulanishlarni tashkil qilishingiz kerak bo'ladi Node, NetDevice и kanal.

NetDevices-ni tugunlarga, NetDevices-ni havolalarga ulash, IP-manzillarni belgilash va hokazo. ns-3 da bu umumiy vazifadir, buni iloji boricha osonlashtirish uchun biz topologiya yordamchilari deb ataladigan narsalarni taqdim etamiz. Misol uchun, NetDevice yaratish uchun siz ko'plab ns-3 yadro operatsiyalarini bajarishingiz, MAC manzilini qo'shishingiz, tarmoq qurilmasini Node-ga o'rnatishingiz, tugunning protokollar stekini sozlashingiz va keyin NetDevice-ni Kanalga ulashingiz kerak. Bir nechta qurilmalarni ko'p nuqtali havolalarga ulash va keyin alohida tarmoqlarni Internetworks tarmog'iga ulash uchun ko'proq ish talab etiladi. Biz sizga qulaylik uchun ushbu ko'plab operatsiyalarni ishlatish uchun qulay modelga birlashtirgan topologiya yordamchi ob'ektlarini taqdim etamiz.

4.2 Birinchi ns-3 skripti

Agar siz tizimni yuqorida aytib o'tilganidek o'rnatgan bo'lsangiz, siz uy katalogingizdagi repos deb nomlangan katalogda ns-3 versiyasiga ega bo'lasiz. Katalogga o'ting ozod qilish

Agar sizda bunday katalog bo'lmasa, demak siz ns-3 versiyasini yaratishda chiqish katalogini ko'rsatmagansiz, quyidagi tarzda tuzing:
$ ./waf configure —build-profile=release —out=build/release,
$./waf qurish

u erda quyidagiga o'xshash katalog tuzilishini ko'rishingiz kerak:

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

Katalogga o'ting misollar/qo'llanma. Siz u erda joylashgan faylni ko'rishingiz kerak birinchi.cc. Bu ikkita tugun o'rtasida oddiy nuqtadan nuqtaga ulanishni yaratadigan va tugunlar o'rtasida bitta paketni uzatadigan skript. Keling, ushbu skriptni satr bo'yicha ko'rib chiqaylik; buning uchun sevimli muharriringizda first.cc-ni oching.

4.2.1 Boilerplate kodi
Fayldagi birinchi qator muharrir rejimi qatoridir emacs. U emacsga biz manba kodimizda foydalanadigan formatlash qoidalari (kodlash uslubi) haqida gapirib beradi.

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

Bu har doim juda munozarali masala, shuning uchun biz uni darhol yo'q qilish uchun rekord o'rnatishimiz kerak. Ns-3 loyihasi, aksariyat yirik loyihalar singari, barcha kiritilgan kodlar mos kelishi kerak bo'lgan kodlash uslubini qabul qildi. Agar siz loyihaga kodingizni qo'shmoqchi bo'lsangiz, faylda tavsiflanganidek, oxir-oqibat ns-3 kodlash standartiga mos kelishingiz kerak bo'ladi. doc/codingstd.txt yoki loyiha veb-sahifasida ko'rsatilgan: https://www.nsnam.org/develop/contributing-code/coding-style/.

Sizga ns-3 kodining ko'rinishi va hissiyotiga o'rganishingizni va bizning kodimiz bilan ishlaganingizda ushbu standartni qo'llashingizni tavsiya qilamiz. Butun ishlab chiqish guruhi va ishtirokchilar biroz norozilikdan keyin bunga rozi bo'lishdi. Yuqoridagi emacs rejimi qatori emacs muharriridan foydalanayotgan bo'lsangiz, to'g'ri formatlashni osonlashtiradi.

Ns-3 simulyatori litsenziyalangan GNU Umumiy Davlat Litsenziyasi. Har bir ns-3 tarqatish faylida tegishli GNU huquqiy sarlavhasini ko'rasiz. Ko'pincha siz ns-3 loyihasida ishtirok etuvchi muassasalardan biri uchun mualliflik huquqi to'g'risidagi bildirishnomani quyida ko'rsatilgan GPL matni va muallifi ustida ko'rasiz.

/* 
* 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 Plaginlar

Kodning o'zi bir qator qo'shish bayonotlari bilan boshlanadi (o'z ichiga oladi).

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

Yuqori darajadagi skript foydalanuvchilariga tizimda mavjud bo'lgan ko'p sonli sarlavha fayllari bilan kurashishda yordam berish uchun biz ularni foydalanish bo'yicha katta modullarga guruhlaymiz. Biz berilgan modulda ishlatiladigan barcha sarlavha fayllarini rekursiv yuklaydigan bitta sarlavha faylini taqdim etamiz. Sizga kerak bo'lgan sarlavhani qidirish va, ehtimol, to'g'ri bog'liqliklar ro'yxatini olish o'rniga, biz sizga katta hajmdagi fayllar guruhini yuklab olish imkoniyatini beramiz. Bu eng samarali yondashuv emas, lekin bu, albatta, skriptlarni yozishni ancha osonlashtiradi.

ns-3 o'z ichiga olgan fayllarning har biri nomli katalogga joylashtirilgan ns3 (quyi katalog yaratish) yaratish jarayonida fayl nomi ziddiyatlarini oldini olish uchun. Fayl ns3/core-module.h ns-3 moduliga mos keladi, siz uni katalogdan topasiz src/yadro siz o'rnatgan relizda. Ushbu katalog ro'yxatida siz ko'p sonli sarlavhali fayllarni topasiz. Siz yig'ilishni qilganingizda, Waf umumiy sarlavha fayllarini pastki katalogdagi ns3 katalogiga joylashtiradi qurish / disk raskadrovka

Agar sizda bunday katalog bo'lmasa, demak siz ns-3 versiyasini yaratishda chiqish katalogini ko'rsatmagansiz, quyidagi tarzda tuzing:
$ ./waf configure --build-profile=debug --out=build/debug
$./waf qurish
yoki
$ ./waf configure --build-profile=optimized --out=build/optimized
$./waf qurish

yoki qurish/optimallashtirilgan, konfiguratsiyangizga qarab. Waf shuningdek, barcha umumiy sarlavha fayllarini yuklash uchun modulni o'z ichiga olgan faylni avtomatik ravishda yaratadi. Albatta, siz ushbu qo'llanmani diniy ravishda kuzatib borganingiz uchun, siz allaqachon bajargansiz

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

misollar va testlarni o'z ichiga olgan disk raskadrovka tuzilmalarini ishga tushirish uchun loyihani sozlash. Siz ham qildingiz

$ ./waf

loyihani yig'ish uchun. Shunday qilib, endi siz katalogga qaraganingizda ../../build/debug/ns3, keyin u erda siz boshqalar qatorida yuqorida ko'rsatilgan to'rtta modulning sarlavha fayllarini topasiz. Siz ushbu fayllarning mazmunini ko'rib chiqishingiz va ular tegishli modullar tomonidan ishlatiladigan barcha umumiy fayllarni o'z ichiga olganligini topishingiz mumkin.

4.2.3 ns3 nom maydoni

Skriptdagi keyingi qator birinchi.cc nom maydoni deklaratsiyasidir.

using namespace ns3;

Ns-3 loyihasi ns3 deb nomlangan C++ nom maydonida amalga oshiriladi. Bu ns-3 bilan bog'liq barcha deklaratsiyalarni global nomlar maydonidan tashqarida guruhlaydi, bu boshqa kod bilan integratsiyaga yordam beradi deb umid qilaman. C++ operatoridan foydalanish joriy (global) deklarativ hududga ns-3 nom maydonini kiritadi. Bu deklaratsiyadan keyin uni ishlatish uchun barcha ns-3 kodingizdan oldin ns3::scope ruxsat operatorini kiritishingiz shart emasligini aytishning ajoyib usuli. Agar siz nomlar maydoni bilan tanish bo'lmasangiz, deyarli har qanday C++ darsligiga murojaat qiling va std nom maydoni va deklaratsiyasidan foydalanib ns3 nom maydonini solishtiring. using namespace std; chiqish operatori bilan ishlash misollarida qiymati va oqimlar.

4.2.4 Jurnalga yozish

Skriptning keyingi qatori:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Biz ushbu bayonotdan hujjatlar tizimimizni muhokama qilish uchun qulay joy sifatida foydalanamiz Kislorod. Agar siz ns-3 loyihasi veb-saytiga qarasangiz, navigatsiya panelida Hujjatlar havolasini topasiz. Agar siz ushbu havolani bossangiz, bizning hujjatlar sahifamizga o'tasiz. Sizni ns-3 ning eng so'nggi barqaror versiyasi uchun hujjatlarga olib boradigan "So'nggi nashr" havolasi mavjud. Agar siz "API Documentation" havolasini tanlasangiz, siz ns-3 API hujjatlari sahifasiga o'tasiz.

Sahifaning chap tomonida siz hujjatlar tuzilishining grafik tasvirini topasiz. Boshlash uchun yaxshi joy - ns-3 navigatsiya daraxtidagi Modules ns-3 "kitobi". Agar oshkor qilsangiz Modules, siz ns-3 modullari hujjatlari ro'yxatini ko'rasiz. Yuqorida muhokama qilinganidek, bu erda modul tushunchasi bevosita yuqoridagi modulga kiritilgan fayllar bilan bog'liq. ns-3 logging quyi tizimi bo'limda muhokama qilinadi Ro'yxatga olish modulidan foydalanish, shuning uchun biz ushbu qo'llanmada keyinroq unga qaytamiz, ammo modulni ko'rib chiqish orqali yuqoridagi bayonot bilan tanishishingiz mumkin Coreva keyin kitobni oching Nosozliklarni tuzatish vositalariva keyin sahifani tanlang Ro'yxatga olish. ni bosing Ro'yxatga olish.

Endi siz hujjatlarni ko'rib chiqishingiz kerak Kislorod modul uchun Ro'yxatga olish. Sahifaning yuqori qismidagi makroslar ro'yxatida siz NS_LOG_COMPONENT_DEFINE uchun yozuvni ko'rasiz. Havolani bosishdan oldin, umuman qanday ishlashini tushunish uchun ro'yxatga olish modulining "Batafsil tavsifi" ni ko'rib chiqing. Buni amalga oshirish uchun pastga aylantiring yoki diagramma ostidagi "Ko'proq..." ni tanlang.

Nima bo'layotgani haqida umumiy tasavvurga ega bo'lgach, davom eting va maxsus NS_LOG_COMPONENT_DEFINE uchun hujjatlarni ko'rib chiqing. Hujjatlarni bu erda takrorlamayman, lekin xulosa qilish uchun bu qator ro'yxatga olish komponentini e'lon qiladi. FirstScript Misol, bu nomga havola orqali xabarlarning konsol jurnalini yoqish yoki o'chirish imkonini beradi.

4.2.5 Asosiy funksiya

Skriptning quyidagi satrlarida siz ko'rasiz,

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

Bu oddiygina dasturingiz (skript) asosiy funksiyasining deklaratsiyasi. Har qanday C++ dasturida bo'lgani kabi, siz asosiy funktsiyani belgilashingiz kerak, bu birinchi navbatda amalga oshiriladi. Bu erda hech qanday maxsus narsa yo'q. Sizning ns-3 skriptingiz faqat C++ dasturidir. Quyidagi satr vaqt o'lchamlarini 1 nanosekundga o'rnatadi, bu sukut bo'yicha:

Time::SetResolution (Time::NS);

Vaqt rezolyutsiyasi yoki oddiygina rezolyutsiya, ishlatilishi mumkin bo'lgan eng kichik vaqt qiymatidir (ikki vaqt orasidagi eng kichik farq). Ruxsatni bir marta o'zgartirishingiz mumkin. Ushbu moslashuvchanlikni ta'minlaydigan mexanizm xotirani iste'mol qiladi, shuning uchun aniqlik aniq o'rnatilgandan so'ng, biz xotirani bo'shatamiz, keyingi yangilanishlarni oldini olamiz. (Agar siz ruxsatni aniq belgilamasangiz, u sukut bo'yicha bir nanosekundga o'rnatiladi va simulyatsiya boshlanganda xotira bo'shatiladi.)

Quyidagi ikkita skript qatori ilovalarga o'rnatilgan ikkita ro'yxatga olish komponentini yoqish uchun ishlatiladi EchoClient и EchoServer:

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

Agar siz Logging komponenti uchun hujjatlarni o'qib chiqsangiz, har bir komponentda yoqishingiz mumkin bo'lgan bir nechta jurnallar/granularity darajalari mavjudligini ko'rasiz. Ushbu ikkita kod qatori echo mijozlari va serverlari uchun INFO darajasida disk raskadrovka jurnalini yozish imkonini beradi. Ushbu darajada, dastur simulyatsiya paytida paketlarni jo'natish va qabul qilishda xabarlarni chop etadi.

Endi biz topologiyani yaratish va simulyatsiyani amalga oshirish bilan shug'ullanamiz. Bu ishni imkon qadar oson qilish uchun topologiya yordamchi ob'ektlaridan foydalanamiz.

4.2.6 Topologiya yordamchilaridan foydalanish

Bizning skriptimizdagi keyingi ikkita kod qatori simulyatsiyadagi kompyuterlarni ifodalovchi Node ns-3 obyektlarini yaratadi.

NodeContainer nodes;
nodes.Create (2);

Davom etishdan oldin sinf uchun hujjatlarni topamiz NodeContainer. Berilgan sinf uchun hujjatlarga kirishning yana bir usuli - bu yorliq orqali Darslar sahifalarida Kislorod. Agar sizda allaqachon Doxygen ochiq bo'lsa, shunchaki sahifaning yuqori qismiga o'ting va Sinflar yorlig'ini tanlang. Siz yangi yorliqlar to'plamini ko'rishingiz kerak, ulardan biri sinflar ro'yxati. Ushbu yorliq ostida siz barcha ns-3 sinflarining ro'yxatini ko'rasiz. Pastga aylantiring ns3 :: NodeContainer. Sinfni topganingizda, sinf hujjatlariga o'tish uchun uni tanlang.

Esda tutganimizdek, bizning asosiy abstraksiyalarimizdan biri bu tugundir. Bu biz protokollar to'plami, ilovalar va periferik kartalar kabi narsalarni qo'shmoqchi bo'lgan kompyuterni ifodalaydi. Topologiya yordamchisi NodeContainer har qanday ob'ektlarni yaratish, boshqarish va ularga kirishning qulay usulini taqdim etadi Node, biz simulyatsiyani ishga tushirish uchun yaratamiz. Yuqoridagi birinchi qator oddiygina e'lon qiladi NodeContainer, biz tugunlar deb ataymiz. Ikkinchi qator tugunlar ob'ektidagi Create usulini chaqiradi va konteynerdan ikkita tugun yaratishni so'raydi. da tasvirlanganidek Kislorod, konteyner ns-3 tizimidan ikkita ob'ekt yaratishni so'raydi Node va ushbu ob'ektlarga ko'rsatgichlarni ichkarida saqlaydi.

Skriptda yaratilgan tugunlar hali hech narsa qilmaydi. Topologiyani yaratishning navbatdagi bosqichi tugunlarimizni tarmoqqa ulashdir. Biz qo'llab-quvvatlaydigan tarmoqning eng oddiy shakli bu ikkita tugun o'rtasidagi nuqtadan nuqtaga ulanishdir. Endi biz bunday aloqani yaratamiz.

PointToPointHelper

Ulanish uchun zarur bo'lgan past darajadagi ishni bajarish uchun topologiya yordamchi ob'ektidan foydalanib, tanish naqsh yordamida nuqtadan nuqtaga ulanishni yaratamiz. Esda tutingki, bizning ikkita asosiy abstraksiyamiz NetDevice и kanal. Haqiqiy dunyoda bu atamalar taxminan periferik kartalar va tarmoq kabellariga mos keladi. Odatda, bu ikki narsa bir-biri bilan chambarchas bog'liq va hech kim, masalan, qurilmalarni almashishga ishona olmaydi. Ethernet simsiz kanal orqali. Bizning topologiya yordamchilarimiz ushbu yaqin munosabatni kuzatib boradilar va shuning uchun siz ushbu stsenariyda bitta ob'ektdan foydalanasiz PointToPointHelper ns-3 ob'ektlarini o'rnatish va ulash uchun PointToPointNetDevice и PointToPointChannel. Skriptdagi keyingi uchta qator:

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

Birinchi qator,

PointToPointHelper pointToPoint;

stekdagi ob'ektning namunasini yaratadi PointToPointHelper. Yuqori darajadagi nuqtai nazardan quyidagi qator,

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

ob'ektni aytadi PointToPointHelper "5 Mbit/s" (sekundiga besh megabit) qiymatidan "" sifatida foydalaning.DataRate".

Aniqroq nuqtai nazardan, "DataRate" qatori biz atribut deb ataydigan narsaga mos keladi PointToPointNetDevice. Agar qarasangiz Kislorod sinf uchun ns3::PointToPointNetDevice va usul uchun hujjatlarda GetTypeId qurilma uchun belgilangan atributlar ro'yxatini topasiz. Ular orasida atribut bo'ladi "DataRate" Ko'pchilik foydalanuvchi ko'radigan ns-3 ob'ektlari o'xshash atributlar ro'yxatiga ega. Keyingi bo'limda ko'rib turganingizdek, biz ushbu mexanizmdan simulyatsiyani qayta kompilyatsiya qilmasdan osongina o'rnatish uchun foydalanamiz.

kabi "DataRate" PointToPointNetDevice da siz PointToPointChannel bilan bog'langan "Kechikish" atributini topasiz. Yakuniy qator

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

U gapiradi PointToPointHelper "2 ms" (ikki millisekund) qiymatini keyinchalik yaratadigan nuqtadan nuqtaga ulanish uchun tarqalish kechikish qiymati sifatida foydalaning.

NetDeviceContainer

Ayni paytda bizda skript mavjud NodeContainer, unda ikkita tugun mavjud. Bizda bor PointToPointHelper, ob'ektlarni yaratish uchun tayyorlangan PointToPointNetDevices va ularni PointToPointChannel obyekti yordamida ulash. Tugunlarni yaratish uchun NodeContainer topologiyasi yordamchi ob'ektidan foydalanganimizdek, biz so'raymiz PointToPointHelper qurilmalarimizni yaratish, sozlash va o'rnatish bilan bog'liq ishlarni bajarish. Bizga barcha yaratilgan ob'ektlar ro'yxati kerak NetDevice, shuning uchun biz foydalanamiz NetDeviceContainer ularni xuddi biz ishlatgan tarzda saqlash uchun NodeContainer biz yaratgan tugunlarni saqlash uchun. Keyingi ikki qator kod,

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

qurilma va kanalni to‘liq sozlash. Birinchi qator yuqorida aytib o'tilgan qurilma konteynerini e'lon qiladi, ikkinchisi esa asosiy ishni bajaradi. Usul o'rnatmoq ob'ekt PointToPointHelper qabul qiladi NodeContainer parametr sifatida. Ichkarida NetDeviceContainer joylashgan har bir tugun uchun NodeContainer yaratilgan (nuqtadan nuqtaga aloqa uchun ulardan ikkitasi bo'lishi kerak) PointToPointNetDevice qurilma konteynerida yaratiladi va saqlanadi. PointToPointChannel yaratilgan va ikkitasi unga biriktirilgan PointToPointNetDevices. Ob'ektlarni yaratgandan so'ng, atributlar saqlanadi PointToPointHelper, yaratilgan ob'ektlardagi mos atributlarni ishga tushirish uchun ishlatiladi.

Qo'ng'iroq qilgandan keyin pointToPoint.Install (tugunlar) biz ikkita tugunga ega bo'lamiz, ularning har birida nuqtadan nuqtaga tarmoq qurilmasi o'rnatilgan va ular orasidagi bitta nuqtadan nuqtaga bog'langan. Ikkala qurilma ham ma'lumotlarni sekundiga besh megabit tezlikda uzatish uchun kanal bo'ylab ikki millisekundlik kechikish bilan konfiguratsiya qilinadi.

InternetStackHelper

Endi bizda tugunlar va qurilmalar konfiguratsiya qilingan, ammo tugunlarimizda protokol steklari o'rnatilmagan. Keyingi ikki kod qatori bunga g'amxo'rlik qiladi.

InternetStackHelper stack;
stack.Install (nodes);

InternetStackHelper - nuqtadan nuqtaga tarmoq qurilmalari uchun PointToPointHelperga o'xshash Internet steklari uchun topologiya yordamchisi. Usul o'rnatmoq parametr sifatida NodeContainer ni oladi. Amalga oshirilganda, u har bir konteyner tuguniga Internet stekini (TCP, UDP, IP va boshqalar) o'rnatadi.

IPv4AddressHelper

Keyin biz qurilmalarimizni IP manzillari bilan bog'lashimiz kerak. Biz IP manzillarini taqsimlashni boshqarish uchun topologiya yordamchisini taqdim etamiz. Foydalanuvchiga ko'rinadigan yagona API - bu haqiqiy manzilni taqsimlashda foydalanish uchun asosiy IP-manzil va tarmoq niqobini o'rnatish (bu yordamchining pastki darajasida amalga oshiriladi). Bizning misol skriptimizdagi keyingi ikkita kod qatori birinchi.cc,

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

manzil yordamchi ob'ektini e'lon qiling va uni aniqlash uchun 10.1.1.0 bit maskasidan foydalangan holda 255.255.255.0 tarmog'idan IP manzillarni ajratishni boshlashi kerakligini ayting. Odatiy bo'lib, ajratilgan manzillar bittadan boshlanadi va monoton ravishda ortadi, shuning uchun bu bazadan ajratilgan birinchi manzil 10.1.1.1, keyin 10.1.1.2 va hokazo bo'ladi. Aslida, past darajada, ns-3 tizimi barcha ajratilgan IP-manzillarni eslab qoladi va agar siz tasodifan bir xil manzil ikki marta yaratilgan vaziyatni yaratsangiz (aytmoqchi, bu xatoni tuzatish qiyin) halokatli xatoni keltirib chiqaradi.

Quyidagi kod qatori,

Ipv4InterfaceContainer interfaces = address.Assign (devices);

haqiqiy manzilni belgilashni amalga oshiradi. ns-3 da biz IP-manzil va ob'ekt yordamida qurilma o'rtasida aloqa o'rnatamiz IPv4 interfeysi. Bizga ba'zan keyinchalik foydalanish uchun yordamchi tomonidan yaratilgan tarmoq qurilmalari ro'yxati kerak bo'lganidek, ba'zida bizga ob'ektlar ro'yxati kerak bo'ladi IPv4 interfeysi. IPv4 InterfaceContainer bu funksiyani ta'minlaydi.

Biz steklar o'rnatilgan va IP manzillari tayinlangan nuqtadan nuqtaga tarmoq qurdik. Endi trafikni yaratish uchun har bir tugundagi ilovalar kerak.

4.2.7 Ilovadan foydalanish

Ns-3 tizimining asosiy abstraksiyalaridan yana biri ariza (ilova). Ushbu stsenariyda biz ikkita asosiy sinf ixtisoslashuvidan foydalanamiz ariza ns-3 chaqirildi UdpEchoServerApplication и UdpEchoClientApplication. Oldingi holatlarda bo'lgani kabi, biz asosiy ob'ektlarni sozlash va boshqarish uchun yordamchi ob'ektlardan foydalanamiz. Bu erda biz foydalanamiz UdpEchoServerHelper и UdpEchoClientHelper bizning hayotimizni osonlashtirish uchun ob'ektlar.

UdpEchoServerHelper

Birinchi.cc misol skriptimizdagi quyidagi kod satrlari biz avval yaratgan tugunlardan birida UDP echo server ilovasini sozlash uchun ishlatiladi.

UdpEchoServerHelper echoServer (9);

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

Yuqoridagi snippetdagi kodning birinchi qatori yaratiladi UdpEchoServerHelper. Odatdagidek, bu dasturning o'zi emas, u bizga haqiqiy ilovalarni yaratishga yordam beradigan ob'ektdir. Bizning konventsiyalarimizdan biri yordamchi ob'ekt konstruktoriga kerakli atributlarni o'tkazishdir. Bunday holda, yordamchi hech qanday foydali ish qila olmaydi, agar unga server paketlarni tinglaydigan port raqami berilmasa, bu raqam mijozga ham ma'lum bo'lishi kerak. Bunday holda biz port raqamini yordamchi konstruktorga beramiz. Konstruktor, o'z navbatida, oddiygina qiladi SetAttribute o'tgan qiymat bilan. Keyinchalik, agar xohlasangiz, Port atributiga boshqa qiymat o'rnatish uchun SetAttribute dan foydalanishingiz mumkin.

Ko'pgina boshqa yordamchi ob'ektlar kabi ob'ekt UdpEchoServerHelper usuli bor o'rnatmoq. Ushbu usulni samarali bajarish asosiy echo server ilovasini yaratadi va uni xost bilan bog'laydi. Qizig'i shundaki, usul o'rnatmoq qabul qiladi NodeContainer boshqalar kabi parametr sifatida o'rnatmoq usullarini ko‘rib chiqdik.

Bu erda ishlaydigan C++ yashirin konvertatsiyasi usulning natijasini oladi node.Get(1) (tugun ob'ektiga aqlli ko'rsatgichni qaytaradi - Ptr ) va uni anonim ob'ekt uchun konstruktorda ishlatadi NodeContainerkeyin usulga o'tkaziladi o'rnatmoq. Agar siz C++ kodida qaysi usul imzosi tuzilganligini va bajarilishini aniqlay olmasangiz, yashirin konvertatsiyalar qatoriga qarang.

Endi biz buni ko'ramiz echoServer.Install ilovani o'rnatish haqida UdpEchoServerApplication da topilgan NodeContainerbiz tugunlarimizni boshqarish uchun foydalanamiz, indeksli tugun 1. Usul o'rnatmoq barcha ilovalarga ko'rsatgichlarni o'z ichiga olgan konteynerni qaytaradi (bu holda bitta, chunki biz anonim NodeContainer, bitta tugunni o'z ichiga olgan) yordamchi tomonidan yaratilgan.

Ilovalar trafikni qachon yaratishni boshlashini belgilashi kerak "boshlash" va uni to'xtatish vaqtini qo'shimcha ravishda belgilash kerak bo'lishi mumkin "STOP". Biz ikkala variantni ham taqdim etamiz. Bu vaqtlar usullar yordamida belgilanadi Ilova konteyneri boshlanish и To'xta. Ushbu usullar turdagi parametrlarni qabul qiladi vaqt. Bu holda biz C++ ni olish uchun C++ konvertatsiyalarining aniq ketma-ketligidan foydalanamiz ikki hissa 1.0 va uni soniyalarga aylantirish uchun Seconds ob'ektidan foydalanadigan tns-3 Time ob'ektiga aylantiring. Esda tutingki, konversiya qoidalari model muallifi tomonidan boshqarilishi mumkin va C++ ning o‘z qoidalari bor, shuning uchun har doim ham parametrlar siz kutgan tarzda o‘zgartirilishiga ishonib bo‘lmaydi. Ikki qator

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

simulyatsiya boshlanganidan keyin bir soniyadan so'ng echo server ilovasini ishga tushirishga (avtomatik ravishda yoqish) va o'n soniyadan keyin to'xtatishga (o'chirish) sabab bo'ladi. Biz o'n soniya ichida bajariladigan simulyatsiya hodisasini (ilovani to'xtatish hodisasi) e'lon qilganimiz sababli, tarmoqning kamida o'n soniya ishlashi simulyatsiya qilinadi.

UdpEchoClientHelper

Mijoz uchun ariza Echo serverga deyarli o'xshash tarzda tuzilgan. Asosiy ob'ekt mavjud UdpEchoClientApplicationtomonidan boshqariladi
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));;

Biroq, echo mijozi uchun biz besh xil atributni o'rnatishimiz kerak. Birinchi ikkita atribut yaratilish vaqtida o'rnatiladi UdpEchoClientHelper. Biz atributlarni o'rnatish uchun foydalaniladigan parametrlarni (yordamchi ichida) o'tkazamiz "Masofaviy manzil" и "RemotePort" bizning kelishuvimizga muvofiq kerakli parametrlarni yordamchi konstruktorga o'tkazish.

Biz foydalanganimizni eslaylik IPv4 InterfaceContainer qurilmalarimizga tayinlagan IP manzillarini kuzatish uchun. Interfeyslar konteyneridagi null interfeysi tugunlar konteyneridagi null tugunning IP manziliga mos keladi. Interfeyslar konteyneridagi birinchi interfeys tugunlar konteyneridagi birinchi tugunning IP manziliga mos keladi. Shunday qilib, kodning birinchi qatorida (yuqorida) biz yordamchi yaratamiz va unga mijozning masofaviy manzili server joylashgan xostga tayinlangan IP-manzil bo'lishini aytamiz. Shuningdek, biz paketlarni to'qqizinchi portga yuborishni tashkil qilishimiz kerakligini aytamiz.

"MaxPackets" atributi mijozga simulyatsiya paytida yuborishimiz mumkin bo'lgan paketlarning maksimal sonini bildiradi. "Interval" atributi mijozga paketlar o'rtasida qancha kutish kerakligini, "PacketSize" atributi esa mijozga paketning foydali yuki qanchalik katta bo'lishi kerakligini aytadi. Ushbu atribut kombinatsiyasi bilan biz mijozga bitta 1024 baytlik paketni yuborishni aytamiz.

Echo serverida bo'lgani kabi, biz echo mijozining atributlarini o'rnatamiz boshlanish и To'xta, lekin bu erda mijozni server yoqilgandan keyin bir soniyadan so'ng ishga tushiramiz (simulyatsiya boshlanganidan ikki soniya o'tgach).

4.2.8 Simulyator

Ushbu nuqtada biz simulyatsiyani ishga tushirishimiz kerak. Bu global funktsiya yordamida amalga oshiriladi Simulyator::Run.

Simulator::Run ();

Biz ilgari usullarni chaqirganimizda,

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

biz aslida simulyatordagi voqealarni 1,0 soniya, 2,0 soniya va ikkita hodisani 10,0 soniyada rejalashtirdik. Qo'ng'iroqdan keyin Simulyator::Run, tizim rejalashtirilgan tadbirlar ro'yxatini ko'rishni va ularni bajarishni boshlaydi. U birinchi navbatda hodisani 1,0 soniyada ishga tushiradi, bu echo server ilovasini ishga tushiradi (bu hodisa o'z navbatida boshqa ko'plab tadbirlarni rejalashtirishi mumkin). Keyin u echo mijoz ilovasini ishga tushiradigan t=2,0 soniyada rejalashtirilgan hodisani ishga tushiradi. Shunga qaramay, ushbu tadbirda yana ko'plab tadbirlar rejalashtirilgan bo'lishi mumkin. Echo-mijozni ishga tushirish hodisasini amalga oshirish serverga paket yuborish orqali simulyatsiyaning ma'lumotlarni uzatish bosqichini boshlaydi.

Paketni serverga yuborish harakati sahna ortida avtomatik ravishda rejalashtiriladigan va biz skriptda o'rnatgan vaqt parametrlariga muvofiq aks-sado paketini yuborish mexanikasini amalga oshiradigan voqealar zanjirini ishga tushiradi.

Natijada, biz faqat bitta paketni jo'natayotganimiz uchun (atributni unutmang MaxPackets bittaga o'rnatildi), bu bitta mijoz ping tomonidan boshlangan voqealar zanjiri tugaydi va simulyatsiya kutish rejimiga o'tadi. Bu sodir bo'lgach, qolgan rejalashtirilgan tadbirlar voqealar bo'ladi To'xta server va mijoz uchun. Ushbu hodisalar bajarilganda, keyingi ishlov berish uchun hech qanday voqea qolmaydi va Simulyator::Run boshqaruvni qaytaradi. Simulyatsiya tugallandi.

Qolgan narsa o'zingizni tozalashdir. Bu global funktsiyani chaqirish orqali amalga oshiriladi Simulyator:: Yo'q qilish. Yaratilgan barcha ob'ektlarni yo'q qilish uchun simulyatorga ilgaklar o'rnatilgan tarzda tashkil etilgan yordamchi funktsiyalar (yoki past darajadagi ns-3 kodi) chaqirilganligi sababli. Bu obyektlarning birortasini o‘zingiz kuzatishingiz shart emas edi – qo‘ng‘iroq qilish kifoya edi Simulyator:: Yo'q qilish va tashqariga chiqing. Ns-3 tizimi bu qiyin ishni siz uchun bajaradi. Birinchi ns-3 skriptimizning qolgan satrlari, first.cc, shunday qiladi:

Simulator::Destroy ();
return 0;
}

Simulyator qachon to'xtaydi?

ns-3 diskret hodisa (DE) simulyatoridir. Bunday simulyatorda har bir hodisa o‘zining bajarilish vaqti bilan bog‘lanadi va simulyatsiya jarayoni sodir bo‘lgan vaqt davomida hodisalarni sodir bo‘ladigan tartibda qayta ishlash orqali davom etadi. Voqealar kelajakdagi voqealarni rejalashtirishga olib kelishi mumkin (masalan, taymer keyingi intervalda hisoblashni tugatish uchun o'zini qayta rejalashtirishi mumkin).

Dastlabki hodisalar odatda tashkilot tomonidan amalga oshiriladi, masalan, IPv6 tarmoqdagi xizmatlarni, qo'shni so'rovlarni va hokazolarni aniqlashni rejalashtiradi. Ilova birinchi paketni yuborish hodisasini rejalashtiradi va hokazo. Voqea qayta ishlansa, u nol, bitta yoki bir nechta hodisalarni yaratishi mumkin. Simulyatsiya davom etar ekan, voqealar tugaydi yoki yangilarini yaratadi. Agar hodisa navbati bo'sh bo'lsa yoki maxsus hodisa aniqlansa, simulyatsiya avtomatik ravishda to'xtaydi To'xta. Tadbir To'xta funktsiyasi tomonidan yaratilgan Simulyator:: To'xtating (to'xtash vaqti).

Simulyatsiyani to'xtatish uchun Simulator::Stop mutlaqo zarur bo'lgan odatiy holat mavjud: o'z-o'zini ta'minlaydigan hodisalar mavjud bo'lganda. O'z-o'zini ta'minlaydigan (yoki takrorlanadigan) hodisalar har doim qayta rejalashtirilgan voqealardir. Natijada, ular har doim voqea navbatini bo'sh qoldirmaydilar. Takroriy hodisalarni o'z ichiga olgan ko'plab protokollar va modullar mavjud, masalan:

• FlowMonitor - yo'qolgan paketlarni davriy tekshirish;

• RIPng – marshrutlash jadvali yangilanishini davriy translyatsiyasi;

• va hokazo.

Bunday hollarda Simulyator:: To'xtating simulyatsiyani to'g'ri to'xtatish uchun zarur. Bundan tashqari, ns-3 emulyatsiya rejimida bo'lsa, RealtimeSimulator simulyatsiya soatini mashina soati bilan sinxronlashtirish uchun ishlatiladi va Simulyator:: To'xtating jarayonni to‘xtatish zarur.

Darslikdagi ko'plab simulyatsiya dasturlari qo'ng'iroq qilmaydi Simulyator:: To'xtating aniq, chunki ular navbatdagi hodisalar tugagandan so'ng avtomatik ravishda tugaydi. Biroq, bu dasturlar Simulator::Stop chaqiruvini ham qabul qiladi. Misol uchun, birinchi misol dasturidagi quyidagi qo'shimcha bayonot 11 soniyada aniq to'xtashni rejalashtiradi:

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

Yuqoridagilar ushbu dasturning xatti-harakatlarini o'zgartirmaydi, chunki bu simulyatsiya tabiiy ravishda 10 soniyadan keyin tugaydi. Ammo agar siz yuqoridagi bayonotdagi to'xtash vaqtini 11 soniyadan 1 soniyaga o'zgartirsangiz, simulyatsiya har qanday chiqish ekranga tushmasdan oldin to'xtashini sezasiz (chunki chiqish simulyatsiya vaqtidan taxminan 2 soniyadan keyin sodir bo'ladi).

Simulyatorga qo'ng'iroq qilishdan oldin Simulator::Stop ga qo'ng'iroq qilish muhim::Run; aks holda Simulator::Run hech qachon to'xtashni bajarish uchun boshqaruvni asosiy dasturga qaytarmasligi mumkin!

4.2.9 Skriptingizni yaratish

Biz oddiy skriptlaringizni yaratishni ahamiyatsiz qildik. Siz qilishingiz kerak bo'lgan yagona narsa - skriptingizni skretch katalogiga qo'ying va agar ishga tushirsangiz, u avtomatik ravishda quriladi Waf. Kel harakat qilib ko `Ramiz. Yuqori darajadagi katalogga qayting va nusxa oling misollar/tutorial/first.cc katalogga timdalamoq

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

Endi foydalanib, birinchi namuna skriptingizni yarating vaf:

$ ./waf

Sizning birinchi namunangiz muvaffaqiyatli yaratilganligini ko'rsatadigan xabarlarni ko'rishingiz kerak.

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)

Endi siz misolni ishga tushirishingiz mumkin (esda tutingki, agar siz dasturni skretch katalogida yaratsangiz, uni quyidagi manzildan ishga tushirishingiz kerak. timdalamoq):

$ ./waf --run scratch/myfirst

Shunga o'xshash chiqishni ko'rishingiz kerak:

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

Bu erda siz qurish tizimi fayl yaratilganligini tekshirib, keyin uni ishga tushirishini ko'rishingiz mumkin. Echo mijozidagi komponent yozuvi echo server 1024 ga bitta 10.1.1.2 baytlik paketni yuborganligini bildiradi. Siz ham echo serverida 1024 dan 10.1.1.1 bayt olganligini aytish uchun ro'yxatga olish komponentini ko'rasiz. Echo server paketni jimgina takrorlaydi va siz echo mijoz jurnalida o'z paketini serverdan qaytarib olganini ko'rishingiz mumkin.

4.3 ns-3 Manba kodi

Endi siz ns-3 yordamchilaridan ba'zilarini ishlatganingizdan so'ng, ushbu funksiyani amalga oshiradigan ba'zi manba kodlarini ko'rib chiqishingiz mumkin. Eng so'nggi kodni veb-serverimizda quyidagi havolada ko'rish mumkin: https://gitlab.com/nsnam/ns-3-dev.git. U erda siz ns-3 rivojlanish daraxtimiz uchun Mercurial xulosa sahifasini ko'rasiz. Sahifaning yuqori qismida siz bir nechta havolalarni ko'rasiz,

summary | shortlog | changelog | graph | tags | files

Davom eting va fayllar havolasini tanlang. Ko'pgina omborlarimizning yuqori darajasi shunday ko'rinadi:

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

Bizning misol skriptlarimiz katalogda misollar. Agar siz misollarni bossangiz, pastki kataloglar ro'yxatini ko'rasiz. Kichik katalogdagi fayllardan biri o'quv qo'llanma - first.cc. Agar bossangiz birinchi.cc siz o'rgangan kodni ko'rasiz.

Manba kodi asosan katalogda joylashgan src. Siz katalog nomini bosish yoki katalog nomining o'ng tomonidagi fayllar havolasini bosish orqali manba kodini ko'rishingiz mumkin. Agar siz src katalogini bossangiz, siz src pastki kataloglari ro'yxatini olasiz. Agar siz asosiy pastki katalogni bossangiz, fayllar ro'yxatini topasiz. Siz ko'rgan birinchi fayl (ushbu qo'llanmani yozish vaqtida) hisoblanadi abort.h. Agar siz havolani bossangiz abort.h, siz uchun manba faylga yuboriladi abort.h, unda g'ayritabiiy holatlar aniqlansa, skriptlardan chiqish uchun foydali makrolar mavjud. Biz ushbu bobda foydalanilgan yordamchilar uchun manba kodini katalogda topish mumkin src/Ilovalar/yordamchi. Qayerda ekanligini aniqlash va ns-3 dasturlari uslubini tushunish uchun katalog daraxtini aylanib chiqing.

Manba: www.habr.com

a Izoh qo'shish