ns-3 jaringan simulator tutorial. Bab 5

ns-3 jaringan simulator tutorial. Bab 5
bab 1,2
bab 3
bab 4

5 Setelan
5.1 Nggunakake modul logging
5.1.1 Ringkesan logging
5.1.2 Ngaktifake logging
5.1.3 Nambahake logging menyang kode sampeyan
5.2 Nggunakake argumen baris perintah
5.2.1 Overriding nilai atribut standar
5.2.2 Njupuk printah dhewe
5.3 Nggunakake sistem tracing
5.3.1 ASCII nelusuri
Parsing ngambah ASCII
5.3.2 Врассировка PCAP

Bab 5

imbuhan

5.1 Nggunakake modul logging

Kita wis sedhela ndeleng modul logging ns-3 kanthi ndeleng skrip pisanan.cc. Ing bab iki, kita bakal nliti kanthi luwih rinci babagan panggunaan subsistem logging.

5.1.1 Ringkesan logging

Akeh sistem gedhe ndhukung sawetara jinis fasilitas logging pesen, lan ns-3 ora istimΓ©wa. Ing sawetara kasus, mung pesen kesalahan ditulis kanggo "console operator" (kang biasane stderr ing sistem basis Unix). Ing sistem liyane, pesen peringatan bisa ditampilake uga informasi sing luwih rinci. Ing sawetara kasus, piranti logging digunakake kanggo output pesen debug sing bisa cepet burem output.

SubHRD sing digunakake ing ns-3 nganggep yen kabeh tingkat isi informasi iki migunani, lan kita nyedhiyakake pendekatan sing selektif lan berlapis kanggo logging pesen. Log bisa dipateni kanthi lengkap, diaktifake kanthi basis saben komponen, utawa sacara global. Kanggo tujuan iki, tingkat isi informasi sing bisa diatur digunakake. Modul logging ns-3 nyedhiyakake cara sing relatif prasaja kanggo njupuk informasi migunani saka simulasi sampeyan.

Sampeyan kudu ngerti manawa kita nyedhiyakake mekanisme tujuan umum - nelusuri - kanggo ngekstrak data saka model sampeyan, sing kudu dadi output sing disenengi kanggo simulasi (kanggo informasi luwih lengkap babagan sistem tracing, deleng bagean tutorial 5.3). Log kudu dadi cara sing disenengi kanggo entuk informasi debugging, bebaya, pesen kesalahan, utawa kanggo ngirim pesen kanthi cepet saka skrip utawa model sampeyan kapan wae.

Saiki, sistem kasebut nemtokake pitung tingkat (jinis) pesen log kanthi nambah urutan isi informasi.

  • LOG_ERROR - pesen kesalahan logging (makro sing gegandhengan: NS_LOG_ERROR);
  • LOG_WARN - Pesen peringatan log (makro sing gegandhengan: NS_LOG_WARN);
  • LOG_DEBUG - Log pesen debug khusus sing relatif langka (makro sing gegandhengan: NS_LOG_DEBUG);
  • LOG_INFO - registrasi pesen informasi babagan kemajuan program (makro sing gegandhengan: NS_LOG_INFO);
  • LOG_FUNCTION - Log pesen sing njlΓ¨ntrΓ¨hakΓ© saben fungsi disebut (loro macro related: NS_LOG_FUNCTION, digunakake kanggo fungsi anggota, lan NS_LOG_FUNCTION_NOARGS, digunakake kanggo fungsi statis);
  • LOG_LOGIC - pesen logging sing nggambarake aliran logis ing sawijining fungsi (makro sing gegandhengan: NS_LOG_LOGIC);
  • LOG_ALL - Log kabeh sing kasebut ing ndhuwur (ora ana makro sing gegandhengan).
    Kanggo saben jinis (LOG_TYPE) uga ana LOG_LEVEL_TYPE sing, yen digunakake, ngidini kabeh level ing ndhuwur bisa mlebu ing saliyane level dhewe. (Minangka akibate, LOG_ERROR lan LOG_LEVEL_ERROR, lan LOG_ALL lan LOG_LEVEL_ALL padha karo fungsine.) Contone, ngaktifake LOG_INFO mung ngidini pesen sing disedhiyakake dening makro NS_LOG_INFO, nalika ngaktifake LOG_LEVEL_INFO uga bakal kalebu pesen sing diwenehake dening makro ,NSLOGER_DEBUNS.

Kita uga nyedhiyakake makro logging tanpa syarat sing tansah ditampilake, preduli saka tingkat logging utawa komponen pilihan.

  • NS_LOG_UNCOND - Log tanpa syarat saka pesen sing gegandhengan (ora ana level log sing gegandhengan).

