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

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

5 Ayar
5.1 Giriş modulundan istifadə
5.1.1 Girişə ümumi baxış
5.1.2 Qeydiyyatı aktivləşdirin
5.1.3 Kodunuza girişin əlavə edilməsi
5.2 Komanda xətti arqumentlərindən istifadə
5.2.1 Defolt atribut dəyərlərinin ləğv edilməsi
5.2.2 Öz əmrlərinizin ələ keçirilməsi
5.3 İzləmə sistemindən istifadə
5.3.1 ASCII İzləmə
ASCII izlərinin təhlili
5.3.2 PCAP İzi

Fəsil 5

nizamlama

5.1 Giriş modulundan istifadə

Artıq skriptə baxaraq ns-3 logging moduluna qısaca nəzər saldıq birinci.cc. Bu fəsildə biz giriş alt sistemi üçün mümkün istifadələrə daha yaxından nəzər salacağıq.

5.1.1 Girişə ümumi baxış

Bir çox böyük sistemlər bir növ mesaj yazma qurğusunu dəstəkləyir və ns-3 istisna deyil. Bəzi hallarda "operator konsoluna" yalnız səhv mesajları yazılır (bu, adətən Unix əsaslı sistemlərdə stderr olur). Digər sistemlərdə xəbərdarlıq mesajları, eləcə də daha ətraflı məlumat göstərilə bilər. Bəzi hallarda, çıxışı tez bir zamanda bulandıra bilən sazlama mesajlarını çıxarmaq üçün giriş alətləri istifadə olunur.

ns-3-də istifadə edilən subHRD məlumat məzmununun bütün bu səviyyələrinin faydalı olduğunu güman edir və biz mesaj qeydinə seçmə, laylı yanaşma təqdim edirik. Giriş tamamilə söndürülə bilər, hər bir komponent əsasında və ya qlobal olaraq aktivləşdirilə bilər. Bu məqsədlə məlumat məzmununun tənzimlənən səviyyələrindən istifadə olunur. Ns-3 giriş modulu simulyasiyanızdan faydalı məlumat əldə etmək üçün nisbətən sadə bir yol təqdim edir.

Siz başa düşməlisiniz ki, biz modellərinizdən məlumatların çıxarılması üçün ümumi təyinatlı mexanizm - izləmə təmin edirik, bu, simulyasiyalar üçün üstünlük təşkil etməlidir (izləmə sistemimiz haqqında ətraflı məlumat üçün təlimat bölməsinə baxın 5.3). Qeydiyyat sazlama məlumatı, xəbərdarlıqlar, səhv mesajları əldə etmək və ya istənilən vaxt skript və ya modellərinizdən mesajları tez bir zamanda çıxarmaq üçün üstünlük verilən üsul olmalıdır.

Hazırda sistem informasiya məzmununun artan ardıcıllığı ilə jurnal mesajlarının yeddi səviyyəsini (növlərini) müəyyən edir.

  • LOG_ERROR - xəta mesajlarının qeydiyyatı (əlaqəli makro: NS_LOG_ERROR);
  • LOG_WARN - Xəbərdarlıq mesajlarını qeyd edin (əlaqəli makro: NS_LOG_WARN);
  • LOG_DEBUG - Nisbətən nadir olan xüsusi sazlama mesajlarını qeyd edin (əlaqəli makro: NS_LOG_DEBUG);
  • LOG_INFO - proqramın gedişatı haqqında məlumat mesajlarının qeydiyyatı (əlaqəli makro: NS_LOG_INFO);
  • LOG_FUNCTION - Hər bir çağırılan funksiyanı təsvir edən mesajları qeyd edir (iki əlaqəli makro: NS_LOG_FUNCTION, üzv funksiyaları üçün istifadə olunur və NS_LOG_FUNCTION_NOARGS, statik funksiyalar üçün istifadə olunur);
  • LOG_LOGIC - funksiya daxilində məntiqi axını təsvir edən mesajların qeydiyyatı (əlaqəli makro: NS_LOG_LOGIC);
  • LOG_ALL - Yuxarıda qeyd olunan hər şeyi qeyd edir (əlaqəli makro yoxdur).
    Hər bir növ üçün (LOG_TYPE) həmçinin LOG_LEVEL_TYPE mövcuddur ki, istifadə olunarsa, öz səviyyəsinə əlavə olaraq ondan yuxarı olan bütün səviyyələri qeyd etməyə imkan verir. (Nəticədə, LOG_ERROR və LOG_LEVEL_ERROR, və LOG_ALL və LOG_LEVEL_ALL funksional olaraq ekvivalentdir.) Məsələn, LOG_INFO-nun işə salınması yalnız NS_LOG_INFO makrosunun verdiyi mesajlara icazə verəcək, LOG_LEVEL_INFO_INFO_G_ tərəfindən təmin edilən makronun işə salınması isə, həmçinin, LOG_LEVEL_INFO_GNSB_G_ tərəfindən təqdim edilən mesajları da əhatə edəcək. G_WARN və NS_LOG_ERROR.

Biz həmçinin qeyd səviyyəsindən və ya seçim komponentindən asılı olmayaraq həmişə göstərilən qeyd-şərtsiz giriş makrosunu təqdim edirik.

  • NS_LOG_UNCOND - Əlaqədar mesajın qeyd-şərtsiz qeydi (əlaqəli qeyd səviyyəsi yoxdur).

Hər bir səviyyə fərdi və ya məcmu şəkildə sorğulana bilər. Qeydiyyat sh mühit dəyişəni NS_LOG istifadə edərək və ya sistem funksiyası çağırışını qeyd etməklə konfiqurasiya edilə bilər. Əvvəllər göstərildiyi kimi, giriş sistemində Doxygen sənədləri var və əgər sizdə yoxdursa, indi onu nəzərdən keçirmək üçün yaxşı vaxtdır.

İndi sənədləri ətraflı oxuduğunuza görə, nümunə skriptdən maraqlı məlumatlar əldə etmək üçün bu biliklərdən istifadə edək. scratch/myfirst.ccsiz artıq tərtib etmisiniz.

5.1.2 Qeydiyyatı aktivləşdirin

Gəlin NS_LOG mühit dəyişənindən daha çox qeydlər işlətmək üçün istifadə edək, lakin əvvəlcə, sadəcə olaraq rulmanlarınızı əldə etmək üçün, əvvəlki kimi sonuncu skripti işlədin,

