Ns-3 şəbəkə simulyatoru dərsliyi. Fəsil 4

Ns-3 şəbəkə simulyatoru dərsliyi. Fəsil 4
fəsil 1,2
3-ci fəsil

4 Konsepsiyaya ümumi baxış
4.1 Əsas abstraksiyalar
4.1.1 Qovşaq
4.1.2 Tətbiq
4.1.3 Kanal
4.1.4 Net Cihaz
4.1.5 Topoloji köməkçilər
4.2 İlk ns-3 skripti
4.2.1 Boilerplate kodu
4.2.2 Pluginlər
4.2.3 ns3 ad sahəsi
4.2.4 Giriş
4.2.5 Əsas funksiya
4.2.6 Topologiya köməkçilərindən istifadə
4.2.7 Tətbiqdən istifadə
4.2.8 Simulyator
4.2.9 Skriptinizin qurulması
4.3 ns-3 Mənbə kodu

Fəsil 4

Konsepsiyaya ümumi baxış

Ns-3 kodunu öyrənməyə və ya yazmağa başlamazdan əvvəl etməli olduğumuz ilk şey sistemdəki bir neçə əsas anlayışı və abstraksiyanı izah etməkdir. Bunların çoxu bəzilərinə açıq görünə bilər, lakin möhkəm təməl üzərində başlamağınızdan əmin olmaq üçün bu bölməni oxumağa vaxt ayırmağı tövsiyə edirik.

4.1 Əsas abstraksiyalar

Bu bölmədə internetdə çox istifadə olunan, lakin ns-3-də xüsusi məna daşıyan bəzi terminlərə baxacağıq.

4.1.1 Qovşaq

İnternet jarqonunda şəbəkəyə qoşulan kompüter qurğusu host və ya bəzən son sistem adlanır. ns-3 İnternet simulyatoru deyil, şəbəkə simulyatoru olduğundan, biz qəsdən host terminindən istifadə etmirik, çünki bu İnternet və onun protokolları ilə sıx bağlıdır. Bunun əvəzinə biz qrafik nəzəriyyəsindən yaranan digər simulyatorlar tərəfindən də istifadə edilən daha ümumi bir termindən istifadə edirik: node (node).

ns-3-də hesablama qurğusunun əsas abstraksiyasına qovşaq deyilir. Bu abstraksiya C++ dilində Node sinfi ilə təmsil olunur. Sinif NodeNode (qovşaq) simulyasiyalarda hesablama cihazlarının təsvirlərini manipulyasiya etmək üsullarını təmin edir.

Siz başa düşməlisiniz Düyün funksionallıq əlavə etdiyiniz kompüter kimi. Siz proqramlar, protokol yığınları və kompüterin faydalı iş görməsinə imkan verən sürücüləri olan periferik kartlar kimi şeylər əlavə edəcəksiniz. Eyni əsas modeli ns-3-də istifadə edirik.

4.1.2 Tətbiq

Ümumiyyətlə, kompüter proqram təminatı iki geniş sinfə bölünür. Sistem proqram təminatı hansısa hesablama modelinə uyğun olaraq müxtəlif kompüter resurslarını məsələn yaddaş, prosessor dövrləri, disk, şəbəkə və s. təşkil edir. Sistem proqramı adətən bu resurslardan birbaşa istifadəçiyə fayda verən tapşırıqları yerinə yetirmək üçün istifadə etmir. İstifadəçi adətən sistem proqram təminatı tərəfindən idarə olunan resursları əldə edən və istifadə edən konkret məqsədə nail olmaq üçün proqram işlədir.

Tez-tez sistem və proqram təminatı arasında ayrılıq xətti əməliyyat sistemi tələlərində baş verən imtiyaz səviyyəsindəki dəyişikliklərlə çəkilir. ns-3-ün real əməliyyat sistemi anlayışı yoxdur və buna görə də imtiyaz səviyyələri və ya sistem çağırışları anlayışı yoxdur. Bununla belə, bir proqram üçün bir fikrimiz var. Necə ki, “real dünya” proqram təminatı proqramları tapşırıqları yerinə yetirmək üçün kompüterlərdə işləyir, ns-3 proqramları simulyasiya edilmiş dünyada simulyasiyaları idarə etmək üçün ns-3 qovşaqlarında işləyir.

ns-3-də modelləşdirmə üçün bəzi fəaliyyətlər yaradan istifadəçi proqramı üçün əsas abstraksiya tətbiqdir. Bu abstraksiya C++ dilində Application sinfi ilə təmsil olunur. Tətbiq sinfi simulyasiyalarda tətbiqlərin istifadəçi səviyyəli versiyasının görünüşlərini manipulyasiya etmək üçün üsulları təmin edir. Tərtibatçıların yeni tətbiqlər yaratmaq üçün Tətbiq sinifini obyekt yönümlü proqramlaşdırma mənasında ixtisaslaşdırmaları gözlənilir. Bu dərslikdə biz adlanan Tətbiq sinifinin ixtisaslarından istifadə edəcəyik UdpEchoClientApplication и UdpEchoServerApplication. Gözlədiyiniz kimi, bu proqramlar şəbəkə paketlərini yaratmaq və əks etdirmək üçün istifadə olunan bir sıra müştəri/server proqramlarını təşkil edir.

4.1.3 Kanal

Real dünyada bir kompüteri şəbəkəyə qoşa bilərsiniz. Çox vaxt bu şəbəkələrdə məlumatların ötürüldüyü media kanallar adlanır. Ethernet kabelini divar rozetkasına qoşduğunuz zaman kompüterinizi Ethernet bağlantısına qoşmuş olursunuz. Simulyasiya edilmiş ns-3 dünyasında qovşaq rabitə kanalını təmsil edən obyektə qoşulur. Burada rabitə alt şəbəkəsinin əsas abstraksiyasına kanal deyilir və C++ dilində Channel sinfi ilə təmsil olunur.

Sinif Kanal Kanalı alt şəbəkə obyektlərinin qarşılıqlı əlaqəsini idarə etmək və hostları onlara qoşmaq üsullarını təqdim edir. Kanallar həmçinin tərtibatçılar tərəfindən obyekt yönümlü proqramlaşdırma mənasında ixtisaslaşa bilər. Kanalın ixtisaslaşması tel kimi sadə bir şeyi modelləşdirə bilər. Xüsusi bir kanal həmçinin böyük Ethernet keçidi və ya simsiz şəbəkələr vəziyyətində maneələrlə dolu üçölçülü məkan kimi mürəkkəb şeyləri modelləşdirə bilər.