Saben level bisa ditakoni kanthi individu utawa kumulatif. Logging bisa dikonfigurasi nggunakake variabel lingkungan sh NS_LOG utawa kanthi log telpon fungsi sistem. Kaya sing dituduhake sadurunge, sistem logging duwe dokumentasi Doxygen lan saiki iki wektu sing apik kanggo mriksa maneh yen durung.

Saiki sampeyan wis maca dokumentasi kanthi rinci, ayo gunakake kawruh kasebut kanggo entuk informasi sing menarik saka skrip conto scratch/myfirst.ccsing wis sampeyan kompilasi.

5.1.2 Ngaktifake logging

Ayo nggunakake variabel lingkungan NS_LOG kanggo mbukak sawetara log liyane, nanging pisanan, mung kanggo njaluk bantalan, mbukak script pungkasan kaya sadurunge,

$ ./waf --run scratch/myfirst

Sampeyan kudu ndeleng output menowo saka program conto ns-3 pisanan

$ 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

Pranyata pesen "dikirim" lan "ditampa" sing sampeyan deleng ing ndhuwur bener-bener pesen saka log. UdpEchoClientApplication ΠΈ UdpEchoServerApplication. Contone, kita bisa njaluk aplikasi klien kanggo nyithak informasi tambahan kanthi nyetel level log liwat variabel lingkungan NS_LOG.

Wiwit saiki, aku bakal nganggep yen sampeyan nggunakake cangkang kaya sh sing nggunakake sintaks "VARIABLE = value". Yen sampeyan nggunakake cangkang kaya csh, sampeyan kudu ngowahi contoku menyang sintaks "nilai variabel setenv" sing dibutuhake dening cangkang kasebut.

Saiki, aplikasi klien echo UDP nanggapi baris kode ing ngisor iki scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

Ngaktifake level logging LOG_LEVEL_INFO. Nalika kita ngliwati gendera tingkat logging, kita bener-bener ngaktifake level kasebut lan kabeh level ngisor. Ing kasus iki, kita wis ngaktifake NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN lan NS_LOG_ERROR. Kita bisa nambah level logging lan entuk informasi luwih akeh, tanpa owah-owahan skrip lan kompilasi ulang, kanthi nyetel variabel lingkungan NS_LOG kaya ing ngisor iki:

$ export NS_LOG=UdpEchoClientApplication=level_all

Dadi, kita nyetel variabel sh shell NS_LOG menyang nilai ing ngisor iki,

UdpEchoClientApplication=level_all

Sisih kiwa saka assignment iku jeneng komponen mlebu kita arep kanggo ngatur, lan sisih tengen gendΓ©ra kita arep kanggo aplikasi kanggo. Ing kasus iki, kita bakal ngaktifake kabeh tingkat debugging ing aplikasi kasebut. Yen sampeyan mbukak skrip nganggo NS_LOG disetel kanthi cara iki, sistem logging ns-3 bakal nampa owah-owahan lan sampeyan kudu ndeleng output ing ngisor iki:

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

Informasi debugging tambahan sing diwenehake dening aplikasi saiki ing tingkat NS_LOG_FUNCTION. Iki nuduhake saben conto telpon fungsi sajrone eksekusi skrip. Minangka aturan umum, ing fungsi metode luwih becik digunakake (minimal)NS_LOG_FUNCTION (this). Gunakake NS_LOG_FUNCTION_NOARGS ()
mung ing fungsi statis. Nanging, elinga yen sistem ns-3 ora dibutuhake kanggo ndhukung fungsi logging. Kaputusan babagan jumlah informasi sing direkam ditinggalake menyang pangembang model individu. Ing kasus aplikasi echo, akeh output logging kasedhiya.

Sampeyan saiki bisa ndeleng log telpon fungsi sing digawe dening aplikasi. Yen sampeyan ndeleng kanthi teliti, sampeyan bakal weruh titik titik ing antarane garis UdpEchoClientApplication lan jeneng cara, ngendi sampeyan bisa nyana ndeleng C ++ orane katrangan operator (: :). Iki sengojo.

Iki dudu jeneng kelas, nanging jeneng komponen logging. Nalika ana match antarane file sumber lan kelas, iku biasane jeneng kelas, nanging sampeyan kudu Γ©ling sing ora bener jeneng kelas, lan ana titik siji tinimbang titik pindho. Iki minangka cara kanggo mbantu sampeyan misahake jeneng kacang logging saka jeneng kelas kanthi cara sing relatif subtle.

Nanging, ing sawetara kasus bisa dadi angel kanggo nemtokake cara sing bener ngasilake pesen log. Yen sampeyan ndeleng teks ing ndhuwur, sampeyan bisa uga mikir ing ngendi garis kasebut "Received 1024 bytes from 10.1.1.2" Sampeyan bisa ngatasi masalah iki kanthi nyetel level prefix_func menyang variabel lingkungan NS_LOG. Coba ing ngisor iki:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Π°Ρ Ρ‡Π΅Ρ€Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ для обозначСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π˜Π›Π˜, Ρ‚Π°ΠΊΠΆΠ΅ являСтся соСдинитСлСм ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΎΠ² Unix. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли Π²Ρ‹ запуститС сцСнарий, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ систСма Турналирования Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ сообщСниС ΠΈΠ· Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΆΡƒΡ€Π½Π°Π»Π° ΠΈΠΌΠ΅Π΅Ρ‚ прСфикс с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°.

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