$ ./waf --run scratch/myfirst

İlk ns-3 nümunə proqramından tanış çı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.413s)
Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
Received 1024 bytes from 10.1.1.2

Məlum olub ki, yuxarıda gördüyünüz "göndərilmiş" və "qəbul edilən" mesajlar əslində daxil olmuş mesajlardır. UdpEchoClientApplication и UdpEchoServerApplication. Məsələn, biz müştəri proqramından NS_LOG mühit dəyişəni vasitəsilə onun qeyd səviyyəsini təyin etməklə əlavə məlumatı çap etməyi xahiş edə bilərik.

Bundan sonra mən güman edəcəyəm ki, siz "VARIABLE=value" sintaksisindən istifadə edən sh-yə bənzər qabıqdan istifadə edirsiniz. Əgər csh kimi qabıqdan istifadə edirsinizsə, onda siz mənim nümunələrimi həmin qabıqların tələb etdiyi "setenv dəyişən dəyəri" sintaksisinə çevirməli olacaqsınız.

Hazırda UDP echo müştəri tətbiqi aşağıdakı kod sətirinə cavab verir scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

O, LOG_LEVEL_INFO qeyd səviyyəsini aktivləşdirir. Biz giriş səviyyəsinin bayrağını keçəndə, həqiqətən, həmin səviyyəni və bütün aşağı səviyyələri işə salırıq. Bu halda biz NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN və NS_LOG_ERROR-u aktiv etdik. NS_LOG mühit dəyişənini aşağıdakı kimi təyin etməklə, skript dəyişikliyi və yenidən tərtib etmədən qeyd səviyyəsini artıra və daha çox məlumat əldə edə bilərik:

$ export NS_LOG=UdpEchoClientApplication=level_all

Beləliklə, NS_LOG sh shell dəyişənini aşağıdakı qiymətə təyin etdik,

UdpEchoClientApplication=level_all

Tapşırıqın sol tərəfi konfiqurasiya etmək istədiyimiz daxil edilmiş komponentin adı, sağ tərəfi isə onun üçün müraciət etmək istədiyimiz bayraqdır. Bu halda, biz proqramda bütün səviyyələrdə sazlamanı aktiv edəcəyik. Skripti NS_LOG ilə bu şəkildə işə salsanız, ns-3 qeyd sistemi dəyişiklikləri qəbul edəcək və siz aşağıdakı çı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.404s)
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
Received 1024 bytes from 10.1.1.2
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()

Tətbiq tərəfindən təmin edilən əlavə sazlama məlumatı indi NS_LOG_FUNCTION səviyyəsindədir. Skript icrası zamanı funksiya çağırışının hər bir nümunəsini göstərir. Bir qayda olaraq, metod funksiyalarında (minimum) istifadəyə üstünlük verilir.NS_LOG_FUNCTION (this)... İstifadə edin NS_LOG_FUNCTION_NOARGS ()
yalnız statik funksiyalarda. Bununla belə, qeyd edin ki, ns-3 sistemi heç bir giriş funksiyasını dəstəkləmək üçün tələb olunmur. Nə qədər məlumatın qeydə alınacağına dair qərar fərdi model tərtibatçısına verilir. Echo proqramları vəziyyətində, böyük miqdarda giriş çıxışı mövcuddur.

İndi siz proqram tərəfindən edilmiş funksiya çağırışlarının jurnalına baxa bilərsiniz. Diqqətlə baxsanız, xətt arasında iki nöqtəni görəcəksiniz UdpEchoClientApplication və C++ əhatə dairəsi operatorunu (: :) görməyinizi gözlədiyiniz metodun adı. Bu qəsdəndir.

Bu əslində sinfin adı deyil, logging komponentinin adıdır. Mənbə faylı ilə sinif arasında uyğunluq olduqda, bu, adətən sinfin adı olur, lakin bunun əslində sinfin adı olmadığını və qoşa iki nöqtə yerinə tək iki nöqtə olduğunu başa düşməlisiniz. Bu, konseptual olaraq, giriş lobya adını sinif adından nisbətən incə bir şəkildə ayırmağa kömək etmək üçün bir yoldur.

Bununla belə, bəzi hallarda hansı metodun əslində jurnal mesajını yaratdığını müəyyən etmək çətin ola bilər. Yuxarıdakı mətnə ​​baxsanız, sətirin harada olduğu ilə maraqlana bilərsiniz.Received 1024 bytes from 10.1.1.2" Səviyyəni təyin etməklə bu problemi həll edə bilərsiniz prefiks_func NS_LOG mühit dəyişəninə. Aşağıdakıları sınayın:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

Qeyd edək ki, dırnaq işarələri zəruridir, çünki OR əməliyyatını təmsil etmək üçün istifadə etdiyimiz şaquli çubuq da Unix boru birləşdiricisidir. İndi skripti işə salsanız, görəcəksiniz ki, qeyd sistemi verilmiş jurnaldakı hər mesajın komponent adı ilə prefiks olmasını təmin edir.

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.417s)
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()

İndi UDP echo müştəri proqramından gələn bütün mesajların belə müəyyən edildiyini görə bilərsiniz. Mesaj "Received 1024 bytes from 10.1.1.2" indi echo müştəri tətbiqindən gəldiyi aydın şəkildə müəyyən edilir. Qalan mesaj UDP echo server proqramından gəlməlidir. NS_LOG mühit dəyişəninə iki nöqtə ilə ayrılmış komponentlər siyahısı daxil etməklə bu komponenti aktivləşdirə bilərik.

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func:
               UdpEchoServerApplication=level_all|prefix_func'

Xəbərdarlıq: Yuxarıdakı nümunə mətndə iki nöqtədən (:) sonra yeni sətir simvolunu silməli olacaqsınız, o, sənədi formatlaşdırmaq üçün istifadə olunur. İndi skripti işlətsəniz, müştəri və server əks-səda proqramlarından bütün qeyd mesajlarını görəcəksiniz. Bunun sazlama zamanı çox faydalı ola biləcəyini görə bilərsiniz.

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.406s)
UdpEchoServerApplication:UdpEchoServer()
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoServerApplication:StartApplication()
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1
UdpEchoServerApplication:HandleRead(): Echoing packet
UdpEchoClientApplication:HandleRead(0x624920, 0x625160)
UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
UdpEchoServerApplication:StopApplication()
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()

