د ns-3 شبکې سمیلیټر ټیوټوریل. دریم څپرکی

د ns-3 شبکې سمیلیټر ټیوټوریل. دریم څپرکی
فصل 1,2
څپرکی 3
څپرکی 4

5 ترتیبات
5.1 د ننوتلو ماډل کارول
5.1.1 د ننوتلو عمومي کتنه
5.1.2 د ننوتلو وړ کول
5.1.3 ستاسو کوډ ته د ننوتلو اضافه کول
5.2 د کمانډ لاین دلیلونو کارول
5.2.1 د ډیفالټ خاصیت ارزښتونو څخه پورته کول
5.2.2 ستاسو د حکمونو نیول
5.3 د تعقیب سیسټم کارول
5.3.1 ASCII تعقیب
د ASCII نښې تجزیه کول
5.3.2 د PCAP ټریس

فصل 5

تعدیلات

5.1 د ننوتلو ماډل کارول

موږ دمخه په لنډه توګه د سکریپټ په کتلو سره د ns-3 د ننوتلو ماډل ته کتنه کړې لومړی.cc. په دې څپرکي کې، موږ به د ننوتلو فرعي سیسټم لپاره ممکنه کارونې ته نږدې کتنه وکړو.

5.1.1 د ننوتلو عمومي کتنه

ډیری لوی سیسټمونه د یو ډول پیغام د ننوتلو اسانتیا مالتړ کوي، او ns-3 هیڅ استثنا نه ده. په ځینو مواردو کې، یوازې د تېروتنې پیغامونه د "آپریټر کنسول" ته لیکل کیږي (کوم چې معمولا د یونیکس پر بنسټ سیسټمونو کې سټیډر دی). په نورو سیسټمونو کې، د خبرتیا پیغامونه او همدارنګه نور تفصيلي معلومات ښودل کیدی شي. په ځینو حاالتو کې، د ننوتلو وسیلې د ډیبګ پیغامونو د تولید لپاره کارول کیږي چې کولی شي په چټکۍ سره محصول روښانه کړي.

SubHRD په ns-3 کې کارول کیږي داسې انګیرل کیږي چې د معلوماتو مینځپانګې ټولې کچې ګټورې دي، او موږ د پیغام د ننوتلو لپاره یو انتخابي، پرت لرونکی طریقه چمتو کوو. ننوتل په بشپړ ډول غیر فعال کیدی شي، د هرې برخې په اساس فعال شوي، یا په نړیواله کچه. د دې هدف لپاره، د معلوماتو مینځپانګې د تنظیم وړ کچې کارول کیږي. د ns-3 د ننوتلو ماډل ستاسو د سمولو څخه ګټور معلومات ترلاسه کولو لپاره نسبتا ساده لار وړاندې کوي.

تاسو باید پوه شئ چې موږ ستاسو د ماډلونو څخه د معلوماتو استخراج لپاره د عمومي هدف میکانیزم - تعقیب - چمتو کوو، کوم چې باید د سمولو لپاره غوره محصول وي (زموږ د تعقیب سیسټم په اړه د نورو معلوماتو لپاره، د ښوونې برخه 5.3 وګورئ). لاګنګ باید د ډیبګ کولو معلوماتو ، اخطارونو ، خطا پیغامونو ترلاسه کولو لپاره غوره میتود وي ، یا په هر وخت کې ستاسو له سکریپټونو یا ماډلونو څخه د ګړندي پیغامونو رسولو لپاره.

اوس مهال، سیسټم د معلوماتو مینځپانګې په زیاتوالي کې د لاګ پیغامونو اوه درجې (ډولونه) تعریفوي.

  • LOG_ERROR - د خطا پیغامونو ننوتل (اړونده میکرو: NS_LOG_ERROR)؛
  • LOG_WARN - د خبرتیا پیغامونه ننوتل (اړونده میکرو: NS_LOG_WARN)؛
  • LOG_DEBUG - نسبتا نادر ځانګړي ډیبګ پیغامونه ننوتل (اړونده میکرو: NS_LOG_DEBUG)؛
  • LOG_INFO - د پروګرام د پرمختګ په اړه د معلوماتو پیغامونو ثبتول (اړونده میکرو: NS_LOG_INFO)؛
  • LOG_FUNCTION - پیغامونه لوګ کوي چې د هر فعالیت تشریح کوي (دوه اړوند میکرو: NS_LOG_FUNCTION، د غړو دندو لپاره کارول کیږي، او NS_LOG_FUNCTION_NOARGS، د جامد دندو لپاره کارول کیږي)؛
  • LOG_LOGIC - د ننوتلو پیغامونه چې په فنکشن کې منطقي جریان بیانوي (اړونده میکرو: NS_LOG_LOGIC)؛
  • LOG_ALL - پورته ذکر شوي هرڅه ننوځي (هیڅ تړاو نلري میکرو).
    د هر ډول (LOG_TYPE) لپاره یو LOG_LEVEL_TYPE هم شتون لري چې که کارول کیږي، د هغې پورته ټولو کچو ته اجازه ورکوي چې د هغې د کچې سربیره ننوتل شي. (د پایلې په توګه، LOG_ERROR او LOG_LEVEL_ERROR، او LOG_ALL او LOG_LEVEL_ALL په فعاله توګه مساوي دي.) د بیلګې په توګه، د LOG_INFO فعالول به یوازې د NS_LOG_INFO میکرو لخوا چمتو شوي پیغامونو ته اجازه ورکړي، پداسې حال کې چې د LOG_LOG_INFO میکرو لخوا چمتو شوي، د LOG_LOG_LEVELGs لخوا چمتو شوي پیغام کې به هم شامل وي. LOG_WARN او NS_LOG_ERROR.

موږ یو غیر مشروط لاګینګ میکرو هم چمتو کوو چې تل ښودل کیږي ، پرته لدې چې د ننوتلو کچې یا انتخاب برخې ته په پام سره.

  • NS_LOG_UNCOND - د اړونده پیغام غیر مشروط لاګنګ (د تړلو د ننوتلو کچه نشته).

هره کچه په انفرادي یا مجموعي ډول پوښتل کیدی شي. لاګنګ د sh چاپیریال متغیر NS_LOG په کارولو سره تنظیم کیدی شي یا د سیسټم فنکشن کال لاګ کولو سره. لکه څنګه چې مخکې ښودل شوي، د ننوتلو سیسټم د ډاکسیجن اسناد لري او اوس د دې بیاکتنې لپاره ښه وخت دی که تاسو مخکې نه وي کړی.