Saiki sampeyan bisa ndeleng manawa kabeh pesen sing teka saka aplikasi klien gema UDP diidentifikasi kaya ngono. Pesen"Received 1024 bytes from 10.1.1.2"Saiki diidentifikasi kanthi jelas asale saka aplikasi klien echo. Pesen sing isih kudu teka saka aplikasi server gema UDP. Kita bisa ngaktifake komponen iki kanthi ngetik dhaptar komponen sing dipisahake titik titik ing variabel lingkungan NS_LOG.

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

Pènget: Ing conto teks ing ndhuwur, sampeyan kudu mbusak karakter baris anyar sawise titik titik (:), digunakake kanggo ngowahi format dokumen. Saiki yen sampeyan mbukak skrip, sampeyan bakal bisa ndeleng kabeh pesen log saka aplikasi echo klien lan server. Sampeyan bisa ndeleng manawa iki bisa migunani banget nalika debugging.

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

Kadhangkala uga migunani kanggo ndeleng wektu simulasi nalika pesen log digawe. Sampeyan bisa nindakake iki kanthi nambahake bit OR awalan_wektu:

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

Maneh, sampeyan kudu mbusak karakter baris anyar ing ndhuwur. Yen sampeyan saiki mbukak skrip sampeyan kudu ndeleng output ing ngisor iki:

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

Wigati dimangerteni menawa konstruktor kanggo UdpEchoServer diarani nalika simulasi 0 detik. Iki kedadeyan sadurunge simulasi diwiwiti, nanging wektu ditampilake minangka nol detik. Padha bener kanggo pesen konstruktor 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()

Elinga yen skrip ngeruk / pisanan.cc miwiti aplikasi echo server sedetik sadurunge simulasi diwiwiti. Saiki sampeyan bisa ndeleng cara kasebut StartApplication server bener disebut ing detik pisanan. Sampeyan bisa uga sok dong mirsani sing klien kumandhang wiwit ing kaloro kapindho simulasi, kita takon ing script.

Sampeyan saiki bisa ngetutake proses simulasi ing telpon JadwalTransmit ing klien sing nelpon HandleRead callback Kirim ing aplikasi server gema. Elinga yen wektu sing wis suwe kanggo ngirim paket liwat link point-to-point yaiku 3,69 milidetik. Sampeyan bisa ndeleng manawa server echo nyathet pesen sing wis nanggapi paket kasebut, banjur, sawise wektu tundha saluran, sampeyan bakal weruh manawa klien echo nampa paket kumandhang ing metode HandleRead.

Ing simulasi iki, akeh sing kedadeyan tanpa sampeyan sadari. Nanging sampeyan bisa nglacak kabeh proses kanthi gampang kanthi ngaktifake kabeh komponen logging ing sistem. Coba setel variabel NS_LOG menyang nilai ing ngisor iki,

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

Tanda bintang ing ndhuwur minangka karakter wildcard kanggo komponen logging. Iki bakal kalebu kabeh entri ing kabeh komponen sing digunakake ing simulasi. Aku ora bakal ngasilake output ing kene (nalika nulis ngasilake 1265 baris output kanggo paket gema siji), nanging sampeyan bisa ngarahake informasi iki menyang file lan ndeleng ing editor favorit.

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

Aku pribadi nggunakake versi logging banget verbose iki nalika aku duwe masalah lan ora ngerti ngendi iku salah. Aku bisa tindakake eksekusi kode cukup gampang tanpa nyetel breakpoints lan mlaku liwat kode ing debugger. Aku mung bisa ngowahi output ing editor favorit lan goleki apa aku nyana lan ndeleng soko kelakon sing aku ora nyana. Sawise aku duwe gagasan umum babagan apa sing salah, aku mlumpat menyang debugger kanggo ngebor masalah kasebut. Output jinis iki bisa migunani banget nalika skrip sampeyan nindakake perkara sing ora dikarepke. Yen sampeyan mung nggunakake debugger, sampeyan bisa kantun corak tanggung. Registrasi ndadekake owah-owahan kasebut katon.

5.1.3 Nambahake logging menyang kode sampeyan