Günlük mesajının yaradıldığı simulyasiya vaxtını görmək də bəzən faydalıdır. Bunu OR bitini əlavə etməklə edə bilərsiniz prefiks_zaman:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func|prefix_time: UdpEchoServerApplication=level_all|prefix_func|prefix_time'

Yenə yuxarıdakı yeni sətir simvolunu silməli olacaqsınız. İndi skripti işlədirsinizsə, aşağıdakı çı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)
0s UdpEchoServerApplication:UdpEchoServer()
0s UdpEchoClientApplication:UdpEchoClient()
0s UdpEchoClientApplication:SetDataSize(1024)
1s UdpEchoServerApplication:StartApplication()
2s UdpEchoClientApplication:StartApplication()
2s UdpEchoClientApplication:ScheduleTransmit()
2s UdpEchoClientApplication:Send()
2s UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
2.00369s UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1
2.00369s UdpEchoServerApplication:HandleRead(): Echoing packet
2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)
2.00737s UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
10s UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()

Nəzərə alın ki, konstruktor üçün UdpEchoServer simulyasiya zamanı 0 saniyə çağırıldı. Bu, əslində simulyasiya başlamazdan əvvəl baş verir, lakin vaxt sıfır saniyə kimi göstərilir. Eyni şey konstruktor mesajı üçün də keçərlidir UdpEchoClient.

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)
0s UdpEchoServerApplication:UdpEchoServer()
0s UdpEchoClientApplication:UdpEchoClient()
0s UdpEchoClientApplication:SetDataSize(1024)
1s UdpEchoServerApplication:StartApplication()
2s UdpEchoClientApplication:StartApplication()
2s UdpEchoClientApplication:ScheduleTransmit()
2s UdpEchoClientApplication:Send()
2s UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
2.00369s UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1
2.00369s UdpEchoServerApplication:HandleRead(): Echoing packet
2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)
2.00737s UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
10s UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()

Xatırladaq ki, skript scratch/first.cc simulyasiya başlamazdan bir saniyə əvvəl echo server proqramını işə saldı. İndi bu üsulu görə bilərsiniz Tətbiqə başlayın server əslində birinci saniyədə çağırılır. Siz həmçinin qeyd edə bilərsiniz ki, echo müştəri skriptdə soruşduğumuz kimi simulyasiyanın ikinci saniyəsində başlayır.

İndi zəng zamanı simulyasiyanın gedişatını izləyə bilərsiniz ScheduleTransmit HandleRead geri çağırışını çağıran müştəridə echo server proqramında göndər. Nəzərə alın ki, bir nöqtədən nöqtəyə keçid üzərindən paket göndərmək üçün keçən vaxt 3,69 millisaniyədir. Siz echo serverinin paketə cavab verdiyi mesajı qeyd etdiyini görə bilərsiniz və sonra kanal gecikməsindən sonra əks-səda müştərisinin öz HandleRead metodunda əks-səda paketini qəbul etdiyini görə bilərsiniz.

Bu simulyasiyada siz fərq etmədən çox şey baş verir. Ancaq sistemdəki bütün giriş komponentlərini işə salmaqla bütün prosesi çox asanlıqla izləyə bilərsiniz. NS_LOG dəyişənini aşağıdakı dəyərə təyin etməyə cəhd edin,

$ export 'NS_LOG=*=level_all|prefix_func|prefix_time'

Yuxarıdakı ulduz qeyd komponenti üçün joker simvoldur. Bu, simulyasiyada istifadə olunan bütün komponentlərdəki bütün qeydləri əhatə edəcək. Mən burada çıxışı təkrarlamayacağam (yazı zamanı o, tək əks-səda paketi üçün 1265 sətir çıxış verir), lakin siz bu məlumatı fayla yönləndirə və sevimli redaktorunuzda baxa bilərsiniz.

$ ./waf --run scratch/myfirst > log.out 2>&1

Mən şəxsən problemim olanda və işlərin harada səhv getdiyi barədə heç bir fikrim olmayanda girişin bu son dərəcə ətraflı versiyasından istifadə edirəm. Mən kəsmə nöqtələrini təyin etmədən və sazlayıcıda kodu keçmədən kodun icrasını asanlıqla izləyə bilərəm. Mən sadəcə sevimli redaktorumda çıxışı redaktə edə və gözlədiklərimi axtara və gözləmədiyim bir şeyin baş verdiyini görə bilərəm. Nəyin baş verdiyi barədə ümumi təsəvvürüm olduqdan sonra problemi həll etmək üçün sazlayıcıya daxil oluram. Bu cür çıxış, skriptiniz tamamilə gözlənilməz bir şey etdikdə xüsusilə faydalı ola bilər. Yalnız sazlayıcıdan istifadə etsəniz, bükülməni tamamilə əldən verə bilərsiniz. Qeydiyyat bu cür dönüşləri nəzərə çarpdırır.

5.1.3 Kodunuza girişin əlavə edilməsi

Siz çoxlu makrolardan jurnal komponentinə zəng etməklə simulyasiyalarınıza yeni qeydlər əlavə edə bilərsiniz. Gəlin bunu skriptdə edək myfirst.cc"təmiz" kataloqumuzda olan. Xatırladaq ki, bu ssenaridə qeyd komponenti təyin etmişdik:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Siz müxtəlif səviyyələrdə NS_LOG mühit dəyişənini təyin etməklə bu komponentdən bütün mesajların qeydiyyatını aktivləşdirə biləcəyinizi bilirsiniz. Gəlin davam edək və ssenariyə bəzi girişlər əlavə edək. Məlumat səviyyəsi mesajlarını jurnala əlavə etmək üçün istifadə olunan makro NS_LOG_INFO-dur. Skriptin "Topologiyanın yaradılması" mərhələsində olduğunu bildirən bir mesaj əlavə edək (qovşaqlar yaratmağa başlamazdan əvvəl). Bu, aşağıdakı kod parçasında edilir,
Açmaq scratch/myfirst.cc sevimli redaktorunuzda və sətri əlavə edin,
NS_LOG_INFO ("Creating Topology");
düz xətlərdən əvvəl,

NodeContainer nodes;
nodes.Create (2);

İndi istifadə edərək skripti tərtib edin vəf, və əvvəllər aktiv etdiyimiz qeyd axınını söndürmək üçün NS_LOG dəyişənini təmizləyin:

$ ./waf
$ export NS_LOG=
Теперь, если вы запустите скрипт,
$ ./waf --run scratch/myfirst

Əlaqədar giriş komponenti (FirstScriptExample) aktiv edilmədiyi üçün siz yeni mesajı görməyəcəksiniz. Mesajınızı görmək üçün giriş komponentini aktivləşdirməlisiniz FirstScript Nümunəsi NS_LOG_INFO-dan aşağı olmayan səviyyə ilə. Bu xüsusi giriş səviyyəsini görmək istəyirsinizsə, onu bu şəkildə aktivləşdirə bilərsiniz,

$ export NS_LOG=FirstScriptExample=info

İndi skripti işlədirsinizsə, "Topologiyanın yaradılması" yeni mesajı görəcəksiniz.

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.404s)
Creating Topology
Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
Received 1024 bytes from 10.1.1.2

5.2 Komanda xətti arqumentlərindən istifadə

5.2.1 Defolt atribut dəyərlərinin ləğv edilməsi

Redaktə etmədən və ya qurmadan ns-3 skriptlərinin davranışını dəyişdirməyin başqa bir yolu komanda xətti arqumentlərindən istifadə etməkdir. Biz komanda xətti arqumentlərini təhlil etmək və nəticələrə əsasən yerli və qlobal dəyişənləri avtomatik təyin etmək üçün mexanizm təqdim edirik.

Komanda xətti arqument sistemindən istifadənin ilk addımı komanda xətti təhlilçisini elan etməkdir. Bunu etmək olduqca asandır (əsas proqramınızda), aşağıdakı kodda olduğu kimi,

int
main (int argc, char *argv[])
{
...
CommandLine cmd;
cmd.Parse (argc, argv);
...
}

Bu sadə iki sətirli parça əslində özlüyündə çox faydalıdır. O, ns-3 qlobal dəyişən və atribut sisteminə qapı açır. Əsas skript funksiyasının əvvəlinə iki sətir kod əlavə edək scratch/myfirst.cc. Davam edərək, skripti tərtib edirik və işə salırıq, işləyərkən aşağıdakı kimi kömək sorğusu veririk,

$ ./waf --run "scratch/myfirst --PrintHelp"

Bu əmr soruşacaq Waf skripti işlədin cızmaq/ilk və ona komanda xətti arqumentini ötürün — PrintHelp. Arqumentin hansı proqram üçün nəzərdə tutulduğunu göstərmək üçün dırnaq işarələri tələb olunur. Komanda xətti təhlilçisi arqumenti aşkar edəcək — PrintHelp və cavabı göstərəcək,

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.413s)
TcpL4Protocol:TcpStateMachine()
CommandLine:HandleArgument(): Handle arg name=PrintHelp value=
--PrintHelp: Print this help message.
--PrintGroups: Print the list of groups.
--PrintTypeIds: Print all TypeIds.
--PrintGroup=[group]: Print all TypeIds of group.
--PrintAttributes=[typeid]: Print all attributes of typeid.
--PrintGlobals: Print the list of globals.

İndi varianta baxaq -Çap atributları. Birinci.cc skriptini öyrənərkən artıq ns-3 atribut sistemini qeyd etdik. Aşağıdakı kod sətirlərini gördük,

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

və bunu dedilər DataRate əslində bir atributdur PointToPointNetDevice. Atributlara baxmaq üçün komanda xətti arqument təhlilçisindən istifadə edək PointToPointNetDevice. Yardım siyahısı nəyi təmin etməli olduğumuzu deyir TypeId. Bu, maraq atributlarının aid olduğu sinfin adıdır. Bizim vəziyyətimizdə belə olacaq ns3::PointToPointNetDevice. Gəlin irəliləməyə davam edək, girin,

$ ./waf --run "scratch/myfirst --PrintAttributes=ns3::PointToPointNetDevice"

Sistem bu şəbəkə cihazı növünün bütün atributlarını çap edəcək. Siyahıdakı atributlar arasında aşağıdakıları görəcəksiniz:

--ns3::PointToPointNetDevice::DataRate=[32768bps]:
The default data rate for point to point links

Bu, obyekti yaratarkən sistem tərəfindən istifadə ediləcək standart dəyərdir PointToPointNetDevice. Parametrdən istifadə edərək bu standart dəyəri ləğv edəcəyik atribut в PointToPointHelper daha yüksək. Nöqtədən nöqtəyə cihazlar və kanallar üçün standart dəyərlərdən istifadə edək. Bunun üçün zəngləri siləcəyik SetDeviceAttribute и SetChannelAttribute haqqında myfirst.cctəmiz kataloqda olan .

Skriptiniz indi sadəcə elan etməlidir PointToPointHelper və aşağıdakı nümunədə göstərildiyi kimi heç bir quraşdırma əməliyyatı həyata keçirməyin,

...
NodeContainer nodes;
nodes.Create (2);
PointToPointHelper pointToPoint;
NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);
...

Davam edin və yeni skript yaradın Waf (./waff) və gəlin geri qayıdıb UDP echo server proqramından bəzi girişləri daxil edək və vaxt prefiksini daxil edək.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

Skripti işlədirsinizsə, aşağıdakı çı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.405s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Sent 1024 bytes to 10.1.1.2
2.25732s Received 1024 bytes from 10.1.1.1
2.25732s Echoing packet
Received 1024 bytes from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

Xatırladaq ki, sonuncu dəfə simulyasiya vaxtına baxdığımızda, paketin echo server tərəfindən qəbul edildiyi an bu, 2,00369 saniyə idi.

2.00369s UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1

İndi o, paketi 2.25732 saniyəyə alır. Bunun səbəbi, sadəcə olaraq PointToPointNetDevice məlumat sürətini saniyədə beş meqabitdən standart dəyərə, yəni saniyədə 32768 bitə sıfırlamağımızdır. Əgər komanda xəttindən istifadə edərək yeni bir DataRate əvəz etsəydik, simulyasiyamızı yenidən sürətləndirə bilərik. Kömək elementinin nəzərdə tutduğu düstura uyğun olaraq bunu aşağıdakı kimi edəcəyik:

$ ./waf --run "scratch/myfirst --ns3::PointToPointNetDevice::DataRate=5Mbps"