اوس چې تاسو اسناد په ډیر تفصیل سره لوستلي دي، راځئ چې دا پوهه وکاروو ترڅو د مثال سکریپټ څخه ځینې په زړه پوري معلومات ترلاسه کړو. scratch/myfirst.ccکوم چې تاسو دمخه تالیف کړی دی.

5.1.2 د ننوتلو وړ کول

راځئ چې د نورو لاګونو چلولو لپاره د NS_LOG چاپیریال متغیر وکاروو، مګر لومړی، یوازې د خپل بیرینګ ترلاسه کولو لپاره، وروستی سکریپټ چل کړئ لکه څنګه چې تاسو مخکې کړی و،

$ ./waf --run scratch/myfirst

تاسو باید د لومړي ns-3 مثال پروګرام څخه پیژندل شوي محصول وګورئ

$ 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

دا معلومه شوه چې "لیږل شوي" او "ترلاسه شوي" پیغامونه چې تاسو پورته ګورئ په حقیقت کې د ننوتلو پیغامونه دي UdpEchoClientApplication и UdpEchoServer اپلیکیشن. د مثال په توګه، موږ کولی شو د پیرودونکي غوښتنلیک څخه وغواړو چې د NS_LOG چاپیریال متغیر له لارې د هغې د ننوتلو کچه ترتیبولو سره اضافي معلومات چاپ کړي.

له اوس څخه، زه فرض کوم چې تاسو د sh- په څیر شیل کاروئ چې د "variable=value" ترکیب کاروي. که تاسو د Csh په څیر شیل کاروئ، نو تاسو باید زما مثالونه د "setenv متغیر ارزښت" ترکیب ته واړوئ چې د دې شیلونو لخوا اړین دي.

اوس مهال، د UDP اکو مراجع غوښتنلیک د کوډ لاندې لاین ته ځواب ورکوي scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

دا د ننوتلو کچه LOG_LEVEL_INFO فعالوي. کله چې موږ د ننوتلو کچې بیرغ تیر کړو ، موږ واقعیا دا کچه او ټولې ټیټې کچې فعالوو. په دې حالت کې، موږ NS_LOG_INFO، NS_LOG_DEBUG، NS_LOG_WARN او NS_LOG_ERROR فعال کړي دي. موږ کولی شو د ننوتلو کچه لوړه کړو او نور معلومات ترلاسه کړو، پرته له دې چې د سکریپټ بدلونونو او بیا جوړونې څخه، د NS_LOG چاپیریال متغیر په لاندې ډول ترتیبولو سره:

$ export NS_LOG=UdpEchoClientApplication=level_all

نو موږ د sh شیل متغیر NS_LOG لاندې ارزښت ته تنظیم کړو،

UdpEchoClientApplication=level_all

د دندې کیڼ اړخ د ننوتل شوي برخې نوم دی چې موږ یې تنظیم کول غواړو، او ښي اړخ هغه بیرغ دی چې موږ یې غواړو د هغې لپاره غوښتنه وکړو. پدې حالت کې ، موږ به په غوښتنلیک کې د ډیبګ کولو ټولې کچې فعال کړو. که تاسو سکریپټ د NS_LOG په دې ډول ترتیب کړئ، د ns-3 د ننوتلو سیسټم به بدلونونه ومني او تاسو باید لاندې محصول وګورئ:

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()

د اپلیکیشن لخوا چمتو شوي اضافي ډیبګ کولو معلومات اوس د NS_LOG_FUNCTION کچه کې دي. دا د سکریپټ اجرا کولو پرمهال د فنکشن کال هره بیلګه ښیې. د عمومي قاعدې په توګه، د میتود په کارونو کې دا غوره ده چې کارول (لږترلږه)NS_LOG_FUNCTION (this)... کارول NS_LOG_FUNCTION_NOARGS ()
یوازې په جامد کارونو کې. په هرصورت، په یاد ولرئ چې د ns-3 سیسټم د هر ډول ننوتلو فعالیت ملاتړ کولو ته اړتیا نلري. د څومره معلوماتو ثبتولو په اړه پریکړه د انفرادي ماډل پراختیا کونکي ته پاتې کیږي. د ایکو غوښتنلیکونو په حالت کې ، د لوګینګ محصول لوی مقدار شتون لري.

تاسو اوس کولی شئ د فنکشن تلیفونونو لاګ وګورئ چې د غوښتنلیک لخوا رامینځته شوي. که تاسو نږدې وګورئ، تاسو به د کرښې تر مینځ یو کولن وګورئ UdpEchoClientApplication او د میتود نوم، چیرې چې تاسو تمه لرئ د C++ سکوپ آپریټر وګورئ (: :). دا قصدي ده.

دا په حقیقت کې د ټولګي نوم نه دی، مګر د ننوتلو برخې نوم دی. کله چې د سرچینې فایل او ټولګي ترمینځ لوبه وي، دا معمولا د ټولګي نوم وي، مګر تاسو باید پوه شئ چې دا په حقیقت کې د ټولګي نوم نه دی، او د ډبل کولون پر ځای یو واحد کولن شتون لري. دا یوه لاره ده چې تاسو سره په مفکوره توګه د ټولګي نوم څخه په نسبتا فرعي ډول جلا کولو کې مرسته کوي.

په هرصورت، په ځینو حاالتو کې دا ستونزمنه وي چې معلومه کړي چې کوم طریقه واقعا د لاګ پیغام تولیدوي. که تاسو پورته متن ته وګورئ، تاسو شاید حیران یاست چې کرښه چیرته ده "Received 1024 bytes from 10.1.1.2" تاسو کولی شئ دا ستونزه د کچې په ترتیبولو سره حل کړئ prefix_func د NS_LOG چاپیریال متغیر ته. لاندې هڅه وکړئ:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

په یاد ولرئ چې د نرخ نښه اړینه ده ځکه چې عمودی بار چې موږ یې د OR عملیاتو نمایندګي لپاره کاروو هم د یونیکس پایپ نښلونکی دی. اوس که تاسو سکریپټ پرمخ وړئ، تاسو به وګورئ چې د ننوتلو سیسټم ډاډ ترلاسه کوي چې په ورکړل شوي لاګ کې هر پیغام د برخې نوم سره مخکینۍ دی.

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()