Sampeyan bisa nambah entri anyar menyang simulasi kanthi nelpon menyang komponen log saka macem-macem makro. Ayo dadi ing script myfirst.cc, sing ana ing direktori "resik". Elinga yen kita nemtokake komponen logging ing skenario iki:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Sampeyan ngerti yen sampeyan bisa ngaktifake log kabeh pesen saka komponen iki kanthi nyetel variabel lingkungan NS_LOG ing tingkat sing beda. Ayo dadi maju lan nambah sawetara entri menyang script. Makro sing digunakake kanggo nambah pesen tingkat informasi menyang log yaiku NS_LOG_INFO. Ayo nambah pesen (sadurunge kita miwiti nggawe simpul) sing ngandhani yen skrip ana ing tahap "Nggawe Topologi". Iki ditindakake ing cuplikan kode ing ngisor iki,
Bukak scratch/myfirst.cc ing editor favorit lan tambahake baris,
NS_LOG_INFO ("Creating Topology");
sadurunge baris,

NodeContainer nodes;
nodes.Create (2);

Saiki ngumpulake skrip nggunakake waf, lan mbusak variabel NS_LOG kanggo mateni stream log sing wis diaktifake sadurunge:

$ ./waf
$ export NS_LOG=
Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли Π²Ρ‹ запуститС скрипт,
$ ./waf --run scratch/myfirst

Sampeyan ora bakal weruh pesen anyar amarga komponen logging sing gegandhengan (FirstScriptExample) durung diaktifake. Kanggo ndeleng pesen sampeyan kudu ngaktifake komponen logging FirstScriptConto kanthi tingkat ora luwih murah tinimbang NS_LOG_INFO. Yen sampeyan mung pengin ndeleng level logging tartamtu iki, sampeyan bisa ngaktifake kaya iki,

$ export NS_LOG=FirstScriptExample=info

Yen sampeyan mbukak skrip saiki, sampeyan bakal weruh pesen anyar "Nggawe Topologi",

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 Nggunakake argumen baris perintah

5.2.1 Overriding nilai atribut standar

Cara liya kanggo ngganti prilaku skrip ns-3 tanpa nyunting utawa mbangun yaiku nggunakake argumen baris perintah. Kita nyedhiyakake mekanisme kanggo ngurai argumen baris perintah lan kanthi otomatis nyetel variabel lokal lan global adhedhasar asil.

Langkah pisanan nggunakake sistem argumen baris perintah yaiku ngumumake parser baris perintah. Iki cukup gampang ditindakake (ing program utama sampeyan), kaya ing kode ing ngisor iki,

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

Potongan rong baris sing prasaja iki pancen migunani banget. Mbukak lawang menyang variabel global ns-3 lan sistem atribut. Ayo nambahake rong baris kode menyang wiwitan fungsi skrip utama scratch/myfirst.cc. Ngalih, kita ngumpulake skrip lan mbukak, nalika mlaku kita njaluk bantuan kaya ing ngisor iki,

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

Printah iki bakal takon Waf mbukak script ngeruk / myfirst lan pass argumen baris perintah β€”PrintBantuan. Tanda kutip dibutuhake kanggo nunjukake program sing dimaksudake kanggo argumen kasebut. Parser baris perintah bakal ndeteksi argumen kasebut β€”PrintBantuan lan bakal nampilake jawaban,

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.

Saiki ayo kang katon ing pilihan -PrintAtribut. Kita wis kasebut sistem atribut ns-3 nalika sinau script first.cc. Kita wis ndeleng baris kode ing ngisor iki,

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

lan padha ngandika mangkono DataRate iku sejatine atribut PointToPointNetDevice. Ayo nggunakake parser argumen baris perintah kanggo ndeleng atribut PointToPointNetDevice. Dhaptar pitulung ngandhani apa sing kudu diwenehake TipeId. Iki minangka jeneng kelas sing nduweni atribut kapentingan. Ing kasus kita bakal dadi ns3:: PointToPointNetDevice. Ayo maju terus, mlebu,

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

Sistem bakal nyithak kabeh atribut saka jinis piranti jaringan iki. Sampeyan bakal weruh manawa ing antarane atribut ing dhaptar yaiku,

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

Iki minangka nilai standar sing bakal digunakake dening sistem nalika nggawe obyek kasebut PointToPointNetDevice. Kita bakal ngilangi nilai standar iki kanthi nggunakake parameter kasebut ngubungake Π² PointToPointHelper luwih dhuwur. Ayo nggunakake nilai standar kanggo piranti lan saluran point-to-point. Kanggo nindakake iki, kita bakal mbusak telpon SetDeviceAttribute ΠΈ SetChannelAttribute saka myfirst.cc, sing ana ing direktori sing resik.

Skrip sampeyan saiki kudu ngumumake PointToPointHelper lan aja nindakake operasi instalasi kaya sing ditampilake ing conto ing ngisor iki,

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

Go ahead lan nggawe script anyar karo Waf (./waf) lan ayo bali lan nyakup sawetara entri saka aplikasi server gema UDP lan kalebu awalan wektu.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

Yen sampeyan mbukak skrip sampeyan kudu ndeleng output ing ngisor iki:

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