Bu, DataRate atributunu saniyədə beş meqabitlik standart dəyərinə qaytaracaq. Nəticə sizi təəccübləndirir? Belə çıxır ki, skriptin orijinal davranışını qaytarmaq üçün kanalın gecikməsini də işıq sürətinə uyğun təyin etməliyik. Biz komanda xətti sistemindən şəbəkə cihazı üçün etdiyimiz kimi kanal atributlarını çap etməyi xahiş edə bilərik:

$ ./waf --run "scratch/myfirst --PrintAttributes=ns3::PointToPointChannel"

Kanalın gecikmə atributunun aşağıdakı kimi təyin olunduğunu görəcəyik:

--ns3::PointToPointChannel::Delay=[0ns]:
Transmission delay through the channel

Bundan sonra komanda xətti sistemi vasitəsilə bu standart dəyərlərin hər ikisini təyin edə bilərik.

$ ./waf --run "scratch/myfirst
--ns3::PointToPointNetDevice::DataRate=5Mbps
--ns3::PointToPointChannel::Delay=2ms"

bu halda biz skriptdə DataRate və Gecikməni açıq şəkildə təyin etdiyimiz vaxtı bərpa edirik:

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.417s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Sent 1024 bytes to 10.1.1.2
2.00369s Received 1024 bytes from 10.1.1.1
2.00369s Echoing packet
Received 1024 bytes from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

Qeyd edək ki, paket 2,00369 saniyədən sonra yenidən server tərəfindən qəbul edilir. Biz əslində skriptdə istifadə olunan atributlardan hər hansı birini bu şəkildə təyin edə bilərik. Xüsusilə, biz MaxPackets atributlarını bir olmayan dəyərlərə təyin edə bilərik UdpEchoClient.

Ondan necə istifadə edərdiniz? Bir cəhd edin. Unutmayın ki, defolt atribut dəyərini ləğv etdiyimiz və açıq şəkildə təyin etdiyimiz yeri şərh etməlisiniz MaxPackets skriptdə. Sonra skripti yenidən qurmalısınız. Siz həmçinin yeni standart atribut dəyərini təyin etmək üçün sintaksis yardımı almaq üçün əmr satırından istifadə edə bilərsiniz. Bunu başa düşdükdən sonra komanda xəttində göstərilən paketlərin sayını idarə edə bilərsiniz. Biz çalışqan insanlar olduğumuz üçün komanda xəttimiz belə görünməlidir:

$ ./waf --run "scratch/myfirst
--ns3::PointToPointNetDevice::DataRate=5Mbps
--ns3::PointToPointChannel::Delay=2ms
--ns3::UdpEchoClient::MaxPackets=2"

Bu məqamda ortaya çıxan təbii sual bütün bu xüsusiyyətlərin mövcudluğunu necə bilməkdir. Yenə də, komanda xətti sisteminin bu məsələ üçün yardım funksiyası var. Komanda xəttindən kömək istəsək, görməliyik:

$ ./waf --run "scratch/myfirst --PrintHelp"
myfirst [Program Arguments] [General Arguments]
General Arguments:
--PrintGlobals: Print the list of globals.
--PrintGroups: Print the list of groups.
--PrintGroup=[group]: Print all TypeIds of group.
--PrintTypeIds: Print all TypeIds.
--PrintAttributes=[typeid]: Print all attributes of typeid.
--PrintHelp: Print this help message.

Əgər "PrintGroups" arqumentini seçsəniz, bütün qeydiyyatdan keçmiş qrupların siyahısını görməlisiniz TypeId. Qrup adları mənbə kataloqundakı modulların adlarına uyğundur (böyük hərflə də olsa). Bütün məlumatları bir anda çap etmək çox həcmli olardı, ona görə də məlumatı qruplar üzrə çap etmək üçün əlavə filtr mövcuddur. Beləliklə, yenidən nöqtədən nöqtəyə moduluna diqqət yetirək:

./waf --run "scratch/myfirst --PrintGroup=PointToPoint"
TypeIds in group PointToPoint:
ns3::PointToPointChannel
ns3::PointToPointNetDevice
ns3::PointToPointRemoteChannel
ns3::PppHeader

Burada atribut axtarışları üçün mövcud TypeId adlarını tapa bilərsiniz, məsələn
--PrintAttributes = ns3 :: PointToPointChannelyuxarıda göstərildiyi kimi.

Atributlar haqqında öyrənməyin başqa bir yolu Doxygen ns‑3 vasitəsilədir. Simulyatorda qeydə alınmış bütün atributları sadalayan bir səhifə var.

5.2.2 Öz əmrlərinizin ələ keçirilməsi

Siz həmçinin komanda xətti sistemi vasitəsilə öz qarmaqlarınızı əlavə edə bilərsiniz. Bu, sadəcə olaraq, komanda xətti təhlili metodundan istifadə etməklə edilir Əlavə Dəyər.
Tamamilə fərqli şəkildə göstəriləcək paketlərin sayını təyin etmək üçün bu xüsusiyyətdən istifadə edək. adlı yerli dəyişəni əlavə edək nPackets funksiyaya çevrilir Elanlar . Əvvəlki defolt davranışımıza uyğunlaşdırmaq üçün onu birinə təyin edəcəyik. Komanda xətti təhlilçisinə bu dəyəri dəyişməyə icazə vermək üçün biz bu dəyəri təhlilçidə tutmalıyıq. Bunu zəng əlavə etməklə edirik Əlavə Dəyər. Gedin və skripti dəyişdirin scratch/myfirst.cc aşağıdakı kodla başlamaq üçün,

int
main (int argc, char *argv[])
{
uint32_t nPackets = 1;
CommandLine cmd;
cmd.AddValue("nPackets", "Number of packets to echo", nPackets);
cmd.Parse (argc, argv);
...

Skriptdə MaxPackets atributunu təyin etdiyimiz nöqtəyə qədər aşağı diyirləyin və onu dəyişdirin ki, aşağıda göstərildiyi kimi sabit 1 əvəzinə nPackets dəyişəninə təyin olunsun.

echoClient.SetAttribute ("MaxPackets", UintegerValue (nPackets));

İndi skripti işlədirsinizsə və -PrintHelp arqumentini təqdim edirsinizsə, yeni istifadəçi arqumentini görməlisiniz. yardım ekranında göstərilir. Daxil edin,

$ ./waf --run "scratch/myfirst --PrintHelp"
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.403s)
--PrintHelp: Print this help message.
--PrintGroups: Print the list of groups.
--PrintTypeIds: Print all TypeIds.
--PrintGroup=[group]: Print all TypeIds of group.
--PrintAttributes=[typeid]: Print all attributes of typeid.
--PrintGlobals: Print the list of globals.
User Arguments:
--nPackets: Number of packets to echo