adlı bu təlimatda kanalın xüsusi versiyalarından istifadə edəcəyik CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel и WifiChannelWifiChannel. CsmaChannel, məsələn, daşıyıcı hissi çoxlu giriş kommunikasiya mühitini həyata keçirən kommunikasiya alt şəbəkəsinin versiyasını modelləşdirir. Bu bizə Ethernet kimi funksionallıq verir.

4.1.4 Net Cihaz

Əvvəllər belə olurdu ki, əgər siz kompüteri şəbəkəyə qoşmaq istəyirsinizsə, xüsusi şəbəkə kabeli və kompüterə quraşdırılmalı olan periferik kart adlanan (PC terminologiyasında) aparat cihazı almalı idiniz. Əgər periferik kart bəzi şəbəkə funksiyalarını həyata keçirirsə, onlar şəbəkə interfeysi kartları və ya şəbəkə kartları adlanırdı. Bu gün əksər kompüterlər inteqrasiya olunmuş şəbəkə interfeysi avadanlığı ilə təchiz edilmişdir və istifadəçilər tərəfindən ayrıca qurğular kimi görünmür.

Şəbəkə kartı onun aparatını idarə edən proqram sürücüsü olmadan işləməyəcək. Unix-də (və ya Linux-da) periferik avadanlıq bir cihaz kimi təsnif edilir. Cihazlar cihaz drayverləri ilə idarə olunur və şəbəkə cihazları (NIC) şəbəkə cihazı drayverlərindən istifadə etməklə idarə olunur (şəbəkə cihazı sürücüləri) və birlikdə şəbəkə cihazları adlanır (şəbəkə cihazları). Unix və Linux-da siz şəbəkə cihazlarına adlarla müraciət edirsiniz, məsələn eth0.

ns-3-də şəbəkə qurğusunun abstrakasiyası həm proqram təminatı sürücüsünü, həm də modelləşdirilən aparatı əhatə edir. Simulyasiyada şəbəkə cihazı kanallar vasitəsilə digər qovşaqlarla əlaqə saxlamağa imkan vermək üçün bir qovşaqda "quraşdırılır". Həqiqi kompüter kimi, bir qovşaq birdən çox cihaz vasitəsilə birdən çox kanala qoşula bilər NetDevices.

Cihazın şəbəkə abstraksiyası C++ dilində siniflə təmsil olunur NetDevice. Sinif NetDevice Node və Channel obyektlərinə qoşulmaların idarə edilməsi üsullarını təqdim edir; və obyekt yönümlü proqramlaşdırma mənasında tərtibatçılar tərəfindən ixtisaslaşdırıla bilər. Bu dərslikdə biz NetDevice adlı bir neçə ixtisaslaşdırılmış versiyadan istifadə edəcəyik CsmaNetDevice, PointToPointNetDevice и WifiNetDevice. Necə ki, Ethernet şəbəkə adapteri şəbəkə ilə işləmək üçün nəzərdə tutulub Ethernet, CsmaNetDevice ilə işləmək üçün nəzərdə tutulmuşdur CsmaChannel, PointToPointNetDevice ilə işləmək üçün nəzərdə tutulmuşdur PointToPointChannelWifiNetDevice - ilə işləmək üçün nəzərdə tutulmuşdur Wifi Kanalı.

4.1.5 Topoloji köməkçilər

Həqiqi şəbəkədə şəbəkə kartları əlavə edilmiş (və ya quraşdırılmış) əsas kompüterləri tapa bilərsiniz. ns-3-də deyərdik ki, NetDevices əlavə edilmiş qovşaqları görəcəksiniz. Böyük simulyasiya edilmiş şəbəkədə bir çox obyektlər arasında əlaqə təşkil etməli olacaqsınız Düyün, NetDevice и Kanal.

NetDevices-i qovşaqlara, NetDevices-i bağlantılara qoşduğundan, IP ünvanlarının təyin edilməsindən və s. ns-3-də ümumi bir işdir, bunu mümkün qədər asanlaşdırmaq üçün biz sözdə topologiya köməkçiləri təqdim edirik. Məsələn, NetDevice yaratmaq üçün bir çox ns-3 nüvə əməliyyatlarını yerinə yetirməli, MAC ünvanı əlavə etməli, şəbəkə qurğusunu Node-da quraşdırmalı, qovşağın protokol yığınını konfiqurasiya etməli və sonra NetDevice-ni Kanala qoşmalısınız. Birdən çox cihazı çoxnöqtəli keçidlərə qoşmaq və sonra ayrı-ayrı şəbəkələri Internetworks şəbəkəsinə qoşmaq üçün daha çox iş tələb olunacaq. Biz sizin rahatlığınız üçün bu çoxlu əməliyyatları asan istifadə olunan modeldə birləşdirən topologiya köməkçi obyektləri təqdim edirik.

4.2 İlk ns-3 skripti

Əgər sistemi yuxarıda təklif edildiyi kimi quraşdırmısınızsa, ns-3 buraxılışını ev kataloqunuzda repos adlı kataloqda əldə edəcəksiniz. Kataloqa keçin azad

Əgər belə bir kataloqunuz yoxdursa, bu o deməkdir ki, siz ns-3-ün buraxılış versiyasını qurarkən çıxış kataloqunu göstərməmisiniz, belə qurun:
$ ./waf konfiqurasiya —build-profile=release —out=build/release,
$ ./waf qurmaq

orada aşağıdakı kimi bir kataloq strukturu görməlisiniz:

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

Kataloqa keçin nümunələr/dərslik. Orada yerləşən bir faylı görməlisiniz birinci.cc. Bu, iki qovşaq arasında sadə bir nöqtədən nöqtəyə əlaqə yaradacaq və qovşaqlar arasında bir paket ötürəcək bir skriptdir. Gəlin bu skriptə sətir-sətir baxaq; bunun üçün sevimli redaktorunuzda first.cc-ni açın.

4.2.1 Boilerplate kodu
Fayldakı ilk sətir redaktor rejimi xəttidir emacs. O, emacs-a mənbə kodumuzda istifadə etdiyimiz formatlaşdırma konvensiyaları (kodlaşdırma üslubu) haqqında məlumat verir.

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