Saiki dheweke nampa paket ing 2.25732 detik. Iki amarga kita mung ngreset PointToPointNetDevice tingkat data saka limang megabits per detik kanggo Nilai standar, yaiku 32768 bit per detik. Yen kita ngganti DataRate anyar nggunakake baris perintah, kita bisa nyepetake simulasi maneh. Kita bakal nindakake kaya ing ngisor iki, miturut rumus sing diwenehake dening unsur pitulung:

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

Iki bakal ngasilake atribut DataRate menyang nilai standar limang megabit per detik. Apa sampeyan kaget karo asil? Pranyata supaya bisa bali prilaku asli saka script, kita uga kudu nyetel wektu tundha saluran kanggo cocog kacepetan cahya. Kita bisa njaluk sistem baris printah kanggo nyithak atribut saluran, kaya sing ditindakake kanggo piranti jaringan:

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

Kita bakal nemokake manawa atribut tundha saluran disetel kaya ing ngisor iki:

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

Banjur kita bisa, liwat sistem baris printah, nyetel loro nilai gawan iki.

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

ing kasus iki, kita mulihake wektu nalika kita kanthi tegas nyetel DataRate lan Tundha ing skrip:

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

Elinga yen paket ditampa dening server maneh sawise 2,00369 detik. Kita bisa nyetel sembarang atribut sing digunakake ing skrip kanthi cara iki. Utamane, kita bisa nyetel atribut MaxPackets menyang nilai non-siji UdpEchoClient.

Kepiye carane sampeyan nggunakake? Coba. Elinga yen sampeyan kudu menehi komentar babagan papan sing kita timpa nilai atribut standar lan disetel kanthi jelas MaxPackets ing naskah. Banjur sampeyan kudu mbangun maneh skrip. Sampeyan uga bisa nggunakake baris printah kanggo njaluk bantuan sintaks kanggo nyetel nilai atribut standar anyar. Sawise sampeyan ngerti iki, sampeyan bisa ngontrol jumlah paket sing ditampilake ing baris printah. Amarga kita wong sing sinau, baris perintah kita kudu katon kaya iki:

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

Pitakonan alam sing muncul ing titik iki yaiku carane ngerti babagan eksistensi kabeh atribut kasebut. Maneh, sistem baris perintah nduweni fungsi bantuan kanggo perkara iki. Yen kita njaluk bantuan baris perintah, kita kudu ndeleng:

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

Yen sampeyan milih argumen "PrintGroups", sampeyan kudu ndeleng dhaptar kabeh grup sing wis kadhaptar TipeId. Jeneng grup kasebut cocog karo jeneng modul ing direktori sumber (sanajan nganggo huruf kapital). Nyetak kabeh informasi bebarengan bakal dadi akeh banget, mula saringan tambahan kasedhiya kanggo nyithak informasi miturut klompok. Dadi, maneh fokus ing modul point-to-point:

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

Ing kene sampeyan bisa nemokake jeneng TypeId sing kasedhiya kanggo nggoleki atribut, contone ing
--PrintAttributes = ns3 :: PointToPointChannelkaya sing dituduhake ing ndhuwur.

Cara liya kanggo sinau babagan atribut yaiku liwat Doxygen ns‑3. Ana kaca sing nampilake kabeh atribut sing didaftar ing simulator.

5.2.2 Njupuk printah dhewe

Sampeyan uga bisa nambah pancingan dhewe liwat sistem baris printah. Iki rampung kanthi nggunakake metode parser baris perintah AddValue.
Ayo nggunakake fitur iki kanggo nemtokake jumlah paket sing bakal ditampilake kanthi cara sing beda. Ayo nambah variabel lokal sing diarani nPaket menyang fungsi utama. Kita bakal nyetel dadi siji kanggo cocog karo prilaku standar sadurunge. Kanggo ngidini parser baris printah ngganti nilai iki, kita kudu njupuk nilai iki ing parser. Kita nindakake iki kanthi nambah telpon AddValue. Go lan ngganti script scratch/myfirst.cc dadi kanggo miwiti karo kode ing ngisor iki,

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

Gulung mudhun menyang titik ing script ngendi kita nyetel atribut MaxPackets lan ngganti supaya disetel kanggo variabel nPackets tinimbang pancet 1, minangka kapacak ing ngisor iki.

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

Saiki yen sampeyan mbukak skrip lan nyedhiyakake argumen -PrintHelp, sampeyan kudu ndeleng argumen pangguna anyar. kadhaptar ing tampilan bantuan. mlebu,

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

Yen sampeyan pengin ngganti jumlah paket sing dikirim, sampeyan bisa nindakake kanthi nyetel argumen baris perintah - -nPackets.

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

Saiki sampeyan kudu ndeleng

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