اوس تاسو لیدلی شئ چې ټول هغه پیغامونه چې د UDP اکو مراجع غوښتنلیک څخه راځي د ورته په توګه پیژندل شوي. پیغام "Received 1024 bytes from 10.1.1.2"اوس په واضح ډول پیژندل شوی چې د اکو پیرودونکي غوښتنلیک څخه راځي. پاتې پیغام باید د UDP اکو سرور غوښتنلیک څخه راشي. موږ کولی شو دا برخه د NS_LOG چاپیریال متغیر کې د کولون څخه جلا شوي اجزاو لیست دننه کولو سره فعال کړو.

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

خبرداری: د پورته مثال په متن کې، تاسو اړتیا لرئ چې د کولون (:) څخه وروسته د نوي کرېک کرکټر لرې کړئ، دا د سند فارمیټ کولو لپاره کارول کیږي. اوس که تاسو سکریپټ پرمخ وړئ، نو تاسو به د مراجعینو او سرور اکو غوښتنلیکونو څخه ټول لاګ پیغامونه وګورئ. تاسو لیدلی شئ چې دا د ډیبګ کولو پرمهال خورا ګټور کیدی شي.

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()

دا هم کله ناکله ګټور وي چې د سمولیشن وخت وګورئ په کوم کې چې د لاګ پیغام رامینځته شوی و. تاسو کولی شئ دا د OR bit اضافه کولو سره ترسره کړئ prefix_time:

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

یوځل بیا ، تاسو باید پورتني نوي کریکټر لرې کړئ. که تاسو اوس سکریپټ چلوئ نو تاسو باید لاندې محصول وګورئ:

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()

مهرباني وکړئ په یاد ولرئ چې جوړونکی د دې لپاره UdpEchoServer د سمولیشن 0 ثانیو په جریان کې ویل شوی و. دا واقعا مخکې له دې چې سمول پیل شي پیښیږي، مګر وخت د صفر ثانیو په توګه ښودل شوی. ورته د جوړونکي پیغام لپاره ریښتیا ده 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()

په یاد ولرئ چې سکریپټ scratch/first.cc د سمولیشن له پیل څخه یوه ثانیه دمخه د اکو سرور غوښتنلیک پیل کړ. اوس تاسو کولی شئ دا طریقه وګورئ د غوښتنلیک پیل کول سرور په حقیقت کې په لومړۍ ثانیه کې ویل کیږي. تاسو ممکن دا هم وګورئ چې د اکو مراجع د سمولیشن په دویمه ثانیه کې پیل کیږي، لکه څنګه چې موږ په سکریپټ کې وپوښتل.

تاسو اوس کولی شئ په تلیفون کې د سمولو پرمختګ تعقیب کړئ د لیږد مهال ویش په هغه پیرودونکي کې چې د هینډل ریډ کال بیک ته زنګ وهي د اکو سرور غوښتنلیک کې لیږل کیږي. په یاد ولرئ چې د پوائنټ څخه تر پوائنټ لینک باندې د پیکټ لیږلو لپاره تیر شوی وخت 3,69 ملی ثانیه دی. تاسو لیدلی شئ چې د اکو سرور یو پیغام لاګ کوي چې دا پاکټ ته ځواب ورکړی ، او بیا ، د چینل ځنډ وروسته ، تاسو ګورئ چې د اکو پیرودونکي په خپل هینډل ریډ میتود کې د اکو پاکټ ترلاسه کوي.

پدې سمولیشن کې ، ډیر څه پیښیږي پرته لدې چې تاسو پام وکړئ. مګر تاسو کولی شئ په سیسټم کې د ټولو ننوتلو اجزاو په فعالولو سره ټوله پروسه په اسانۍ سره تعقیب کړئ. هڅه وکړئ د NS_LOG متغیر لاندې ارزښت ته تنظیم کړئ،

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

پورته ستوری د ننوتلو برخې لپاره د وائلډ کارډ کرکټر دی. پدې کې به په سمولیشن کې کارول شوي ټولو برخو کې ټولې ننوتنې شاملې وي. زه به دلته محصول بیا تولید نکړم (د لیکلو په وخت کې دا د یو واحد اکو پیکټ لپاره 1265 لینونه محصول تولیدوي) ، مګر تاسو کولی شئ دا معلومات فایل ته واستوئ او په خپل غوره مدیر کې یې وګورئ.

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

زه په شخصي توګه د ننوتلو دا خورا لفظي نسخه کاروم کله چې زه ستونزه لرم او نه پوهیږم چیرې شیان غلط شوي. زه کولی شم د کوډ اجرا کول په اسانۍ سره تعقیب کړم پرته لدې چې د وقفې نقطې تنظیم کړم او په ډیبګر کې د کوډ له لارې ګام پورته کړم. زه کولی شم یوازې په خپل غوره ایډیټر کې محصول ایډیټ کړم او هغه څه وګورم چې زه یې تمه لرم او داسې څه وګورم چې ما تمه نه درلوده. یوځل چې زه د څه غلط کیدو په اړه عمومي نظر ترلاسه کړم ، زه ډیبګر ته کود شم ترڅو ستونزې ته ورسیږم. دا ډول محصول په ځانګړي ډول ګټور کیدی شي کله چې ستاسو سکریپټ یو څه په بشپړ ډول غیر متوقع وي. که تاسو یوازې ډیبګر وکاروئ ، تاسو ممکن په بشپړ ډول یو موړ له لاسه ورکړئ. ثبت کول دا ډول بدلونونه د پام وړ کوي.

5.1.3 ستاسو کوډ ته د ننوتلو اضافه کول

تاسو کولی شئ د ډیری میکرو څخه د لاګ برخې ته د زنګ وهلو له لارې خپلو سمولونو ته نوي ننوتل اضافه کړئ. راځئ چې دا په سکریپټ کې وکړو myfirst.cc، کوم چې موږ په "پاک" لارښود کې لرو. په یاد ولرئ چې موږ پدې سناریو کې د ننوتلو برخه تعریف کړې:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