Bu, həmişə olduqca mübahisəli bir məsələdir, ona görə də onu dərhal yoldan çıxarmaq üçün rekordu düz qoymalıyıq. Ns-3 layihəsi, əksər böyük layihələr kimi, bütün töhfə verən kodun uyğun gəlməli olduğu kodlaşdırma üslubunu qəbul etmişdir. Əgər kodunuzu layihəyə qatmaq istəyirsinizsə, faylda təsvir olunduğu kimi, nəticədə ns-3 kodlaşdırma standartına uyğunlaşmalı olacaqsınız. doc/codingstd.txt və ya layihənin internet səhifəsində göstərilir: https://www.nsnam.org/develop/contributing-code/coding-style/.

Biz sizə ns-3 kodunun görünüşünə öyrəşməyinizi və kodumuzla işlədiyiniz zaman bu standartı tətbiq etməyinizi tövsiyə edirik. Bütün inkişaf qrupu və ianəçilər bir az deyindikdən sonra bununla razılaşdılar. Yuxarıdakı emacs rejimi xətti emacs redaktorundan istifadə edirsinizsə, düzgün formatlaşdırmağı asanlaşdırır.

Ns-3 simulyatoru istifadə üçün lisenziyalıdır GNU General Public License. Hər bir ns-3 paylama faylında müvafiq GNU hüquqi başlığını görəcəksiniz. Tez-tez aşağıda göstərilən GPL mətninin və müəllifin üstündə ns-3 layihəsində iştirak edən qurumlardan biri üçün müəllif hüququ bildirişini görəcəksiniz.