Əgər ötürülən paketlərin sayını dəyişmək istəyirsinizsə, bunu əmr xətti arqumentini - -nPackets təyin etməklə edə bilərsiniz.

$ ./waf --run "scratch/myfirst --nPackets=2"

İndi indi görməlisən

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.404s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Sent 1024 bytes to 10.1.1.2
2.25732s Received 1024 bytes from 10.1.1.1
2.25732s Echoing packet
Received 1024 bytes from 10.1.1.2
Sent 1024 bytes to 10.1.1.2
3.25732s Received 1024 bytes from 10.1.1.1
3.25732s Echoing packet
Received 1024 bytes from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

İndi iki paket göndərdiniz. Olduqca sadə, elə deyilmi?
Görə bilərsiniz ki, ns-3 istifadəçisi olaraq qlobal dəyərləri və atributları manipulyasiya etmək üçün komanda xətti arqument sistemindən istifadə edə bilərsiniz. Modelin müəllifisinizsə, obyektlərinizə yeni atributlar əlavə edə bilərsiniz və onlar avtomatik olaraq komanda xətti sistemi vasitəsilə istifadəçiləriniz tərəfindən konfiqurasiya üçün əlçatan olacaq. Əgər skript müəllifisinizsə, skriptlərinizə yeni dəyişənlər əlavə edə və onları komanda xətti sisteminizə problemsiz şəkildə qoşa bilərsiniz.

5.3 İzləmə sistemindən istifadə

Modelləşdirmənin bütün məqamı sonrakı tədqiq üçün məhsul yaratmaqdır və ns-3 izləmə sistemi bunun üçün əsas mexanizmdir. ns-3 C++ proqramı olduğundan, C++ proqramından çıxış yaratmaq üçün standart vasitələrdən istifadə edilə bilər:

#include <iostream>
...
int main ()
{
...
std::cout << "The value of x is " << x << std::endl;
...
}

Həllinizə bir az struktur əlavə etmək üçün hətta giriş modulundan istifadə edə bilərsiniz. Bu yanaşmanın yaratdığı bir çox məlum problemlər var və buna görə də biz bu problemləri həll etmək üçün ümumi hadisə izləmə alt sistemini təqdim etdik.

Ns-3 izləmə sisteminin əsas məqsədləri:

  • Əsas tapşırıqlar üçün izləmə sistemi istifadəçiyə məşhur mənbələr üçün standart iz yaratmağa və izi yaradan obyektləri seçməyə imkan verməlidir;

  • Aralıq istifadəçilər, simulyatorun nüvəsini dəyişdirmədən yaradılan çıxış formatını dəyişdirmək və ya yeni iz mənbələri daxil etmək üçün izləmə sistemini genişləndirə bilməlidirlər;

  • Qabaqcıl istifadəçilər yeni iz mənbələri və yuvalar əlavə etmək üçün simulyatorun nüvəsini dəyişdirə bilər. Ns-3 izləmə sistemi müstəqil izləmə mənbələri və qəbulediciləri, eləcə də mənbələri istehlakçılara birləşdirən vahid mexanizm prinsipləri əsasında qurulub.

Ns-3 izləmə sistemi müstəqil izləmə mənbələri və qəbulediciləri, eləcə də mənbələrin qəbuledicilərə qoşulması üçün vahid mexanizm prinsipləri əsasında qurulub. İz mənbələri simulyasiyada baş verən hadisələri siqnal edə bilən və maraq doğuran əsas məlumatlara çıxışı təmin edən obyektlərdir. Məsələn, iz mənbəyi şəbəkə cihazının nə vaxt paketi qəbul etdiyini göstərə və paketin məzmununu maraqlı iz qəbulediciləri üçün əlçatan edə bilər.

İz mənbələri, lavabonun verdiyi məlumatla həqiqətən faydalı bir şey edən kodun digər hissələri ilə "qoşulmadıqca" faydasızdır. İzləyicilər izləmə mənbələri tərəfindən təmin edilən hadisələrin və məlumatların istehlakçılarıdır. Məsələn, siz (əvvəlki nümunənin iz mənbəyinə qoşulduqda) alınan paketdəki maraq hissələrini çap edəcək bir iz yuvası yarada bilərsiniz.

Bu açıq ayrılığın əsas səbəbi istifadəçilərə simulyatorun nüvəsini redaktə etmədən və yenidən tərtib etmədən yeni sink növlərini mövcud iz mənbələrinə qoşmağa imkan verməkdir. Beləliklə, yuxarıdakı nümunədə istifadəçi öz skriptində yeni izləyici təyin edə və onu simulyasiya nüvəsində müəyyən edilmiş mövcud iz mənbəyinə yalnız istifadəçi skriptini redaktə etməklə qoşa bilər.

Bu dərslikdə biz əvvəlcədən müəyyən edilmiş bəzi mənbələr və yuvaları nəzərdən keçirəcəyik və onların istifadəçi tərəfindən ən az səylə necə konfiqurasiya oluna biləcəyini göstərəcəyik. Qabaqcıl iz konfiqurasiyası, o cümlədən iz ad məkanının genişləndirilməsi və yeni iz mənbələrinin yaradılması haqqında məlumat üçün ns-3 Təlimatına və ya necə etməli bölmələrinə baxın.

5.3.1 ASCII İzləmə

ns-3 sadə paket izlərini qurarkən təfərrüatlarda sizə kömək etmək üçün aşağı səviyyəli izləmə sistemini təmin edən köməkçi funksionallıq təmin edir. Bu funksiyanı aktiv etsəniz, çıxışı ASCII fayllarında görəcəksiniz. Ns-2 çıxışı ilə tanış olanlar üçün bu tip iz oxşardır out.tr, bir çox skript tərəfindən yaradılan.

Gəlin işə başlayaq və Scratch/myfirst.cc skriptimizə bəzi ASCII izləmə nəticələri əlavə edək. Zəngdən əvvəl Simulator :: Run (), aşağıdakı kod sətirlərini əlavə edin:
AsciiTraceHelper ascii;