تاسو خبر یاست چې تاسو په مختلفو کچو کې د NS_LOG چاپیریال متغیر په ترتیب کولو سره د دې برخې څخه د ټولو پیغامونو ننوتل فعالولی شئ. راځئ چې مخکې لاړ شو او سکریپټ ته ځینې ننوتل اضافه کړو. هغه میکرو چې په لاګ کې د معلوماتو کچې پیغامونو اضافه کولو لپاره کارول کیږي NS_LOG_INFO دی. راځئ یو پیغام اضافه کړو (یوازې مخکې لدې چې موږ د نوډونو رامینځته کول پیل کړو) چې تاسو ته ووایی چې سکریپټ د "توپولوژي رامینځته کولو" مرحله کې دی. دا په لاندې کوډ ټوټه کې ترسره کیږي،
پرانيستل scratch/myfirst.cc ستاسو د خوښې مدیر کې او کرښه اضافه کړئ،
NS_LOG_INFO ("Creating Topology");
د کرښې څخه مخکې،

NodeContainer nodes;
nodes.Create (2);

اوس سکریپټ په کارولو سره تالیف کړئ واف، او د NS_LOG متغیر پاک کړئ د ننوتلو جریان غیر فعال کړئ چې موږ دمخه فعال کړی و:

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

تاسو به نوی پیغام ونه ګورئ ځکه چې د ننوتلو اړوند برخه (FirstScriptExample) فعال شوی نه دی. د خپل پیغام لیدو لپاره تاسو اړتیا لرئ د ننوتلو برخې فعال کړئ لومړی سکریپټ بېلګه د یوې کچې سره چې د NS_LOG_INFO څخه ټیټ نه وي. که تاسو یوازې د دې ځانګړي ننوتلو کچه لیدل غواړئ، تاسو کولی شئ دا د دې په څیر فعال کړئ،

$ export NS_LOG=FirstScriptExample=info

که تاسو اوس سکریپټ پرمخ وړئ، نو تاسو به یو نوی پیغام وګورئ "د ټوپولوژي رامینځته کول"،

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 د کمانډ لاین دلیلونو کارول

5.2.1 د ډیفالټ خاصیت ارزښتونو څخه پورته کول

د ترمیم یا جوړولو پرته د ns-3 سکریپټونو چلند بدلولو بله لاره د کمانډ لاین دلیلونو کارول دي. موږ د کمانډ لاین دلیلونو تحلیل کولو لپاره میکانیزم چمتو کوو او په اتوماتيک ډول د پایلو پراساس سیمه ایز او نړیوال تغیرات تنظیم کوو.

د کمانډ لاین دلیل سیسټم کارولو لومړی ګام د کمانډ لاین پارسر اعلان کول دي. دا کار کول خورا اسانه دي (ستاسو په اصلي برنامه کې) ، لکه په لاندې کوډ کې ،

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

دا ساده دوه کرښه ټوټه په حقیقت کې په خپل حق کې خورا ګټوره ده. دا د ns-3 نړیوال متغیر او خاصیت سیسټم ته دروازه پرانیزي. راځئ چې د اصلي سکریپټ فعالیت پیل ته د کوډ دوه کرښې اضافه کړو scratch/myfirst.cc. په حرکت کې، موږ سکریپټ تالیف کوو او چلوو، کله چې چلیږي موږ د مرستې غوښتنه په لاندې ډول کوو،

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

دا امر به پوښتنه وکړي Waf سکریپټ چلول سکریچ/زما لومړی او دا د کمانډ لاین دلیل انتقال کړئ - د چاپ مرسته. د حوالې نښې اړین دي ترڅو وښیې چې دلیل د کوم برنامه لپاره دی. د کمانډ لاین پارسر به دلیل کشف کړي - د چاپ مرسته او ځواب به ښکاره کړي،

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.

اوس راځئ چې اختیار وګورو - د چاپ ځانګړتیاوې. موږ دمخه د ns-3 خاصیت سیسټم یادونه کړې کله چې د لومړي.cc سکریپټ مطالعه کوو. موږ د کوډ لاندې کرښې لیدلي دي،

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

او دوی ورته وویل د ډاټا نرخ په حقیقت کې یو صفت دی PointToPointNetDevice. راځئ چې د صفاتو لیدلو لپاره د کمانډ لاین دلیل پارسر وکاروو PointToPointNetDevice. د مرستې لیست هغه څه وايي چې موږ یې باید چمتو کړو TypeId. دا د هغه ټولګي نوم دی چې د ګټو ځانګړتیاوې ورسره تړاو لري. زموږ په قضیه کې به دا وي ns3::PointToPointNetDevice. راځئ چې پرمخ ولاړ شو، ننوځو،

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

سیسټم به د دې شبکې وسیلې ډول ټولې ځانګړتیاوې چاپ کړي. تاسو به وګورئ چې په لیست کې د ځانګړتیاوو په منځ کې دي،

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

دا ډیفالټ ارزښت دی چې د سیسټم لخوا به د اعتراض رامینځته کولو پرمهال وکارول شي PointToPointNetDevice. موږ به د پیرامیټر په کارولو سره دا ډیفالټ ارزښت له پامه غورځوو صفات в PointToPointHelper لوړ راځئ چې د ټکي ټکي وسیلو او چینلونو لپاره ډیفالټ ارزښتونه وکاروو. د دې کولو لپاره، موږ به تلیفونونه حذف کړو SetDeviceAttribute и SetChannelAttribute د myfirst.cc، کوم چې موږ په پاک لارښود کې لرو.

ستاسو سکریپټ باید اوس په ساده ډول اعلان کړي PointToPointHelper او د نصب کولو هیڅ عملیات مه کوئ لکه څنګه چې په لاندې مثال کې ښودل شوي،

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

مخکې لاړ شئ او یو نوی سکریپټ جوړ کړئ Waf (./waff) او راځئ چې بیرته لاړ شو او د UDP ایکو سرور غوښتنلیک څخه ځینې ننوتل شامل کړئ او د وخت مخکینۍ شامل کړئ.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

که تاسو سکریپټ چلوئ نو تاسو باید لاندې محصول وګورئ:

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()

په یاد ولرئ چې وروستی ځل چې موږ د سمولو وخت ته ګورو، هغه شیبه چې پیکټ د اکو سرور لخوا ترلاسه شوی و، دا 2,00369 ثانیې وې.

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

اوس هغه په ​​2.25732 ثانیو کې کڅوړه ترلاسه کوي. دا ځکه چې موږ په ساده ډول د PointToPointNetDevice ډیټا نرخ له پنځه میګابایټ فی ثانیې څخه ډیفالټ ارزښت ته بیا تنظیم کوو ، کوم چې په ثانیه کې 32768 بټونه دي. که موږ د کمانډ لاین په کارولو سره نوی ډیټا ریټ بدل کړو ، نو موږ کولی شو خپل سمول بیا ګړندی کړو. موږ به دا په لاندې ډول ترسره کړو، د مرستې عنصر لخوا تطبیق شوي فورمول سره سم:

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