Sampeyan saiki wis ngirim rong paket. Cukup prasaja, ta?
Sampeyan bisa ndeleng manawa minangka pangguna ns-3, sampeyan bisa nggunakake sistem argumen baris perintah kanggo ngapusi nilai lan atribut global. Yen sampeyan dadi penulis model, sampeyan bisa nambah atribut anyar menyang obyek lan bakal kasedhiya kanthi otomatis kanggo konfigurasi dening pangguna liwat sistem baris perintah. Yen sampeyan minangka penulis skrip, sampeyan bisa nambah variabel anyar menyang skrip sampeyan lan plug menyang sistem baris perintah kanthi lancar.

5.3 Nggunakake sistem tracing

Titik kabeh modeling yaiku ngasilake output kanggo sinau luwih lanjut, lan sistem jejak ns-3 minangka mekanisme utama kanggo iki. Wiwit ns-3 minangka program C++, cara standar kanggo ngasilake output saka program C++ bisa digunakake:

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

Sampeyan malah bisa nggunakake modul logging kanggo nambah struktur sethitik kanggo solusi. Ana akeh masalah sing dikawruhi amarga pendekatan iki, mula kita nyedhiyakake subsistem pelacakan acara umum kanggo ngatasi masalah kasebut.

Tujuan utama sistem tracing ns-3 yaiku:

  • Kanggo tugas dhasar, sistem nelusuri kudu ngidini pangguna ngasilake jejak standar kanggo sumber populer lan milih obyek sing ngasilake jejak;

  • Pangguna penengah kudu bisa ngluwihi sistem nelusuri kanggo ngganti format output sing digawe utawa nglebokake sumber jejak anyar, tanpa ngowahi inti simulator;

  • Pangguna majeng bisa ngowahi inti simulator kanggo nambah sumber tilak anyar lan sinks. Sistem pelacakan ns-3 dibangun kanthi prinsip sumber lan panrima pelacakan independen, uga minangka mekanisme terpadu kanggo nyambungake sumber menyang konsumen.

Sistem pelacakan ns-3 dibangun kanthi prinsip sumber lan panrima pelacakan independen, uga mekanisme terpadu kanggo nyambungake sumber menyang panrima. Sumber trace minangka obyek sing bisa menehi tandha acara sing kedadeyan ing simulasi lan menehi akses menyang data sing ndasari kapentingan. Contone, sumber tilak bisa nuduhake nalika piranti jaringan nampa paket lan nggawe isi paket kasedhiya kanggo panrima tilak kasengsem.

Sumber trace dhewe ora ana gunane kajaba padha "digabungake" karo bagean liyane saka kode sing bener nindakake soko migunani karo informasi sing diwenehake dening sink. Tracers minangka konsumen acara lan data sing diwenehake dening sumber jejak. Contone, sampeyan bisa nggawe sink tilak sing bakal (nalika disambungake menyang sumber tilak saka conto sadurungΓ©) print metu bagean kapentingan ing paket ditampa.

Alesan kanggo pamisahan sing jelas iki yaiku ngidini pangguna nyambungake jinis sink anyar menyang sumber jejak sing ana tanpa kudu ngowahi lan nyusun ulang inti simulator. Dadi ing conto ing ndhuwur, pangguna bisa nemtokake tracer anyar ing skrip lan nyambungake menyang sumber jejak sing wis ana sing ditetepake ing inti simulasi mung kanthi nyunting skrip pangguna.

Ing tutorial iki, kita bakal nliti sawetara sumber lan sink sing wis ditemtokake lan nuduhake carane bisa dikonfigurasi kanthi gaweyan paling sithik kanggo pangguna. Waca ns-3 Manual utawa carane-kanggo bagean kanggo informasi ing konfigurasi tilak majeng, kalebu ngembangaken spasi jeneng tilak lan nggawe sumber tilak anyar.

5.3.1 ASCII nelusuri

ns-3 nyedhiyakake fungsi helper sing nyedhiyakake sistem tracing tingkat rendah kanggo mbantu sampeyan kanthi rinci nalika nyetel jejak paket sing prasaja. Yen sampeyan ngaktifake fitur iki, sampeyan bakal weruh output ing file ASCII. Kanggo sing menowo output ns-2, jinis tilak iki padha metu.tr, sing digawe dening akeh skrip.

Ayo dadi mudhun kanggo bisnis lan nambah sawetara asil tilak ASCII kanggo scratch kita / script myfirst.cc. Tengen sadurunge telpon Simulator :: Run (), tambahake baris kode ing ngisor iki:
AsciiTraceHelper ascii;

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