pointToPoint.EnableAsciiAll (ascii.CreateFileStream ("myfirst.tr"));

Bir çox digər ns-3 idiomları kimi, bu kod da ASCII izləri yaratmaq üçün köməkçi obyektdən istifadə edir. İkinci sətir iki iç-içə metod çağırışını ehtiva edir. "Daxili" metodu CreateFileStream() yığında (obyekt adı olmadan) fayl axını obyekti yaratmaq üçün anonim obyekt idiomundan istifadə edir və onu çağırılan metoda ötürür. Gələcəkdə bu mövzuya daha dərindən girəcəyik, lakin bu nöqtədə bilmək lazımdır ki, siz adlı faylı təmsil edən obyekt yaratırsınız. myfirst.tr və ns-3-ə köçürün. Biz ns-3-ə yaradılmış obyektə bütün ömrü boyu qulluq etməyi həvalə edirik, bu müddət ərzində o, C++ axın obyektinin surəti konstruktorları ilə əlaqəli az bilinən (qəsdən) məhdudiyyətin yaratdığı problemləri həll edir.

Xarici zəng EnableAsciiAll() köməkçiyə bütün nöqtədən-nöqtəyə cihaz birləşmələri üçün simulyasiyanıza ASCII izləməni daxil etmək istədiyinizi və (müəyyən edilmiş) iz qəbuledicilərinin paket hərəkəti məlumatlarını ASCII formatında qeyd etməsini istədiyinizi bildirir.

Ns-2 ilə tanış olanlar üçün izlənilən hadisələr "+", "-", "d" və "r" hadisələrini qeyd edən məlum izləmə nöqtələrinə ekvivalentdir.
İndi skripti yarada və onu əmr satırından işə sala bilərsiniz:

$ ./waf --run scratch/myfirst

Əvvəllər dəfələrlə olduğu kimi, siz Waf-dan bir neçə mesaj görəcəksiniz və sonra işləyən proqramdan bəzi mesajlarla “qurma” uğurla başa çatdı”.

İşləyərkən proqram adlı bir fayl yaradacaq myfirst.tr. İşin xarakterinə görə Waf, default olaraq fayl yerli kataloqda deyil, repozitoriyanın yuxarı səviyyəli kataloqunda yaradılır. Əgər izlərin saxlandığı yolu dəyişdirmək istəyirsinizsə, onu təyin etmək üçün Waf parametrindən istifadə edə bilərsiniz. --cwd. Biz bunu etməmişik, ona görə də sevimli redaktorunuzda myfirst.tr ASCII izləmə faylına baxmaq üçün anbarımızın yuxarı səviyyəli kataloquna keçməliyik.

ASCII izlərinin təhlili

Orada kifayət qədər sıx formada çoxlu məlumat var, lakin diqqət etməli olduğunuz ilk şey faylın fərdi sətirlərdən ibarət olmasıdır. Baxış pəncərəsini daha da genişləndirsəniz, bu aydın görünəcək.

Fayldakı hər bir sətir izləmə hadisəsinə uyğundur. Bu halda, biz simulyasiyada hər bir nöqtədən-nöqtəyə şəbəkə cihazında mövcud olan ötürmə növbəsindəki hadisələri izləyirik. Ötürmə növbəsi hər bir paketin bir nöqtədən nöqtəyə keçid üçün keçməli olduğu növbədir. Nəzərə alın ki, iz faylındakı hər bir sətir tək simvolla başlayır (və ondan sonra boşluq var). Bu simvolun aşağıdakı mənası olacaq:

+: cihaz növbəsində növbə əməliyyatı baş verdi;
-: cihaz növbəsində element axtarış əməliyyatı baş verdi;
d: paket atıldı, adətən növbə dolu idi;
r: Paket şəbəkə cihazı tərəfindən qəbul edilib.

İz faylındakı ilk sətirə daha yaxından nəzər salaq. Mən onu hissələrə (aydınlıq üçün girintilərlə) və soldakı sətir nömrəsinə ayıracağam:

0 +
1 2
2 /NodeList/0/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Enqueue
3 ns3::PppHeader (
4   Point-to-Point Protocol: IP (0x0021))
6   ns3::Ipv4Header (
7     tos 0x0 ttl 64 id 0 protocol 17 offset 0 flags [none]
8     length: 1052 10.1.1.1 > 10.1.1.2)
9     ns3::UdpHeader (
10      length: 1032 49153 > 9)
11      Payload (size=1024)

Bu genişləndirilmiş izləmə hadisəsinin ilk bölməsi (sətir 0) əməliyyatdır. Burada ötürmə üçün növbə əməliyyatına uyğun gələn + simvolumuz var. İkinci bölmə (sətir 1) saniyələrlə ifadə edilən simulyasiya vaxtıdır. Soruşduğumuzu xatırlayırsınız UdpEchoClientApplication iki saniyə ərzində paketləri göndərməyə başlayın. Burada biz bunun həqiqətən baş verdiyinin təsdiqini görürük.

İz nümunəsinin növbəti bölməsi (2-ci sətirdən) bu hadisəni hansı iz mənbəyinin yaratdığını göstərir (ad sahəsi izini göstərir). İz ad sahəsini fayl sistemi ad məkanı kimi düşünə bilərsiniz. Ad sahəsinin kökü NodeList. Bu, əsas ns-3 kodunda idarə olunan konteynerə uyğundur. O, skriptdə yaradılan bütün qovşaqları ehtiva edir. Necə ki, fayl sisteminin kökündə kataloqlar ola bilər, NodeList çoxlu qovşaqlarımız ola bilər. Beləliklə, /NodeList/0 xətti NodeList-dəki null node-a aiddir, bizim adətən "node 0" kimi düşündüyümüz. Hər bir qovşaqda quraşdırılmış cihazların siyahısı var. Bu siyahı ad sahəsinin sonrakı hissəsində yerləşir. Bu iz hadisəsindən gəldiyini görə bilərsiniz Cihaz siyahısı/0, node quraşdırılmış null cihazdır.

Növbəti alt sətir, $ ns3 :: PointToPointNetDevice, hansı cihazın sıfır mövqedə olduğunu bildirir: node node-un cihaz siyahısı. Xatırladaq ki, 0-cı sətirdə tapılan + əməliyyatı cihazın ötürmə növbəsinə elementin əlavə edilməsi demək idi. Bu, "yol yolunun" son seqmentlərində əks olunur: TxQueue/Növbə.