دا به د DataRate خاصیت په هره ثانیه کې پنځه میګابایټ خپل اصلي ارزښت ته راستانه کړي. ایا تاسو د پایلې څخه حیران یاست؟ دا معلومه شوه چې د سکریپټ اصلي چلند بیرته راګرځولو لپاره، موږ باید د چینل ځنډ هم تنظیم کړو ترڅو د رڼا سرعت سره سمون ومومي. موږ کولی شو د کمانډ لاین سیسټم څخه وغواړو چې د چینل ځانګړتیاوې چاپ کړي، لکه څنګه چې موږ د شبکې وسیلې لپاره وکړل:

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

موږ به ومومئ چې د چینل ځنډ ځانګړتیا په لاندې ډول ټاکل شوې ده:

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

بیا موږ کولی شو د کمانډ لاین سیسټم له لارې دا دواړه ډیفالټ ارزښتونه تنظیم کړو.

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

پدې حالت کې موږ هغه وخت بیرته راګرځوو کله چې موږ په سکریپټ کې په ښکاره ډول د ډیټا ریټ او ځنډ تنظیم کړو:

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()

په یاد ولرئ چې بسته د سرور لخوا بیا د 2,00369 ثانیو وروسته ترلاسه کیږي. موږ واقعیا کولی شو په سکریپټ کې کارول شوي هر ډول ځانګړتیاوې پدې ډول تنظیم کړو. په ځانګړې توګه، موږ کولی شو د MaxPackets ځانګړتیاوې غیر یو ارزښتونو ته وټاکو UdpEchoClient.

څنګه به یې وکاروئ؟ دا یوه هڅه وکړئ. په یاد ولرئ چې تاسو باید د هغه ځای په اړه تبصره وکړئ چیرې چې موږ د ډیفالټ خاصیت ارزښت او په څرګند ډول تنظیم کوو MaxPackets په سکریپټ کې. بیا تاسو باید سکریپټ بیا جوړ کړئ. تاسو کولی شئ د نوي ډیفالټ خاصیت ارزښت تنظیم کولو لپاره د ترکیب مرستې ترلاسه کولو لپاره د کمانډ لاین هم وکاروئ. یوځل چې تاسو پدې پوه شئ ، تاسو کولی شئ د کمانډ لاین کې ښودل شوي کڅوړو شمیر کنټرول کړئ. څرنګه چې موږ زده کونکي یو، زموږ د کمانډ لاین باید داسې ښکاري:

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

طبیعي پوښتنه چې پدې وخت کې راپورته کیږي دا ده چې څنګه د دې ټولو صفاتو په شتون پوه شو؟ بیا بیا، د کمانډ لاین سیسټم د دې مسلې لپاره د مرستې فعالیت لري. که موږ د کمانډ لاین څخه د مرستې غوښتنه وکړو، موږ باید وګورو:

$ ./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.

که تاسو د "پرنټ ګروپونه" دلیل وټاکئ نو تاسو باید د ټولو ثبت شویو ډلو لیست وګورئ TypeId. د ګروپ نومونه د سرچینې ډایرکټر کې د ماډلونو له نومونو سره مطابقت لري (که څه هم لوی شوي). په یوځل کې د ټولو معلوماتو چاپ کول به خورا لوی وي، نو د ګروپ لخوا د معلوماتو چاپولو لپاره اضافي فلټر شتون لري. نو، یوځل بیا د نقطې څخه تر نقطې ماډل باندې تمرکز کول:

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

دلته تاسو کولی شئ د خاصیت لټون لپاره د TypeId نومونه ومومئ، د بیلګې په توګه
--PrintAttributes = ns3 :: PointToPointChannelلکه څنګه چې پورته ښودل شوي.

د ځانګړتیاوو په اړه د زده کړې بله لاره د Doxygen ns‑3 له لارې ده. یو پاڼه شتون لري چې په سمیلیټر کې ثبت شوي ټول صفات لیست کوي.

5.2.2 ستاسو د حکمونو نیول

تاسو کولی شئ د کمانډ لاین سیسټم له لارې خپل هکونه هم اضافه کړئ. دا په ساده ډول د کمانډ لاین پارسر میتود په کارولو سره ترسره کیږي AddValue.
راځئ چې دا خصوصیت وکاروو ترڅو د کڅوړو شمیر مشخص کړئ چې په بشپړ ډول مختلف ډول ښودل کیږي. راځئ چې یو محلي متغیر اضافه کړو چې نوم یې دی nپاکټونه په فنکشن کې اصلي. موږ به دا یو ته وټاکو ترڅو زموږ پخوانی ډیفالټ چلند سره سمون ومومي. د دې لپاره چې د کمانډ لاین پارسر ته اجازه ورکړي چې دا ارزښت بدل کړي، موږ باید دا ارزښت په پارسر کې ونیسئ. موږ دا د تلیفون اضافه کولو سره کوو AddValue. لاړ شئ او سکریپټ بدل کړئ scratch/myfirst.cc نو د لاندې کوډ سره پیل کولو لپاره،

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);
...

په سکریپټ کې هغه نقطې ته ښکته کړئ چیرې چې موږ د MaxPackets خاصیت تنظیم کړو او دا یې بدل کړو ترڅو دا د ثابت 1 پرځای د nPackets متغیر ته تنظیم شي، لکه څنګه چې لاندې ښودل شوي.

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

اوس که تاسو سکریپټ چل کړئ او د -PrintHelp دلیل وړاندې کړئ، تاسو باید د نوي کاروونکي دلیل وګورئ. د مرستې په نندارتون کې لیست شوی. داخل کړئ

$ ./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

که تاسو غواړئ د لیږد شوي پاکټونو شمیر بدل کړئ، تاسو کولی شئ دا د کمانډ لاین دلیل - -nPackets تنظیم کولو سره ترسره کړئ.

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

اوس تاسو باید اوس وګورئ

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()