/* 
* 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 Pluginlər

Kodun özü bir sıra daxiletmə ifadələri ilə başlayır (daxil).

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

Yüksək səviyyəli skript istifadəçilərimizə sistemdə mövcud olan çoxlu sayda başlıq fayllarının öhdəsindən gəlməyə kömək etmək üçün biz onları istifadələrinə görə böyük modullarda qruplaşdırırıq. Verilmiş modulda istifadə olunan bütün başlıq fayllarını rekursiv yükləyəcək tək başlıq faylı təqdim edirik. Tam olaraq sizə lazım olan başlığı axtarmaq və bəlkə də düzgün asılılıq siyahısını əldə etmək əvəzinə, biz sizə bir qrup faylı böyük detallarla yükləmək imkanı veririk. Bu, ən səmərəli yanaşma deyil, lakin skript yazmağı çox asanlaşdırır.

Ns-3 daxil olan faylların hər biri adlı qovluğa yerləşdirilir ns3 qurma prosesi zamanı fayl adı konfliktlərinin qarşısını almaq üçün (alt kataloqu qurun). Fayl ns3/core-module.h kataloqda tapa biləcəyiniz ns-3 moduluna uyğundur src/core quraşdırdığınız buraxılışda. Bu kataloqun siyahısında çoxlu sayda başlıq faylları tapa bilərsiniz. Siz montaj edərkən, Waf ictimai başlıq fayllarını alt kataloqda ns3 qovluğuna yerləşdirir qurmaq/debug

Əgər belə bir kataloqunuz yoxdursa, bu o deməkdir ki, siz ns-3-ün buraxılış versiyasını qurarkən çıxış kataloqunu göstərməmisiniz, belə qurun:
$ ./waf konfiqurasiya --build-profile=debug --out=build/debug
$ ./waf qurmaq
və ya
$ ./waf konfiqurasiya --build-profile=optimized --out=build/optimized
$ ./waf qurmaq

və ya qurmaq/optimallaşdırmaq, konfiqurasiyanızdan asılı olaraq. Waf bütün ictimai başlıq fayllarını yükləmək üçün avtomatik olaraq modul daxil faylı yaradacaq. Əlbəttə ki, bu təlimatı dini cəhətdən təqib etdiyiniz üçün, artıq etmisiniz

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

nümunələri və testləri ehtiva edən debug quruluşlarını işə salmaq üçün layihəni konfiqurasiya etmək. Siz də etdiniz

$ ./waf

layihəni yığmaq üçün. Beləliklə, indi kataloqa baxdığınız zaman ../../build/debug/ns3, onda siz digərləri arasında yuxarıda göstərilən dörd modulun başlıq fayllarını tapa bilərsiniz. Siz bu faylların məzmununa baxa bilərsiniz və onların müvafiq modullar tərəfindən istifadə edilən bütün ictimai faylları ehtiva etdiyini görə bilərsiniz.

4.2.3 ns3 ad sahəsi

Skriptdə növbəti sətir birinci.cc ad məkanı bəyannaməsidir.

using namespace ns3;

Ns-3 layihəsi ns3 adlı C++ ad məkanında həyata keçirilir. Bu, bütün ns-3 ilə əlaqəli bəyannamələri qlobal ad məkanından kənar əhatə dairəsinə qruplaşdırır və ümid edirik ki, bu, digər kodlarla inteqrasiyaya kömək edəcəkdir. C++ operatorundan istifadə ns-3 ad sahəsini cari (qlobal) deklarativ bölgəyə təqdim edir. Bu, bu bəyannamədən sonra onu istifadə etmək üçün bütün ns-3 kodunuzdan əvvəl ns3::scope icazə operatorunu yazmağa ehtiyac qalmayacağını söyləməyin gözəl bir yoludur. Əgər ad boşluqları ilə tanış deyilsinizsə, demək olar ki, hər hansı bir C++ dərsliyinə müraciət edin və std ad sahəsi və bəyannamədən istifadə edərək ns3 ad sahəsini müqayisə edin. using namespace std; çıxış operatoru ilə işləmək nümunələrində qiymət və axınlar.

4.2.4 Giriş

Skriptin növbəti sətri:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Biz bu bəyanatdan sənədləşmə sistemimizi müzakirə etmək üçün əlverişli yer kimi istifadə edəcəyik Doksigen. Əgər ns-3 layihəsinin veb-saytına baxsanız, naviqasiya panelində Documentation linkini tapa bilərsiniz. Bu linkə klikləsəniz, sənədlər səhifəmizə yönləndiriləcəksiniz. Sizi ns-3-ün ən son stabil versiyası üçün sənədlərə aparacaq "Son buraxılış" linki var. Əgər "API Documentation" linkini seçsəniz, ns-3 API sənədləri səhifəsinə aparılacaqsınız.

Səhifənin sol tərəfində siz sənədlərin strukturunun qrafik təsvirini tapa bilərsiniz. Başlamaq üçün yaxşı yer ns-3 naviqasiya ağacındakı Modullar ns-3 "kitabıdır". ifşa etsən Modullar, siz ns-3 modul sənədlərinin siyahısını görəcəksiniz. Yuxarıda müzakirə edildiyi kimi, burada modul anlayışı yuxarıdakı modula daxil olan fayllarla birbaşa bağlıdır. ns-3 giriş alt sistemi bölmədə müzakirə olunur Logging Modulundan istifadə, ona görə də bu dərslikdə daha sonra ona qayıdacağıq, lakin siz modula baxaraq yuxarıdakı ifadə haqqında öyrənə bilərsiniz Özəkvə sonra kitabı açır Vasitələrin ayırılmasıvə sonra səhifəni seçin Logging. Basın Logging.

İndi sənədləri nəzərdən keçirməlisiniz Doksigen modul üçün Logging. Səhifənin yuxarısındakı makrolar siyahısında siz NS_LOG_COMPONENT_DEFINE üçün giriş görəcəksiniz. Linkə klikləməzdən əvvəl, onun ümumiyyətlə necə işlədiyini başa düşmək üçün qeydiyyat modulunun “Ətraflı təsviri”nə baxdığınızdan əmin olun. Bunu etmək üçün aşağı diyirləyin və ya diaqramın altındakı "Daha çox..." seçə bilərsiniz.

Nə baş verdiyi barədə ümumi təsəvvürünüz olduqdan sonra davam edin və xüsusi NS_LOG_COMPONENT_DEFINE üçün sənədlərə baxın. Mən burada sənədləri təkrarlamayacağam, lakin ümumiləşdirmək üçün bu xətt adlı qeydiyyat komponenti elan edir. FirstScript Nümunəsi, bu, bir ada istinad edərək mesajların konsol qeydini aktivləşdirməyə və ya söndürməyə imkan verir.

4.2.5 Əsas funksiya

Skriptin aşağıdakı sətirlərində görəcəksiniz,

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

Bu, sadəcə olaraq proqramınızın (skript) əsas funksiyasının bəyanıdır. Hər hansı bir C++ proqramında olduğu kimi, əsas funksiyanı təyin etməlisiniz, bu, ilk növbədə yerinə yetirilir. Burada xüsusi bir şey yoxdur. Sizin ns-3 skriptiniz sadəcə C++ proqramıdır. Aşağıdakı sətir zaman ayırdetmə qabiliyyətini standart olan 1 nanosaniyə təyin edir:

Time::SetResolution (Time::NS);

Zaman ayırdediciliyi və ya sadəcə olaraq həlletmə, istifadə edilə bilən ən kiçik zaman dəyəridir (iki dəfə arasındakı ən kiçik təmsil olunan fərq). Siz dəqiqliyi bir dəfə dəyişə bilərsiniz. Bu çevikliyi təmin edən mexanizm yaddaşı sərf edir, buna görə də qətnamə açıq şəkildə təyin edildikdən sonra biz yaddaşı boşaldırıq və sonrakı yeniləmələrin qarşısını alırıq. (Əgər siz qətnaməni açıq şəkildə təyin etməsəniz, o, standart olaraq bir nanosaniyə olacaq və simulyasiya başlayanda yaddaş boşalacaq.)

Aşağıdakı iki skript sətirləri proqramlara daxil edilmiş iki giriş komponentini aktivləşdirmək üçün istifadə olunur EchoClient и EchoServer:

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

Logging komponenti üçün sənədləri oxusanız, hər bir komponentdə aktivləşdirə biləcəyiniz bir neçə giriş/dəqiqlik səviyyəsinin olduğunu görəcəksiniz. Bu iki kod xətti əks-səda müştəriləri və serverləri üçün INFO səviyyəsinə sazlama girişinə imkan verir. Bu səviyyədə proqram simulyasiya zamanı paketləri göndərən və qəbul edərkən mesajları çap edəcək.

İndi biz topologiyanın yaradılması və simulyasiyanın aparılması işinə keçəcəyik. Bu işi mümkün qədər asanlaşdırmaq üçün topologiya köməkçi obyektlərindən istifadə edirik.

4.2.6 Topologiya köməkçilərindən istifadə

Skriptimizdəki növbəti iki kod sətri əslində simulyasiyada kompüterləri təmsil edəcək Node ns-3 obyektlərini yaradacaq.

NodeContainer nodes;
nodes.Create (2);

Davam etməzdən əvvəl sinif üçün sənədləri tapaq NodeContainer. Müəyyən bir sinif üçün sənədlərə çatmağın başqa bir yolu nişandır Dərslər səhifələrində Doksigen. Əgər sizdə artıq Doxygen açıqdırsa, sadəcə olaraq səhifənin yuxarısına keçin və Siniflər sekmesini seçin. Yeni nişanlar dəsti görməlisiniz, bunlardan biri siniflərin siyahısıdır. Bu tab altında siz bütün ns-3 siniflərinin siyahısını görəcəksiniz. Aşağı sürüşdürün ns3::NodeContainer. Bir sinif tapdığınız zaman, sinfin sənədlərinə getmək üçün onu seçin.

Xatırladığımız kimi, əsas abstraksiyalarımızdan biri düyündür. Bu, protokol yığınları, proqramlar və periferik kartlar kimi şeyləri əlavə edəcəyimiz kompüteri təmsil edir. Topologiya köməkçisi NodeContainer istənilən obyektləri yaratmaq, idarə etmək və onlara daxil olmaq üçün rahat yol təqdim edir Düyün, biz simulyasiyanı həyata keçirmək üçün yaradırıq. Yuxarıdakı birinci sətir sadəcə bəyan edir NodeContainerqovşaqları adlandırdığımız . İkinci sətir nodes obyektində Create metodunu çağırır və konteynerdən iki qovşaq yaratmağı xahiş edir. -də təsvir olunduğu kimi Doksigen, konteyner ns-3 sistemindən iki obyekt yaratmağı tələb edir Düyün və bu obyektlərə göstəriciləri daxildə saxlayır.

Skriptdə yaradılmış qovşaqlar hələ heç nə etmir. Topologiyanın qurulmasında növbəti addım qovşaqlarımızın şəbəkəyə qoşulmasıdır. Dəstəklədiyimiz şəbəkənin ən sadə forması iki qovşaq arasında nöqtə-nöqtə əlaqəsidir. İndi belə bir əlaqə yaradacağıq.

PointToPointHelper

Bağlantı üçün tələb olunan aşağı səviyyəli işi yerinə yetirmək üçün topologiya köməkçi obyektindən istifadə edərək, tanış nümunədən istifadə edərək nöqtədən nöqtəyə əlaqə yaradırıq. İki əsas abstraksiyamızı xatırlayaq NetDevice и Kanal. Real dünyada bu terminlər təxminən periferik kartlara və şəbəkə kabellərinə uyğun gəlir. Tipik olaraq, bu iki şey bir-biri ilə sıx bağlıdır və heç kim paylaşmağa arxalana bilməz, məsələn, cihazları Ethernet simsiz kanal vasitəsilə. Topologiya köməkçilərimiz bu yaxın əlaqəni izləyir və buna görə də bu ssenaridə tək obyektdən istifadə edəcəksiniz PointToPointHelper ns-3 obyektlərinin qurulması və birləşdirilməsi üçün PointToPointNetDevice и PointToPointChannel. Ssenaridəki növbəti üç sətir:

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

Birinci xətt,

PointToPointHelper pointToPoint;

yığında obyektin nümunəsini yaradır PointToPointHelper. Üst səviyyə nöqteyi-nəzərdən aşağıdakı xətt,

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

obyekti deyir PointToPointHelper "5 Mbit/s" (saniyədə beş meqabit) dəyərini " kimi istifadə edinDataRate.

Daha konkret nöqteyi-nəzərdən “DataRate” sətri atribut dediyimiz şeyə uyğun gəlir PointToPointNetDevice. Baxsanız Doksigen sinif üçün ns3::PointToPointNetDevice və metodun sənədlərində GetTypeId cihaz üçün müəyyən edilmiş atributların siyahısını tapa bilərsiniz. Onların arasında atribut olacaqDataRate" İstifadəçi tərəfindən görünən ns-3 obyektlərinin əksəriyyəti oxşar atribut siyahılarına malikdir. Növbəti hissədə görəcəyiniz kimi, təkrar tərtib etmədən simulyasiyanı asanlıqla qurmaq üçün bu mexanizmdən istifadə edirik.

Oxşar "DataRate" PointToPointNetDevice-də siz PointToPointChannel ilə əlaqəli "Gecikmə" atributunu tapa bilərsiniz. Son xətt

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

deyir PointToPointHelper "2 ms" (iki millisaniyə) dəyərini sonradan yaratdığı nöqtədən nöqtəyə keçid üçün yayılma gecikmə dəyəri kimi istifadə edin.

NetDeviceContainer

Hazırda skriptimiz var NodeContainer, iki qovşaqdan ibarətdir. bizdə var PointToPointHelperobyektlərin yaradılması üçün hazırlanmışdır PointToPointNetDevices və onları PointToPointChannel obyektindən istifadə etməklə birləşdirin. Düyünlər yaratmaq üçün NodeContainer topologiya köməkçi obyektindən istifadə etdiyimiz kimi, biz də soruşacağıq PointToPointHelper bizim üçün cihazlarımızın yaradılması, konfiqurasiyası və quraşdırılması ilə bağlı işləri yerinə yetirmək. Bizə bütün yaradılmış obyektlərin siyahısı lazımdır NetDevice, buna görə də istifadə edirik NetDeviceContainer istifadə etdiyimiz şəkildə saxlamaq üçün NodeContainer yaratdığımız qovşaqları saxlamaq üçün. Növbəti iki kod sətri,

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

tam cihaz və kanal quraşdırma. Birinci sətir yuxarıda qeyd olunan cihaz konteynerini elan edir, ikincisi isə əsas işi görür. Metod Quraşdırın obyekt PointToPointHelper qəbul edir NodeContainer parametr kimi. İçəri NetDeviceContainer yerləşən hər bir node üçün NodeContainer yaradılmışdır (nöqtədən-nöqtəyə əlaqə üçün onlardan ikisi olmalıdır) PointToPointNetDevice yaradılır və cihaz konteynerində saxlanılır. PointToPointChannel yaradılır və ona ikisi əlavə olunur PointToPointNetDevices. Obyektləri yaratdıqdan sonra atributlar saxlanılır PointToPointHelper, yaradılmış obyektlərdə müvafiq atributları işə salmaq üçün istifadə olunur.

Zəng etdikdən sonra pointToPoint.Install (qovşaqlar) hər birində nöqtədən-nöqtəyə şəbəkə qurğusu quraşdırılmış və onlar arasında bir nöqtədən-nöqtə əlaqəsi olan iki qovşaqımız olacaq. Hər iki qurğu məlumatların kanal üzərindən iki millisaniyəlik gecikmə ilə saniyədə beş meqabit sürətlə ötürülməsi üçün konfiqurasiya ediləcək.

InternetStackHelper

İndi konfiqurasiya edilmiş qovşaqlarımız və qurğularımız var, lakin qovşaqlarımızda quraşdırılmış protokol yığınları yoxdur. Növbəti iki kod sətri bununla məşğul olacaq.

InternetStackHelper stack;
stack.Install (nodes);

InternetStackHelper - nöqtədən nöqtəyə şəbəkə cihazları üçün PointToPointHelper-ə bənzər İnternet yığınları üçün topologiya köməkçisidir. Metod Quraşdırın parametr kimi NodeContainer qəbul edir. İcra edildikdə, o, hər bir konteyner qovşağında İnternet yığınını (TCP, UDP, IP və s.) quraşdıracaqdır.

IPv4AddressHelper

Sonra cihazlarımızı IP ünvanları ilə əlaqələndirməliyik. Biz IP ünvanlarının ayrılmasını idarə etmək üçün topologiya köməkçisi təqdim edirik. İstifadəçiyə görünən yeganə API faktiki ünvan paylanması zamanı istifadə ediləcək əsas IP ünvanını və şəbəkə maskasını təyin etməkdir (bu, köməkçi daxilində daha aşağı səviyyədə edilir). Nümunə skriptimizdəki növbəti iki kod sətri birinci.cc,

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

ünvan köməkçi obyektini elan edin və ona deyin ki, o, müəyyən etmək üçün 10.1.1.0 bit maskasından istifadə edərək 255.255.255.0 şəbəkəsindən IP ünvanlarını ayırmağa başlamalıdır. Varsayılan olaraq, ayrılmış ünvanlar birdən başlayacaq və monoton şəkildə artacaq, buna görə də bu bazadan ayrılan ilk ünvan 10.1.1.1, sonra 10.1.1.2 və s. Əslində, aşağı səviyyədə, ns-3 sistemi bütün ayrılmış IP ünvanlarını xatırlayır və təsadüfən eyni ünvanın iki dəfə yaradıldığı bir vəziyyət yaratsanız (yeri gəlmişkən, bu xətanı aradan qaldırmaq çətindir) ölümcül xəta yaradır.

Aşağıdakı kod sətri,

Ipv4InterfaceContainer interfaces = address.Assign (devices);

faktiki ünvan təyinatını yerinə yetirir. Ns-3-də biz IP ünvanı ilə obyektdən istifadə edən cihaz arasında əlaqə qururuq IPv4 interfeysi. Bizə bəzən sonradan istifadə etmək üçün köməkçi tərəfindən yaradılmış şəbəkə cihazlarının siyahısı lazım olduğu kimi, bəzən də obyektlərin siyahısına ehtiyacımız var IPv4 interfeysi. IPv4 InterfaceContainer bu funksiyanı təmin edir.

Quraşdırılmış yığınlar və təyin edilmiş IP ünvanları ilə nöqtədən nöqtəyə şəbəkə qurduq. İndi trafik yaratmaq üçün hər bir qovşaqda tətbiqlərə ehtiyacımız var.

4.2.7 Tətbiqdən istifadə

Ns-3 sisteminin əsas abstraksiyalarından biri də budur Ərizə (tətbiq). Bu ssenaridə biz iki əsas sinif ixtisasından istifadə edirik Ərizə ns-3 çağırılır UdpEchoServerApplication и UdpEchoClientApplication. Əvvəlki hallarda olduğu kimi, biz əsas obyektləri konfiqurasiya etmək və idarə etmək üçün köməkçi obyektlərdən istifadə edirik. Burada istifadə edirik UdpEchoServerHelper и UdpEchoClientHelper həyatımızı asanlaşdırmaq üçün obyektlər.

UdpEchoServerHelper

First.cc nümunə skriptimizdəki aşağıdakı kod sətirləri əvvəllər yaratdığımız qovşaqlardan birində UDP echo server proqramını konfiqurasiya etmək üçün istifadə olunur.

UdpEchoServerHelper echoServer (9);

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

Yuxarıdakı parçanın ilk kodu sətri yaradır UdpEchoServerHelper. Həmişə olduğu kimi, bu proqramın özü deyil, real proqramlar yaratmağımıza kömək edən bir obyektdir. Konvensiyalarımızdan biri lazımi atributları köməkçi obyektin konstruktoruna ötürməkdir. Bu halda, serverin paketləri dinləyəcəyi port nömrəsi verilməyincə köməkçi faydalı heç nə edə bilməz, bu nömrə müştəriyə də məlum olmalıdır. Bu halda biz port nömrəsini köməkçi konstruktora veririk. Konstruktor, öz növbəsində, sadəcə edir SetAttribute keçən dəyərlə. Daha sonra, istəsəniz, Port atributuna fərqli dəyər təyin etmək üçün SetAttribute-dən istifadə edə bilərsiniz.

Bir çox başqa köməkçi obyektlər kimi obyekt UdpEchoServerHelper üsulu var Quraşdırın. Bu metodun effektiv şəkildə icrası əsas əks-səda server tətbiqini yaradır və onu hosta bağlayır. Maraqlıdır ki, üsul Quraşdırın qəbul edir NodeContainer digərləri kimi bir parametr kimi Quraşdırın üsulları gördük.

Burada işləyən C++ gizli çevrilmə metodun nəticəsini alır node.Get(1) (bu, qovşaq obyektinə ağıllı göstərici qaytarır - Ptr ) və onu anonim obyekt üçün konstruktorda istifadə edir NodeContainersonra metoda keçir Quraşdırın. Əgər C++ kodunda hansı metod imzasının tərtib olunduğunu və icra olunduğunu müəyyən edə bilmirsinizsə, gizli çevrilmələrə baxın.

İndi biz bunu görürük echoServer.Install proqramı quraşdırmaq üzrədir UdpEchoServerApplication -də tapıldı NodeContainerqovşaqlarımızı idarə etmək üçün istifadə etdiyimiz, indeks 1 olan node. Metod Quraşdırın bütün tətbiqlərə göstəriciləri ehtiva edən konteyneri qaytaracaq (bu halda bir, çünki biz anonim NodeContainer, bir node ehtiva edən) köməkçi tərəfindən yaradılmışdır.

Tətbiqlər trafik yaratmağa nə vaxt başlayacağını müəyyən etməlidir başlamaq və onu dayandırmaq üçün vaxtı əlavə olaraq təyin etmək lazım ola bilər "dayan". Hər iki variantı təqdim edirik. Bu vaxtlar metodlardan istifadə etməklə təyin edilir Tətbiq Konteyneri start и Dayandırmaq. Bu üsullar növün parametrlərini qəbul edir vaxt. Bu halda biz C++ almaq üçün açıq C++ çevrilmə ardıcıllığından istifadə edirik ikiqat 1.0 və onu saniyəyə çevirmək üçün Seconds obyektindən istifadə edən tns-3 Time obyektinə çevirin. Unutmayın ki, çevrilmə qaydaları model müəllifi tərəfindən idarə oluna bilər və C++-ın öz qaydaları var, ona görə də parametrlərin gözlədiyiniz şəkildə çevrilməsinə həmişə arxalana bilməzsiniz. İki xətt

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

simulyasiya başlayandan bir saniyə sonra echo server tətbiqinin işə salınmasına (avtomatik olaraq işə salınmasına) və simulyasiyanın on saniyəsindən sonra dayanmasına (sönməsinə) səbəb olacaq. On saniyə ərzində yerinə yetiriləcək bir simulyasiya hadisəsi (tətbiqi dayandırma hadisəsi) elan etdiyimizə görə, ən azı on saniyə şəbəkə əməliyyatı simulyasiya ediləcək.

UdpEchoClientHelper

Müştəri tətbiqi miss serverə demək olar ki, oxşar şəkildə konfiqurasiya edilmişdir. Baza obyekti var UdpEchoClientApplicationtərəfindən idarə olunur
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));;

Bununla belə, echo müştərisi üçün beş fərqli atribut təyin etməliyik. İlk iki atribut yaradılış zamanı təyin edilir UdpEchoClientHelper. Atributları təyin etmək üçün istifadə olunan parametrləri (köməkçinin daxilində) keçirik "Uzaqdan Ünvan" и "Uzaqdan Port" müqaviləmizə uyğun olaraq lazımi parametrləri köməkçi konstruktora ötürmək.

İstifadə etdiyimizi xatırlayaq IPv4 InterfaceContainer cihazlarımıza təyin etdiyimiz IP ünvanlarını izləmək üçün. İnterfeyslər konteynerindəki null interfeysi qovşaqlar konteynerindəki null nodeun IP ünvanına uyğun olacaq. İnterfeyslər konteynerindəki ilk interfeys qovşaqlar konteynerindəki birinci qovşağın IP ünvanına uyğundur. Beləliklə, kodun birinci sətirində (yuxarıda) biz köməkçi yaradırıq və ona deyirik ki, müştərinin uzaq ünvanı serverin yerləşdiyi hosta təyin edilmiş IP ünvanı olacaq. Biz də deyirik ki, paketlərin XNUMX-cu porta göndərilməsini təşkil etməliyik.

"MaxPackets" atributu müştəriyə simulyasiya zamanı göndərə biləcəyimiz paketlərin maksimum sayını bildirir. "İnterval" atributu müştəriyə paketlər arasında nə qədər gözləməli olduğunu, "PacketSize" atributu isə müştəriyə paketin faydalı yükünün nə qədər böyük olması lazım olduğunu bildirir. Bu atribut kombinasiyası ilə biz müştəriyə tək 1024 baytlıq paket göndərməyi deyirik.

Echo serverində olduğu kimi, biz echo müştərinin atributlarını təyin etdik start и Dayandırmaq, lakin burada server işə salındıqdan bir saniyə sonra müştərini işə salırıq (simulyasiyanın başlamasından iki saniyə sonra).

4.2.8 Simulyator

Bu nöqtədə simulyasiyanı işə salmalıyıq. Bu qlobal funksiyadan istifadə etməklə edilir Simulyator :: Çalışın.

Simulator::Run ();

Əvvəllər metodlar adlandırdığımız zaman,

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

biz əslində simulyatorda hadisələri 1,0 saniyəyə, 2,0 saniyəyə və iki hadisəni 10,0 saniyəyə planlaşdırdıq. Zəngdən sonra Simulyator :: Çalışın, sistem planlaşdırılan tədbirlərin siyahısına baxmağa və onları icra etməyə başlayacaq. O, əvvəlcə 1,0 saniyədən sonra hadisəni işə salacaq, bu da əks-səda server tətbiqini işə salacaq (bu hadisə öz növbəsində bir çox başqa hadisələri planlaşdıra bilər). Daha sonra o, echo müştəri tətbiqini işə salacaq t=2,0 saniyəyə planlaşdırılan hadisəni işə salacaq. Yenə deyirəm, bu tədbirdə daha çox tədbirlər planlaşdırılmış ola bilər. Echo müştərisində başlanğıc hadisəsinin həyata keçirilməsi serverə paket göndərməklə simulyasiyanın məlumat ötürmə mərhələsinə başlayacaq.

Paketin serverə göndərilməsi aktı pərdə arxasında avtomatik planlaşdırılacaq və skriptdə təyin etdiyimiz vaxt parametrlərinə uyğun olaraq əks-səda paketinin göndərilməsi mexanikasını həyata keçirəcək hadisələr zəncirini işə salacaq.

Nəticədə, yalnız bir paket göndərdiyimiz üçün (xatırlayın, atribut MaxPackets birinə təyin edildi), bu tək müştəri pinginin başlatdığı hadisələr silsiləsi sona çatacaq və simulyasiya gözləmə rejiminə keçəcək. Bu baş verdikdən sonra qalan planlaşdırılan tədbirlər hadisələr olacaq Dayandırmaq server və müştəri üçün. Bu hadisələr icra edildikdə, sonrakı emal üçün heç bir hadisə qalmayacaq və Simulyator :: Çalışın nəzarəti qaytaracaq. Simulyasiya tamamlandı.

Qalan tək şey özünüzü təmizləməkdir. Bu, qlobal funksiyanı çağırmaqla edilir Simulyator:: Məhv et. Çünki yaradılmış köməkçi funksiyalar (və ya aşağı səviyyəli ns-3 kodu) çağırılmışdır ki, onlar yaradılan bütün obyektləri məhv etmək üçün simulyatora qarmaqlar daxil edilmişdir. Bu obyektlərin heç birini özünüz izləməyə ehtiyac yox idi - sizə zəng etmək kifayət idi Simulyator:: Məhv et və çıxın. Ns-3 sistemi sizin üçün bu çətin işi görəcək. İlk ns-3 skriptimizin qalan sətirləri, first.cc, bunu edir:

Simulator::Destroy ();
return 0;
}

Simulyator nə vaxt dayanacaq?

ns-3 diskret hadisə (DE) simulyatorudur. Belə bir simulyatorda hər bir hadisə onun icra müddəti ilə əlaqələndirilir və simulyasiya hadisələri simulyasiya irəlilədikcə baş verən ardıcıllıqla emal etməklə davam edir. Hadisələr gələcək hadisələrin planlaşdırılmasına səbəb ola bilər (məsələn, taymer növbəti intervalda saymağı başa çatdırmaq üçün özünü yenidən planlaşdıra bilər).

İlkin hadisələr adətən müəssisə tərəfindən başlanır, məsələn, IPv6 şəbəkədə xidmətlərin aşkar edilməsini, qonşu sorğuları və s. Tətbiq ilk paket göndərmə hadisəsini planlaşdırır və s. Hadisə emal edildikdə, sıfır, bir və ya daha çox hadisə yarada bilər. Simulyasiya irəlilədikcə hadisələr baş verir, ya sona çatır, ya da yenilərini yaradır. Hadisə növbəsi boş olarsa və ya xüsusi hadisə aşkar edilərsə, simulyasiya avtomatik olaraq dayanacaq Dayandırmaq. Hadisə Dayandırmaq funksiyası tərəfindən yaradılır Simulyator:: Dayan (dayanma vaxtı).

Tipik bir hal var ki, Simulator::Stop simulyasiyanı dayandırmaq üçün mütləq lazımdır: özünü təmin edən hadisələr olduqda. Özünü təmin edən (və ya təkrarlanan) hadisələr həmişə yenidən planlaşdırılan hadisələrdir. Nəticədə, onlar həmişə hadisə növbəsini boş saxlamırlar. Təkrarlanan hadisələri ehtiva edən bir çox protokol və modul var, məsələn:

• FlowMonitor - itirilmiş paketlərin dövri yoxlanılması;

• RIPng – marşrutlaşdırma cədvəlinin yenilənməsinin dövri yayımı;

• və s.

Belə hallarda Simulyator:: Dayan simulyasiyanı düzgün dayandırmaq lazımdır. Əlavə olaraq, ns-3 emulyasiya rejimində olduqda, RealtimeSimulator simulyasiya saatını maşın saatı ilə sinxronlaşdırmaq üçün istifadə olunur və Simulyator:: Dayan prosesi dayandırmaq lazımdır.

Dərslikdəki simulyasiya proqramlarının bir çoxu zəng etmir Simulyator:: Dayan açıq şəkildə, çünki növbəyə qoyulmuş hadisələr tükəndikdə avtomatik olaraq dayandırılır. Bununla belə, bu proqramlar Simulator::Stop zəngini də qəbul edəcək. Məsələn, birinci proqram nümunəsindəki aşağıdakı əlavə ifadə 11 saniyəyə açıq dayanmağı planlaşdırır:

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

Yuxarıda göstərilənlər əslində bu proqramın davranışını dəyişməyəcək, çünki bu xüsusi simulyasiya təbii olaraq 10 saniyədən sonra başa çatır. Ancaq yuxarıdakı ifadədəki dayanma vaxtını 11 saniyədən 1 saniyəyə dəyişdirsəniz, hər hansı bir çıxış ekrana dəyməzdən əvvəl simulyasiyanın dayandığını görəcəksiniz (çünki çıxış simulyasiya müddətindən təxminən 2 saniyə sonra baş verir).

Simulator-a zəng etməzdən əvvəl Simulator::Stop-a zəng etmək vacibdir::Run; əks halda Simulator::Run dayandırmağı yerinə yetirmək üçün heç vaxt nəzarəti əsas proqrama qaytarmaya bilər!

4.2.9 Skriptinizin qurulması

Sadə skriptlərinizi yaratmağı əhəmiyyətsiz etdik. Sizə lazım olan tək şey skriptinizi skretch qovluğuna yerləşdirməkdir və işlədiyiniz zaman avtomatik olaraq qurulacaq Waf. Gəlin cəhd edək. Üst səviyyəli kataloqa qayıdın və kopyalayın misallar/tutorial/first.cc kataloqa kazımak

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

İndi istifadə edərək ilk nümunə skriptinizi qurun vəf:

$ ./waf

İlk nümunənizin uğurla yaradıldığını göstərən mesajları görməlisiniz.

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)

İndi siz nümunəni işlədə bilərsiniz (qeyd edək ki, əgər proqramınızı skretch qovluğunda qurursunuzsa, onda siz onu buradan işə salmalısınız. kazımak):

$ ./waf --run scratch/myfirst

Oxşar çıxışı görməlisiniz:

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

Burada qurma sisteminin faylın qurulduğunu yoxladığını və sonra onu işə saldığını görə bilərsiniz. Siz əks-səda klientində komponent girişinin onun echo server 1024-yə tək 10.1.1.2 baytlıq paket göndərdiyini göstərir. Siz də 1024-dən 10.1.1.1 bayt aldığını söyləmək üçün echo serverində qeyd komponentini görürsünüz. Echo server paketi səssizcə təkrarlayır və siz echo müştərinin qeydində onun paketini serverdən geri aldığını görə bilərsiniz.

4.3 ns-3 Mənbə kodu

İndi ns-3 köməkçilərindən bəzilərini istifadə etdiyinizə görə, bu funksiyanı həyata keçirən bəzi mənbə koduna nəzər sala bilərsiniz. Ən son koda veb serverimizdə aşağıdakı linkdən baxa bilərsiniz: https://gitlab.com/nsnam/ns-3-dev.git. Orada ns-3 inkişaf ağacımız üçün Mercurial xülasə səhifəsini görəcəksiniz. Səhifənin yuxarı hissəsində bir neçə link görəcəksiniz,

summary | shortlog | changelog | graph | tags | files

Davam edin və fayl bağlantısını seçin. Əksər depolarımızın yuxarı səviyyəsi belə görünəcək:

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

Bizim nümunə skriptlərimiz kataloqdadır misal. Nümunələrin üzərinə klikləsəniz, alt kataloqların siyahısını görəcəksiniz. Alt qovluqdakı fayllardan biri tutorial - first.cc... Əgər üzərinə klik etsəniz birinci.cc yenicə öyrəndiyiniz kodu görəcəksiniz.

Mənbə kodu əsasən kataloqda yerləşir src. Kataloq adının üzərinə klikləməklə və ya kataloq adının sağ tərəfindəki fayllar linkinə klikləməklə mənbə koduna baxa bilərsiniz. src qovluğuna klikləsəniz, src alt kataloqlarının siyahısını alacaqsınız. Daha sonra əsas alt kataloqa klikləsəniz, faylların siyahısını tapa bilərsiniz. Görəcəyiniz ilk fayl (bu təlimatı yazarkən) belədir abort.h. Linkə klik etsəniz abort.h, üçün mənbə faylına göndəriləcəksiniz abort.h, anormal vəziyyətlər aşkar edildikdə skriptlərdən çıxmaq üçün faydalı makroları ehtiva edir. Bu fəsildə istifadə etdiyimiz köməkçilər üçün mənbə kodu kataloqda tapıla bilər src/Proqramlar/köməkçi. Nəyin harada olduğunu anlamaq və ns-3 proqramlarının üslubunu başa düşmək üçün kataloq ağacının ətrafında gəzməkdən çekinmeyin.

Mənbə: www.habr.com

Добавить комментарий