İzdə qalan bölmələr kifayət qədər intuitiv olmalıdır. 3-4-cü sətirlər paketin “nöqtədən nöqtəyə” protokolunda əhatə olunduğunu göstərir. 5-7-ci sətirlər paketin IP4 versiyasının başlığına malik olduğunu və IP ünvanında yarandığını göstərir 10.1.1.1 və üçün nəzərdə tutulub 10.1.1.2. 8-9-cu sətirlər bu paketin UDP başlığına malik olduğunu göstərir və nəhayət 10-cu sətir faydalı yükün gözlənilən 1024 bayt olduğunu göstərir.

İz faylındakı növbəti sətir eyni paketin eyni node üzrə ötürmə növbəsindən çəkildiyini göstərir.

İz faylındakı üçüncü sətir paketin echo server hostunda olan şəbəkə cihazı tərəfindən qəbul edildiyini göstərir. Aşağıdakı hadisəni təkrarladım.

0 r
1 2.25732
2 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/MacRx
3   ns3::Ipv4Header (
4     tos 0x0 ttl 64 id 0 protocol 17 offset 0 flags [none]
5     length: 1052 10.1.1.1 > 10.1.1.2)
6     ns3::UdpHeader (
7       length: 1032 49153 > 9)
8       Payload (size=1024)

Qeyd edək ki, izləmə əməliyyatı indi r-dir və simulyasiya vaxtı 2,25732 saniyəyə qədər artırılıb. Təlimata diqqətlə əməl etmisinizsə, bu o deməkdir ki, siz şəbəkə cihazlarının DataRate və Link Gecikməsini standart dəyərlərində tərk etmişsiniz. Əvvəlki hissədə gördüyünüz kimi bu zaman tanış olmalıdır.

İz mənbəyi ad məkanı girişi (sətir 2) bu hadisənin 1-ci qovşaqdan (/) qaynaqlandığını əks etdirmək üçün dəyişdirildi.NodeList/1) və paket izləmə mənbəyi tərəfindən qəbul edilir (/MacRx). Faylda qalan izlərə baxaraq, topologiya üzrə paketin hərəkətini izləmək sizin üçün kifayət qədər asan olmalıdır.

5.3.2 PCAP İzi

ns-3 Device Helpers həmçinin .pcap formatında iz faylları yaratmaq üçün istifadə edilə bilər. Akronim paça (adətən kiçik hərflərlə yazılır) paket ələ keçirmə mənasını verir və əslində .pcap fayl formatının müəyyən edilməsini ehtiva edən API-dir. Bu formatı oxuya və göstərə bilən ən məşhur proqramdır Wireshark (əvvəllər adlanırdı Etereal). Bununla belə, bu paket formatından istifadə edən bir çox trafik izi analizatorları var. Biz istifadəçiləri pcap izlərini təhlil etmək üçün mövcud olan çoxlu alətlərdən istifadə etməyə təşviq edirik. Bu dərslikdə biz istifadə edərək pcap izlərinə baxmağa diqqət edəcəyik tcpdump.

Pcap izləmənin aktivləşdirilməsi bir kod sətri ilə həyata keçirilir.

pointToPoint.EnablePcapAll ("myfirst");

Bu kod sətrini indicə əlavə etdiyimiz ASCII iz kodundan sonra yapışdırın scratch/myfirst.cc. Nəzərə alın ki, biz yalnız "myfirst" sətrini keçdik, "myfirst.pcap" və ya buna bənzər bir şey yox. Bunun səbəbi, parametrin tam fayl adı deyil, prefiks olmasıdır. Simulyasiya zamanı köməkçi faktiki olaraq hər bir nöqtədən-nöqtəyə cihaz üçün iz faylı yaradacaq. Fayl adları prefiks, qovşaq nömrəsi, cihaz nömrəsi və şəkilçidən istifadə edilməklə qurulacaq ".paça.

Nümunə skriptimiz üçün "adlı faylları görəcəyik.myfirst-0-0.pcap"Və"myfirst-1-0.pcap", bunlar müvafiq olaraq 0-cihaz 0 və node 1-cihazı üçün pcap izləridir. Pcap izləməni aktivləşdirmək üçün kod xəttini əlavə etdikdən sonra skripti adi şəkildə işlədə bilərsiniz:

$ ./waf --run scratch/myfirst

Dağıtımınızın yuxarı səviyyəli kataloquna baxsanız, üç fayl görməlisiniz: ASCII iz faylı myfirst.tr, əvvəllər öyrəndiyimiz fayllar myfirst-0-0.pcap и myfirst-1-0.pcap - yeni yaratdığımız yeni pcap faylları.

tcpdump ilə çıxış oxunur

Hazırda pcap fayllarına baxmaq üçün ən asan yol tcpdump-dan istifadə etməkdir.

$ tcpdump -nn -tt -r myfirst-0-0.pcap
reading from file myfirst-0-0.pcap, link-type PPP (PPP)
2.000000 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, length 1024
2.514648 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, length 1024
tcpdump -nn -tt -r myfirst-1-0.pcap
reading from file myfirst-1-0.pcap, link-type PPP (PPP)
2.257324 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, length 1024
2.257324 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, length 1024

Zibillikdə myfirst-0-0.pcap (müştəri cihazı) simulyasiyadan 2 saniyə sonra əks-səda paketinin göndərildiyini görə bilərsiniz. İkinci zibilliyə baxsanız (myfirst-1-0.pcap), paketin 2,257324 saniyədə qəbul edildiyini görəcəksiniz. İkinci dumpda paketin 2.257324 saniyədə qaytarıldığını və nəhayət, paketin müştəri tərəfindən ilk dumpda 2.514648 saniyədə geri alındığını görəcəksiniz.

Wireshark ilə Oxu Çıxışı

Əgər tanış deyilsinizsə Wireshark, proqramları və sənədləri yükləyə biləcəyiniz bir veb sayt var: http://www.wireshark.org/. Wireshark bu iz fayllarını göstərmək üçün istifadə edilə bilən GUI-dir. Əgər sizdə Wireshark varsa, siz izləmə fayllarından hər hansı birini aça və məzmunu paket sniferindən istifadə edərək paketləri ələ keçirmiş kimi göstərə bilərsiniz.

Mənbə: www.habr.com

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