تاسو اوس دوه کڅوړې لیږلي دي. ډیر ساده، دا نه ده؟
تاسو کولی شئ وګورئ چې د ns-3 کارونکي په توګه، تاسو کولی شئ د کمانډ لاین دلیل سیسټم وکاروئ ترڅو نړیوال ارزښتونه او ځانګړتیاوې سمبال کړي. که تاسو د ماډل لیکوال یاست، تاسو کولی شئ خپلو شیانو ته نوي ځانګړتیاوې اضافه کړئ او دوی به په اتوماتيک ډول ستاسو د کاروونکو لخوا د کمانډ لاین سیسټم له لارې د ترتیب لپاره شتون ولري. که تاسو د سکریپټ لیکوال یاست ، تاسو کولی شئ په خپلو سکریپټونو کې نوي متغیرونه اضافه کړئ او په بې ساري ډول یې ستاسو د کمانډ لاین سیسټم کې ولګوئ.

5.3 د تعقیب سیسټم کارول

د ماډلینګ ټوله نقطه د نورو مطالعې لپاره محصول تولید کول دي، او د دې لپاره اصلي میکانیزم د ns-3 ټریس سیسټم دی. څرنګه چې ns-3 د C++ برنامه ده، د C++ پروګرام څخه د تولید تولید معیاري وسیله کارول کیدی شي:

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

تاسو حتی کولی شئ د ننوتلو ماډل وکاروئ ترڅو ستاسو حل ته لږ جوړښت اضافه کړئ. د دې تګلارې له امله ډیری پیژندل شوي ستونزې شتون لري، او له همدې امله موږ د دې ستونزو حل کولو لپاره د عمومي پیښې تعقیب کولو فرعي سیسټم چمتو کړی دی.

د ns-3 تعقیب سیسټم اصلي اهداف په لاندې ډول دي:

  • د بنسټیزو کارونو لپاره، د تعقیب سیسټم باید کاروونکي ته اجازه ورکړي چې د مشهور سرچینو لپاره معیاري ټریس تولید کړي او هغه شیان غوره کړي چې ټریس تولیدوي؛

  • منځمهاله کارونکي باید د دې وړتیا ولري چې د تولید شوي محصول فارمیټ بدلولو یا د سمیلیټر کور بدلولو پرته د ټریس سرچینې دننه کولو لپاره د تعقیب سیسټم وغزوي؛

  • پرمختللي کارونکي کولی شي د سمیلیټر کور بدل کړي ترڅو نوي ټریس سرچینې او ډوبونه اضافه کړي. د ns-3 تعقیب سیسټم د خپلواک تعقیب سرچینو او ریسیورونو اصولو باندې رامینځته شوی ، په بیله بیا د مصرف کونکو سره د سرچینو وصل کولو لپاره یو متحد میکانیزم.

د ns-3 تعقیب سیسټم د خپلواک تعقیب سرچینو او ریسیورونو اصولو باندې رامینځته شوی ، په بیله بیا د ترلاسه کونکو سره د سرچینو وصل کولو لپاره یو متحد میکانیزم. د ټریس سرچینې هغه شیان دي چې کولی شي په سمولیشن کې پیښې سیګنال کړي او د ګټو اصلي معلوماتو ته لاسرسی چمتو کړي. د مثال په توګه ، د ټریس سرچینه کولی شي په ګوته کړي کله چې د شبکې وسیله یو پاکټ ترلاسه کړي او د پاکټ مینځپانګه د لیوالتیا ټریس اخیستونکو ته چمتو کړي.

پخپله د ټریس سرچینې بې ګټې دي پرته لدې چې دوی د کوډ نورو برخو سره "یوځل" شوي وي چې واقعیا د سنک لخوا چمتو شوي معلوماتو سره یو څه ګټور کار کوي. ټریسر د پیښو او معلوماتو مصرف کونکي دي چې د ټریس سرچینو لخوا چمتو شوي. د مثال په توګه، تاسو کولی شئ یو ټریس سنک جوړ کړئ چې (کله چې د تیرې بیلګې د ټریس سرچینې سره وصل وي) په ترلاسه شوي کڅوړه کې د ګټو برخې چاپ کړي.

د دې څرګند جلا کولو دلیل دا دی چې کاروونکو ته اجازه ورکړي چې د سیمیولیټر کور ترمیم او بیا تنظیم کولو پرته د موجوده ټریس سرچینو سره نوي سنک ډولونه وصل کړي. نو په پورته مثال کې، کاروونکي کولی شي په خپل سکریپټ کې نوی ټرسر تعریف کړي او دا د موجوده ټریس سرچینې سره وصل کړي چې یوازې د کارن سکریپټ ایډیټ کولو سره سمولیشن کور کې تعریف شوي.

په دې ټیوټوریل کې، موږ به د ځینو پخوانیو تعریف شویو سرچینو او ډوبونو څخه کار واخلو او وښیو چې دوی څنګه د کارونکي په برخه کې د لږې هڅې سره تنظیم کیدی شي. د پرمختللی ټریس ترتیب په اړه د معلوماتو لپاره د ns-3 لارښود یا څرنګوالی برخې وګورئ، په شمول د ټریس نوم ځای پراخول او د نوي ټریس سرچینې رامینځته کول.

5.3.1 ASCII تعقیب

ns-3 مرستندویه فعالیت چمتو کوي کوم چې د ټیټې کچې تعقیب سیسټم چمتو کوي ترڅو تاسو سره د توضیحاتو سره مرسته وکړي کله چې د ساده کڅوړې نښې تنظیم کړئ. که تاسو دا فیچر فعال کړئ، تاسو به د ASCII فایلونو کې محصول وګورئ. د هغو کسانو لپاره چې د ns-2 محصول سره آشنا دي، دا ډول ټریس ورته ورته دی out.tr، کوم چې د ډیری سکریپټونو لخوا رامینځته شوی.

راځئ چې سوداګرۍ ته راځو او زموږ په سکریچ/myfirst.cc سکریپټ کې د ASCII ځینې تعقیب پایلې اضافه کړو. د زنګ نه مخکې Simulator :: Run ()د کوډ لاندې کرښې اضافه کړئ:
AsciiTraceHelper ascii;

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