Kaya akeh idiom ns-3 liyane, kode iki nggunakake obyek helper kanggo nggawe jejak ASCII. Baris kapindho ngemot rong panggilan metode nested. Metode "ing njero". NggaweFileStream() nggunakake idiom obyek anonim kanggo nggawe obyek stream file ing tumpukan (tanpa jeneng obyek) lan liwat menyang cara disebut. Kita bakal luwih jero babagan iki ing mangsa ngarep, nanging sampeyan mung kudu ngerti yen sampeyan nggawe obyek sing makili file sing diarani myfirst.tr lan transfer menyang ns-3. Kita ngandelake ns-3 kanggo ngrawat obyek sing digawe kanggo kabeh umure, sajrone ngrampungake masalah sing disebabake dening watesan sing sithik (sengaja) sing ana gandhengane karo konstruktor salinan obyek stream C ++.

Telpon njaba EnableAsciiAll() ngandhani asisten sing pengin kalebu ngambah ASCII ing simulasi kanggo kabeh sambungan piranti titik-kanggo-titik lan sing pengin (ditemtokake) tilak panrima kanggo ngrekam informasi gerakan paket ing format ASCII.

Kanggo sing menowo ns-2, acara dilacak padha karo tracepoints dikenal sing nyathet acara "+", "-", "d" lan "r".
Saiki sampeyan bisa mbangun skrip lan mbukak saka baris perintah:

$ ./waf --run scratch/myfirst

Kaya kaping pirang-pirang sadurunge, sampeyan bakal weruh sawetara pesen saka Waf, banjur "'mbangun' rampung kanthi sukses" karo sawetara pesen saka program sing mlaku.

Nalika mlaku, program bakal nggawe file jenenge myfirst.tr. Amarga alam karya Waf, kanthi gawan, file kasebut ora digawe ing direktori lokal, nanging ing direktori tingkat paling dhuwur ing repositori. Yen sampeyan pengin ngganti path ing ngendi jejak disimpen, sampeyan bisa nggunakake parameter Waf kanggo nemtokake --cwd. Kita durung nindakake iki, mula kanggo ndeleng file jejak ASCII myfirst.tr ing editor favorit, kita kudu navigasi menyang direktori paling dhuwur ing gudang.

Parsing ngambah ASCII

Ana akeh informasi sing ana ing wangun sing cukup padhet, nanging sing pertama sampeyan kudu ngerti yaiku file kasebut kalebu garis individu. Iki bakal katon kanthi jelas yen sampeyan nggedhekake jendhela ndeleng luwih akeh.

Saben baris ing file cocog karo acara tilak. Ing kasus iki, kita nglacak acara ing antrian transmisi saiki ing saben piranti jaringan titik-kanggo-titik ing simulasi. Antrian transmisi yaiku antrian sing kudu dilewati saben paket kanggo link point-to-point. Elinga yen saben baris ing file tilak diwiwiti kanthi karakter siji (lan duwe spasi sawise). Simbol iki bakal duwe makna ing ngisor iki:

+: operasi antrian dumadi ing antrian piranti;
-: operasi njupuk unsur dumadi ing antrian piranti;
d: paket dicemplungake, biasane amarga antrian wis kebak;
r: Paket ditampa dening piranti jaringan.

Ayo katon luwih cedhak ing baris pisanan ing file trace. Aku bakal dibagi dadi bagean (kanthi lekukan kanggo kajelasan) lan nomer baris ing sisih kiwa:

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)

Bagean pisanan acara tilak lengkap iki (baris 0) operasi. Kita duwe simbol + ing kene, sing cocog karo operasi antrian kanggo transmisi. Bagean kapindho (baris 1) yaiku wektu simulasi, ditulis ing detik. Sampeyan bisa uga ngelingi apa sing kita takon UdpEchoClientApplication miwiti ngirim paket ing rong detik. Ing kene kita ndeleng konfirmasi manawa iki pancen kedadeyan.

Bagean sabanjure conto tilak (saka baris 2) nuduhake sumber tilak endi acara iki (nuduhake tilak namespace). Sampeyan bisa mikir babagan spasi jeneng trace kaya sing sampeyan gunakake ing ruang jeneng sistem file. Oyod papan jeneng yaiku NodeList. Iki cocog karo wadhah sing dikelola ing kode ns-3 utama. Isine kabeh simpul sing digawe ing naskah. Kaya sistem file bisa duwe direktori ing oyod, NodeList kita bisa duwe akeh simpul. Dadi baris /NodeList/0 nuduhake simpul null ing NodeList, sing biasane kita pikirake minangka "simpul 0". Saben simpul duwe dhaptar piranti sing wis diinstal. Dhaptar iki dumunung ing jejere namespace. Sampeyan bisa ndeleng sing acara tilak iki asalΓ© saka Dhaptar Piranti/0, yaiku piranti null sing dipasang ing simpul.

Sabanjure substring, $ ns3 :: PointToPointNetDevice, ngandhani piranti sing ana ing posisi nol: dhaptar piranti nol nol. Elinga yen operasi + sing ditemokake ing baris 0 tegese unsur ditambahake menyang antrian ngirim piranti. Iki dibayangke ing bagean pungkasan saka "jalur trek": TxQueue / Enqueue.