د ډیری نورو ns-3 محاورو په څیر، دا کوډ د ASCII نښې رامینځته کولو لپاره یو مرستندویه څیز کاروي. په دویمه کرښه کې دوه د ځړول شوي میتود زنګونه شامل دي. د "اندرون" طریقه د فایل سټریم جوړ کړئ() په سټیک کې د فایل جریان څیز رامینځته کولو لپاره د نامعلوم څیز محاوره کاروي (پرته د څیز نوم) او په نوم شوي میتود ته یې لیږدوي. موږ به په راتلونکي کې دې ته ژور ځو ، مګر ټول هغه څه چې تاسو ورته اړتیا لرئ پدې مرحله کې پوهیدل دا دي چې تاسو یو داسې شی رامینځته کوئ چې د فایل استازیتوب کوي myfirst.tr او ns-3 ته یې انتقال کړئ. موږ ns-3 ته دنده سپارلې چې د خپل ټول عمر لپاره د رامینځته شوي توکي ساتنه وکړي ، په کوم کې چې دا د C++ سټریم اعتراض کاپي جوړونکو سره تړلي د لږ پیژندل شوي (قصدي) محدودیت له امله رامینځته شوي ستونزې حل کوي.

بهرنی زنګ فعالAsciiAll() معاون ته ووایی چې تاسو غواړئ په خپل سمولیشن کې د ASCII تعقیب شامل کړئ د ټولو پوائنټ-ټو-پوائنټ وسیلو اتصالاتو لپاره او دا چې تاسو غواړئ (ټاکل شوي) ټریس ریسیورونه د ASCII ب formatه کې د پیکټ حرکت معلومات ثبت کړئ.

د هغو کسانو لپاره چې د ns-2 سره اشنا دي، تعقیب شوي پیښې د پیژندل شوي ټریس پوینټونو سره مساوي دي چې پیښې "+"، "-"، "d" او "r" ثبتوي.
اوس تاسو کولی شئ سکریپټ جوړ کړئ او د کمانډ لاین څخه یې پرمخ وړئ:

$ ./waf --run scratch/myfirst

د پخوا په څیر، تاسو به د Waf څخه ډیری پیغامونه وګورئ، او بیا د چلولو پروګرام څخه د ځینو پیغامونو سره "جوړول" په بریالیتوب سره پای ته ورسید.

کله چې روان وي، برنامه به د نوم فایل رامینځته کړي myfirst.tr. د کار د طبیعت له امله Waf، د ډیفالټ په واسطه فایل په محلي لارښود کې نه رامینځته کیږي ، مګر د ذخیره کولو لوړ پوړ لارښود کې. که تاسو غواړئ هغه لاره بدله کړئ چیرې چې نښې خوندي شوي ، نو تاسو کولی شئ د دې مشخص کولو لپاره د Waf پیرامیټر وکاروئ --cwd. موږ دا نه دي کړي، نو ستاسو د خوښې مدیر کې د ASCII ټریس فایل myfirst.tr وګورئ، موږ به اړتیا ولرو چې زموږ د ذخیره کولو لوړ پوړ لارښود ته لاړ شو.

د ASCII نښې تجزیه کول

دلته په کافي اندازه خورا ډیر معلومات شتون لري ، مګر لومړی شی چې تاسو ورته اړتیا لرئ هغه دا دی چې فایل د انفرادي لینونو څخه جوړ دی. دا به په ښکاره ډول ښکاره شي که تاسو د لید کړکۍ پراخه کړئ.

په فایل کې هره کرښه د ټریس پیښې سره مطابقت لري. په دې حالت کې، موږ د لیږد په قطار کې پیښې په سمولیشن کې د هرې نقطې څخه تر نقطې شبکې وسیله کې شتون لرو. د لیږد کتار هغه کتار دی چې له لارې یې هر کڅوړه باید د یوې نقطې څخه نقطې لینک لپاره تیریږي. په یاد ولرئ چې په ټریس فایل کې هره کرښه د یو واحد کرکټر سره پیل کیږي (او وروسته ځای لري). دا سمبول به لاندې معنی ولري:

+: د وسیلې په کتار کې د قطار کولو عملیات پیښ شوي؛
-: د وسیلې په کتار کې د عنصر ترلاسه کولو عملیات ترسره شوي؛
d: کڅوړه غورځول شوې وه، معمولا ځکه چې کتار ډک و؛
r: کڅوړه د شبکې وسیله لخوا ترلاسه شوې.

راځئ چې په ټریس فایل کې لومړۍ کرښې ته نږدې وګورو. زه به دا په برخو وویشم (د وضاحت لپاره د نښې سره) او په ښي خوا کې د کرښې شمیره:

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)

د دې پراخ شوي ټریس پیښې لومړۍ برخه (لین 0) عملیات دي. موږ دلته د + سمبول لرو، کوم چې د لیږد لپاره د قطار کولو عملیاتو سره مطابقت لري. دویمه برخه (لین 1) د سمولو وخت دی، په ثانیو کې څرګند شوی. تاسو شاید په یاد ولرئ چې موږ څه وپوښتل UdpEchoClientApplication په دوه ثانیو کې د کڅوړو لیږل پیل کړئ. دلته موږ تایید ګورو چې دا واقعیا پیښیږي.

د مثال ټریس بله برخه (له 2 کرښې څخه) ښیي چې کومې ټریس سرچینې دا پیښه رامینځته کړې (د نوم ځای ټریس په ګوته کوي). تاسو کولی شئ د ټریس نوم ځای په اړه فکر وکړئ لکه څنګه چې تاسو د فایل سیسټم نوم ځای لرئ. د نوم ځای ریښه ده نوډ لیست. دا د کانټینر سره مطابقت لري چې په اصلي ns-3 کوډ کې اداره کیږي. دا ټول نوډونه لري چې په سکریپټ کې رامینځته شوي. لکه څنګه چې د فایل سیسټم کولی شي په ریښه کې لارښودونه ولري، نوډ لیست موږ کولی شو ډیری نوډونه ولرو. نو کرښه /NodeList/0 په NodeList کې null node ته اشاره کوي، کوم چې موږ معمولا د "node 0" په توګه فکر کوو. هر نوډ د وسیلو لیست لري چې نصب شوي. دا لیست په بل ځای کې موقعیت لري. تاسو کولی شئ وګورئ چې دا ټریس پیښه له کوم ځای څخه راځي د وسایلو لیست/0، کوم چې په نوډ کې نصب شوی نالی وسیله ده.

راتلونکی سبسټرینګ، $ ns3 :: PointToPointNetDevice، وايي چې کوم وسیله په صفر کې ده: د نوډ صفر وسیله لیست. په یاد ولرئ چې + عملیات په 0 کرښه کې موندل شوي پدې معنی چې یو عنصر د وسیلې لیږد کتار کې اضافه شوی. دا د "ټریک لار" په وروستیو برخو کې منعکس کیږي: TxQueue/Enqueue.

په ټریس کې پاتې برخې باید په سمه توګه رواني وي. لینونه 3-4 په ګوته کوي چې کڅوړه په نقطه نقطه پروتوکول کې پوښل شوې. لاین 5-7 ښیې چې پیکټ د IP4 نسخه سرلیک لري او په IP پته کې رامینځته شوی 10.1.1.1 او د دې لپاره دی 10.1.1.2. لاین 8-9 ښیې چې دا کڅوړه د UDP سرلیک لري او په پای کې 10 لاین ښیې چې د تادیې بار تمه شوي 1024 بایټ دی.

په ټریس فایل کې بله کرښه ښیې چې ورته کڅوړه په ورته نوډ کې د لیږد کتار څخه ایستل شوې وه.

په ټریس فایل کې دریمه کرښه ښیې چې پاکټ د اکو سرور کوربه کې د شبکې وسیلې لخوا ترلاسه شوی. ما لاندې پیښه بیا تولید کړې.

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)

په یاد ولرئ چې د ټریس عملیات اوس r دی او د سمولو وخت 2,25732 ثانیو ته لوړ شوی. که تاسو ټیوټوریل په دقت سره تعقیب کړئ ، نو دا پدې معنی ده چې تاسو د شبکې وسیلو ډیټا ریټ او د لینک ځنډ د دوی په ډیفالټ ارزښتونو کې پریښود. دا زمانه باید آشنا وي، لکه څنګه چې تاسو په تیرو برخه کې ولیدل.

د ټریس سرچینې نوم ځای ننوتل (لین 2) د دې منعکس کولو لپاره تعدیل شوی چې دا پیښه د نوډ 1 څخه سرچینه اخلي (/نوډ لیست/1) او کڅوړه د ټریس سرچینې لخوا ترلاسه کیږي (/MacRx). دا باید ستاسو لپاره خورا اسانه وي چې په فایل کې پاتې نښو ته په کتلو سره د ټوپولوژي له لارې د کڅوړې حرکت تعقیب کړئ.

5.3.2 د PCAP ټریس

د ns-3 وسیلې مرسته کونکي هم په .pcap فارمیټ کې د ټریس فایلونو جوړولو لپاره کارول کیدی شي. مخفف pcap (معمولا په کوچنیو حروفو لیکل کیږي) د بسته بندۍ لپاره ولاړ دی او په حقیقت کې یو API دی چې پکې د .pcap فایل فارمیټ تعریف کول شامل دي. ترټولو مشهور برنامه چې کولی شي دا بڼه ولولي او ښکاره کړي ویرشکر (مخکې ویل کیده ایتالال). په هرصورت، ډیری ټرافيکي ټریس شنونکي شتون لري چې د دې کڅوړې بڼه کاروي. موږ کاروونکي هڅوو چې د pcap نښې تحلیل کولو لپاره موجود ډیری وسیلې وکاروئ. پدې ټیوټوریل کې به موږ د pcap په کارولو تمرکز وکړو tcpdump.

د pcap تعقیب فعالول د کوډ یوې کرښې سره ترسره کیږي.

pointToPoint.EnablePcapAll ("myfirst");

د کوډ دا کرښه د ASCII ټریس کوډ وروسته پیسټ کړئ چې موږ یې په دې کې اضافه کړل scratch/myfirst.cc. په یاد ولرئ چې موږ یوازې "myfirst" تار تېر کړی، نه "myfirst.pcap" یا ورته بل څه. دا ځکه چې پیرامیټر یو مخکینی دی، نه بشپړ فایل نوم. د سمولو په جریان کې، معاون به په حقیقت کې د هرې نقطې څخه تر نقطې وسیلې لپاره د ټریس فایل رامینځته کړي. د دوتنې نومونه به د مخکینۍ، نوډ شمیره، د وسیلې شمیره، او ضمیمه په کارولو سره جوړ شي ".pcap".

زموږ د مثال سکریپټ لپاره، موږ به پای ته د "نوم" په نوم فایلونه وګوروmyfirst-0-0.pcap"او"myfirst-1-0.pcap"، کوم چې په ترتیب سره د نوډ 0-وسیلې 0 او نوډ 1-آلې 0 لپاره د pcap نښې دي. یوځل چې تاسو د pcap تعقیب فعالولو لپاره د کوډ لاین اضافه کړئ ، تاسو کولی شئ سکریپټ په معمول ډول پرمخ وړئ:

$ ./waf --run scratch/myfirst

که تاسو د خپل توزیع لوړ پوړ لارښود کې وګورئ، تاسو باید درې فایلونه وګورئ: د ASCII ټریس فایل myfirst.tr، کوم چې موږ دمخه مطالعه کړې ، فایلونه myfirst-0-0.pcap и myfirst-1-0.pcap - نوي pcap فایلونه چې موږ یې رامینځته کړي.

د tcpdump سره د لوستلو محصول

د اوس لپاره ، د pcap فایلونو لیدو ترټولو اسانه لار د tcpdump کارول دي.

$ 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

په ډنډ کې myfirst-0-0.pcap (د پیرودونکي وسیله) تاسو کولی شئ وګورئ د اکو پیکټ د 2 ثانیو سمولو وروسته لیږل کیږي. که تاسو دوهم ډنډ ته وګورئ (myfirst-1-0.pcap)، تاسو به وګورئ چې کڅوړه په 2,257324 ثانیو کې ترلاسه کیږي. تاسو به په دوهم ډمپ کې وګورئ چې پاکټ په 2.257324 ثانیو کې بیرته راستانه شوی، او په پای کې دا چې پیکټ په لومړي ډمپ کې په 2.514648 ثانیو کې د پیرودونکي لخوا بیرته ترلاسه شوی.

د Wireshark سره د محصول لوستل

که تاسو سره اشنا نه یاست ویرشکردلته یو ویب پاڼه شتون لري چې تاسو کولی شئ پروګرامونه او اسناد ډاونلوډ کړئ: http://www.wireshark.org/. ویرشکر یو GUI دی چې د دې ټریس فایلونو ښودلو لپاره کارول کیدی شي. که تاسو Wireshark لرئ، تاسو کولی شئ د ټریس فایلونو څخه هر یو خلاص کړئ او مینځپانګې ښکاره کړئ لکه څنګه چې تاسو د پاکټ سنیفیر په کارولو سره پاکټونه نیولي وي.

سرچینه: www.habr.com

Add a comment