Bagean sing isih ana ing jejak kudu cukup intuisi. Baris 3-4 nuduhake yen paket kasebut dikemas ing protokol titik-kanggo-titik. Baris 5-7 nuduhake yen paket kasebut nduweni header versi IP4 lan asale saka alamat IP 10.1.1.1 lan dimaksudakΓ© kanggo 10.1.1.2. Baris 8-9 nuduhake yen paket iki nduweni header UDP lan pungkasane baris 10 nuduhake yen muatan kasebut minangka 1024 bait sing dikarepake.

Baris sabanjure ing file tilak nuduhake yen paket sing padha ditarik saka antrian transmisi ing simpul sing padha.

Baris katelu ing file trace nuduhake yen paket kasebut ditampa dening piranti jaringan ing host server echo. Aku wis ngasilake acara ing ngisor iki.

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)

Elinga yen operasi tilak saiki r lan wektu simulasi wis tambah kanggo 2,25732 detik. Yen sampeyan ngetutake tutorial kasebut kanthi teliti, iki tegese sampeyan ninggalake DataRate lan Link Tundha piranti jaringan ing nilai standar. Tegang iki kudu akrab, kaya sing sampeyan deleng ing bagean sadurunge.

Entri spasi jeneng sumber trace (baris 2) wis diowahi kanggo nggambarake yen acara iki asale saka simpul 1 (/NodeList/1) lan paket ditampa dening sumber tilak (/MacRx). Sampeyan kudu cukup gampang kanggo ngetutake gerakan paket liwat topologi kanthi ndeleng jejak sing isih ana ing file kasebut.

5.3.2 Врассировка PCAP

Helpers Piranti ns-3 uga bisa digunakake kanggo nggawe file tilak ing format .pcap. Akronim pcap (biasane ditulis ing huruf cilik) stands for paket dijupuk lan bener API sing kalebu nemtokake format file .pcap. Program sing paling populer sing bisa maca lan nampilake format iki yaiku Wireshark (sadurunge disebut Ethereal). Nanging, ana akeh penganalisa jejak lalu lintas sing nggunakake format paket iki. Disaranake pangguna nggunakake akeh alat sing kasedhiya kanggo nganalisa jejak pcap. Ing tutorial iki kita bakal fokus kanggo ndeleng jejak pcap nggunakake tcpdump.

Ngaktifake pcap tracing ditindakake kanthi siji baris kode.

pointToPoint.EnablePcapAll ("myfirst");

Tempel baris kode iki sawise kode jejak ASCII sing lagi wae ditambahake scratch/myfirst.cc. Elinga yen kita mung liwati senar "myfirst", ora "myfirst.pcap" utawa soko padha. Iki amarga parameter kasebut minangka awalan, dudu jeneng file lengkap. Sajrone simulasi, asisten bakal nggawe file jejak kanggo saben piranti titik-kanggo-titik. Jeneng file bakal dibangun nggunakake awalan, nomer simpul, nomer piranti, lan seselan ".pcap".

Kanggo conto skrip, kita bakal weruh file sing jenenge "myfirst-0-0.pcap"Lan"myfirst-1-0.pcap", yaiku jejak pcap kanggo simpul 0-piranti 0 lan simpul 1-piranti 0. Sawise sampeyan nambahake baris kode kanggo ngaktifake pcap tracing, sampeyan bisa mbukak script ing cara biasanipun:

$ ./waf --run scratch/myfirst

Yen sampeyan ndeleng ing direktori tingkat paling dhuwur saka distribusi sampeyan, sampeyan kudu ndeleng telung file: file jejak ASCII myfirst.tr, sing sadurunge kita sinau, file myfirst-0-0.pcap ΠΈ myfirst-1-0.pcap - file pcap anyar sing mentas digawe.

Output maca nganggo tcpdump

Saiki, cara paling gampang kanggo ndeleng file pcap yaiku nggunakake 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

Ing mbucal myfirst-0-0.pcap (piranti klien) sampeyan bisa ndeleng paket kumandhang dikirim sawise 2 detik simulasi. Yen sampeyan ndeleng dump kapindho (myfirst-1-0.pcap), sampeyan bakal weruh yen paket ditampa ing 2,257324 detik. Sampeyan bakal weruh ing mbucal kapindho sing paket bali ing 2.257324 detik, lan pungkasanipun sing paket ditampa maneh dening klien ing mbucal pisanan ing 2.514648 detik.

Output maca karo Wireshark

Yen sampeyan ora kenal Wireshark, ana situs web sing bisa ndownload program lan dokumentasi: http://www.wireshark.org/. Wireshark iku GUI sing bisa digunakake kanggo nampilake file tilak iki. Yen sampeyan duwe Wireshark, sampeyan bisa mbukak file trace lan nampilake isine kaya-kaya wis dijupuk paket nggunakake sniffer paket.

Source: www.habr.com

Add a comment