Tutorial simulator rangkaian ns-3. Bab 5

Tutorial simulator rangkaian ns-3. Bab 5
bab 1,2
bab 3
bab 4

5 Tetapan
5.1 Menggunakan modul pengelogan
5.1.1 Gambaran keseluruhan pembalakan
5.1.2 Dayakan pengelogan
5.1.3 Menambah pengelogan pada kod anda
5.2 Menggunakan hujah baris arahan
5.2.1 Mengatasi nilai atribut lalai
5.2.2 Menangkap arahan anda sendiri
5.3 Menggunakan sistem pengesanan
5.3.1 Pengesanan ASCII
Menghuraikan jejak ASCII
5.3.2 Jejak PCAP

Bab 5

pelarasan

5.1 Menggunakan modul pengelogan

Kami telah melihat secara ringkas modul pengelogan ns-3 dengan melihat skrip pertama.cc. Dalam bab ini, kita akan melihat dengan lebih dekat kemungkinan penggunaan untuk subsistem pengelogan.

5.1.1 Gambaran keseluruhan pembalakan

Banyak sistem besar menyokong beberapa jenis kemudahan pengelogan mesej, dan ns-3 tidak terkecuali. Dalam sesetengah kes, hanya mesej ralat ditulis kepada "konsol pengendali" (yang biasanya stderr pada sistem berasaskan Unix). Pada sistem lain, mesej amaran mungkin dipaparkan serta maklumat yang lebih terperinci. Dalam sesetengah kes, alat pengelogan digunakan untuk mengeluarkan mesej nyahpepijat yang boleh mengaburkan output dengan cepat.

SubHRD yang digunakan dalam ns-3 menganggap bahawa semua peringkat kandungan maklumat ini berguna, dan kami menyediakan pendekatan berlapis yang terpilih untuk pengelogan mesej. Pengelogan boleh dilumpuhkan sepenuhnya, didayakan pada asas setiap komponen, atau secara global. Untuk tujuan ini, tahap kandungan maklumat boleh laras digunakan. Modul pengelogan ns-3 menyediakan cara yang agak mudah untuk mendapatkan maklumat berguna daripada simulasi anda.

Anda harus faham bahawa kami menyediakan mekanisme tujuan umum - pengesanan - untuk mengekstrak data daripada model anda, yang sepatutnya menjadi output pilihan untuk simulasi (untuk mendapatkan maklumat lanjut tentang sistem pengesanan kami, lihat bahagian tutorial 5.3). Pengelogan hendaklah menjadi kaedah pilihan untuk mendapatkan maklumat penyahpepijatan, amaran, mesej ralat atau untuk mengeluarkan mesej dengan cepat daripada skrip atau model anda pada bila-bila masa.

Pada masa ini, sistem mentakrifkan tujuh peringkat (jenis) mesej log dalam meningkatkan susunan kandungan maklumat.

  • LOG_ERROR - mesej ralat log (makro berkaitan: NS_LOG_ERROR);
  • LOG_WARN - Log mesej amaran (makro berkaitan: NS_LOG_WARN);
  • LOG_DEBUG - Log mesej nyahpepijat khas yang agak jarang berlaku (makro berkaitan: NS_LOG_DEBUG);
  • LOG_INFO - pendaftaran mesej maklumat tentang kemajuan program (makro berkaitan: NS_LOG_INFO);
  • LOG_FUNCTION - Log mesej yang menerangkan setiap fungsi yang dipanggil (dua makro berkaitan: NS_LOG_FUNCTION, digunakan untuk fungsi ahli dan NS_LOG_FUNCTION_NOARGS, digunakan untuk fungsi statik);
  • LOG_LOGIC - mesej log yang menerangkan aliran logik dalam fungsi (makro berkaitan: NS_LOG_LOGIC);
  • LOG_ALL - Log semua yang disebutkan di atas (tiada makro yang berkaitan).
    Untuk setiap jenis (LOG_TYPE) terdapat juga LOG_LEVEL_TYPE yang, jika digunakan, membenarkan semua peringkat di atasnya dilog sebagai tambahan kepada tahapnya sendiri. (Akibatnya, LOG_ERROR dan LOG_LEVEL_ERROR dan LOG_ALL dan LOG_LEVEL_ALL adalah setara dari segi fungsi.) Sebagai contoh, mendayakan LOG_INFO hanya akan membenarkan mesej yang disediakan oleh makro NS_LOG_INFO, manakala mendayakan LOG_LEVEL_INFO dan LOG_LEVEL_INFO juga akan termasuk mesej yang disediakan oleh makro ,WAR_LOGER_DEBUGNS.

Kami juga menyediakan makro pengelogan tanpa syarat yang sentiasa dipaparkan, tanpa mengira tahap pengelogan atau komponen pemilihan.

  • NS_LOG_UNCOND - Pengelogan tanpa syarat bagi mesej yang berkaitan (tiada tahap pengelogan yang berkaitan).

Setiap peringkat boleh disoal secara individu atau kumulatif. Pengelogan boleh dikonfigurasikan menggunakan pembolehubah persekitaran sh NS_LOG atau dengan mengelog panggilan fungsi sistem. Seperti yang ditunjukkan sebelum ini, sistem pengelogan mempunyai dokumentasi Doxygen dan kini adalah masa yang baik untuk menyemaknya jika anda belum melakukannya.

Sekarang setelah anda membaca dokumentasi dengan terperinci, mari gunakan pengetahuan itu untuk mendapatkan beberapa maklumat menarik daripada skrip contoh scratch/myfirst.ccyang telah anda susun.

5.1.2 Dayakan pengelogan

Mari gunakan pembolehubah persekitaran NS_LOG untuk menjalankan beberapa lagi log, tetapi pertama, hanya untuk mendapatkan galas anda, jalankan skrip terakhir seperti yang anda lakukan sebelum ini,

$ ./waf --run scratch/myfirst

Anda seharusnya melihat output biasa daripada program contoh ns-3 yang pertama

$ 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

Ternyata mesej "dihantar" dan "terima" yang anda lihat di atas sebenarnya adalah mesej log daripada UdpEchoClientApplication ΠΈ UdpEchoServerApplication. Sebagai contoh, kami boleh meminta aplikasi klien untuk mencetak maklumat tambahan dengan menetapkan tahap pengelogannya melalui pembolehubah persekitaran NS_LOG.

Mulai sekarang, saya akan menganggap bahawa anda menggunakan shell seperti sh yang menggunakan sintaks "VARIABLE=value". Jika anda menggunakan shell seperti csh, maka anda perlu menukar contoh saya kepada sintaks "setenv variable value" yang diperlukan oleh shell tersebut.

Pada masa ini, aplikasi klien gema UDP bertindak balas kepada baris kod berikut dalam scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

Ia membolehkan tahap pengelogan LOG_LEVEL_INFO. Apabila kami melepasi bendera peringkat pengelogan, kami sebenarnya mendayakan tahap itu dan semua peringkat yang lebih rendah. Dalam kes ini, kami telah mendayakan NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN dan NS_LOG_ERROR. Kami boleh meningkatkan tahap pengelogan dan mendapatkan lebih banyak maklumat, tanpa perubahan skrip dan penyusunan semula, dengan menetapkan pembolehubah persekitaran NS_LOG seperti berikut:

$ export NS_LOG=UdpEchoClientApplication=level_all

Jadi kami menetapkan pembolehubah shell sh NS_LOG kepada nilai berikut,

UdpEchoClientApplication=level_all

Bahagian kiri tugasan ialah nama komponen log yang ingin kami konfigurasikan, dan sebelah kanan ialah bendera yang ingin kami gunakan untuknya. Dalam kes ini, kami akan mendayakan semua peringkat penyahpepijatan dalam aplikasi. Jika anda menjalankan skrip dengan set NS_LOG dengan cara ini, sistem pengelogan ns-3 akan menerima perubahan dan anda akan melihat output berikut:

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

Maklumat penyahpepijatan tambahan yang disediakan oleh aplikasi kini berada pada tahap NS_LOG_FUNCTION. Ia menunjukkan setiap contoh panggilan fungsi semasa pelaksanaan skrip. Sebagai peraturan umum, dalam fungsi kaedah adalah lebih baik untuk digunakan (sekurang-kurangnya)NS_LOG_FUNCTION (this)... Gunakan NS_LOG_FUNCTION_NOARGS ()
hanya dalam fungsi statik. Walau bagaimanapun, ambil perhatian bahawa sistem ns-3 tidak diperlukan untuk menyokong sebarang fungsi pengelogan. Keputusan tentang jumlah maklumat yang direkodkan diserahkan kepada pembangun model individu. Dalam kes aplikasi gema, sejumlah besar output pembalakan tersedia.

Anda kini boleh melihat log panggilan fungsi yang dibuat oleh aplikasi. Jika anda melihat dengan teliti, anda akan melihat titik bertindih di antara garisan UdpEchoClientApplication dan nama kaedah, di mana anda mungkin mengharapkan untuk melihat pengendali skop C++ (: :). Ini disengajakan.

Ini sebenarnya bukan nama kelas, tetapi nama komponen pembalakan. Apabila terdapat padanan antara fail sumber dan kelas, ia biasanya nama kelas, tetapi anda harus sedar bahawa ia sebenarnya bukan nama kelas, dan terdapat satu titik bertindih dan bukannya bertindih berganda. Ini ialah cara untuk membantu anda secara konsep mengasingkan nama kacang balak daripada nama kelas dengan cara yang agak halus.

Walau bagaimanapun, dalam beberapa kes, sukar untuk menentukan kaedah yang sebenarnya menjana mesej log. Jika anda melihat teks di atas, anda mungkin tertanya-tanya di mana garis "Received 1024 bytes from 10.1.1.2" Anda boleh menyelesaikan masalah ini dengan menetapkan tahap prefix_func kepada pembolehubah persekitaran NS_LOG. Cuba yang berikut:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

Ambil perhatian bahawa tanda petikan adalah perlu kerana bar menegak yang kami gunakan untuk menandakan operasi OR juga merupakan penyambung paip Unix. Sekarang jika anda menjalankan skrip, anda akan melihat bahawa sistem pengelogan memastikan bahawa setiap mesej dalam log yang diberikan diawali dengan nama komponen.

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

Kini anda boleh melihat bahawa semua mesej yang datang daripada aplikasi klien gema UDP dikenal pasti seperti itu. Mesej"Received 1024 bytes from 10.1.1.2" kini dikenal pasti dengan jelas sebagai datang daripada aplikasi klien gema. Mesej selebihnya mesti datang daripada aplikasi pelayan gema UDP. Kita boleh mendayakan komponen ini dengan memasukkan senarai komponen yang dipisahkan bertindih dalam pembolehubah persekitaran NS_LOG.

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

Amaran: Dalam contoh teks di atas, anda perlu mengalih keluar aksara baris baharu selepas bertindih (:), ia digunakan untuk memformat dokumen. Sekarang jika anda menjalankan skrip, anda akan melihat semua mesej log daripada aplikasi gema klien dan pelayan. Anda boleh melihat bahawa ini boleh menjadi sangat berguna apabila menyahpepijat.

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

Kadangkala ia juga berguna untuk dapat melihat masa simulasi di mana mesej log dijana. Anda boleh melakukan ini dengan menambah bit OR awalan_masa:

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

Sekali lagi, anda perlu mengalih keluar aksara baris baharu di atas. Jika anda kini menjalankan skrip anda akan melihat output berikut:

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

Sila ambil perhatian bahawa pembina untuk UdpEchoServer telah dipanggil semasa simulasi 0 saat. Ini sebenarnya berlaku sebelum simulasi bermula, tetapi masa ditunjukkan sebagai sifar saat. Perkara yang sama berlaku untuk mesej pembina 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()

Ingat bahawa skrip scratch/first.cc memulakan aplikasi pelayan gema satu saat sebelum permulaan simulasi. Sekarang anda boleh melihat bahawa kaedah StartApplication pelayan sebenarnya dipanggil pada saat pertama. Anda juga mungkin melihat bahawa klien gema bermula pada saat kedua simulasi, seperti yang kami tanya dalam skrip.

Anda kini boleh mengikuti perkembangan simulasi semasa panggilan JadualTransmit dalam klien yang memanggil panggil balik HandleRead Hantar dalam aplikasi pelayan gema. Ambil perhatian bahawa masa berlalu untuk menghantar paket melalui pautan titik ke titik ialah 3,69 milisaat. Anda boleh melihat bahawa pelayan gema mencatatkan mesej bahawa ia telah bertindak balas kepada paket, dan kemudian, selepas kelewatan saluran, anda melihat bahawa klien gema menerima paket gema dalam kaedah HandleReadnya.

Dalam simulasi ini, banyak yang berlaku tanpa anda sedari. Tetapi anda boleh menjejaki keseluruhan proses dengan sangat mudah dengan mendayakan semua komponen pengelogan dalam sistem. Cuba tetapkan pembolehubah NS_LOG kepada nilai berikut,

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

Asterisk di atas ialah aksara kad bebas untuk komponen pengelogan. Ini akan merangkumi semua entri dalam semua komponen yang digunakan dalam simulasi. Saya tidak akan mengeluarkan semula output di sini (pada masa penulisan ia menghasilkan 1265 baris output untuk satu paket gema), tetapi anda boleh mengubah hala maklumat ini ke fail dan melihatnya dalam editor kegemaran anda.

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

Saya secara peribadi menggunakan versi pembalakan yang sangat bertele-tele ini apabila saya menghadapi masalah dan tidak tahu di mana masalah berlaku. Saya boleh mengikuti pelaksanaan kod dengan agak mudah tanpa menetapkan titik putus dan melangkah melalui kod dalam penyahpepijat. Saya hanya boleh mengedit output dalam editor kegemaran saya dan mencari apa yang saya jangkakan dan melihat sesuatu berlaku yang tidak saya jangkakan. Sebaik sahaja saya mempunyai idea umum tentang perkara yang salah, saya melompat ke penyahpepijat untuk menelusuri masalah itu. Jenis output ini boleh menjadi sangat berguna apabila skrip anda melakukan sesuatu yang tidak dijangka sama sekali. Jika anda hanya menggunakan penyahpepijat, anda mungkin terlepas twist sepenuhnya. Pendaftaran menjadikan perubahan sedemikian ketara.

5.1.3 Menambah pengelogan pada kod anda

Anda boleh menambah entri baharu pada simulasi anda dengan membuat panggilan ke komponen log daripada berbilang makro. Mari kita buat dalam skrip myfirst.cc, yang kami ada dalam direktori "bersih". Ingat bahawa kami menentukan komponen pengelogan dalam senario ini:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Anda sedar bahawa anda boleh mendayakan pengelogan semua mesej daripada komponen ini dengan menetapkan pembolehubah persekitaran NS_LOG pada tahap yang berbeza. Mari teruskan dan tambah beberapa entri pada skrip. Makro yang digunakan untuk menambah mesej peringkat maklumat pada log ialah NS_LOG_INFO. Mari tambahkan mesej (sejurus sebelum kita mula mencipta nod) yang memberitahu anda bahawa skrip berada dalam fasa "Mencipta Topologi". Ini dilakukan dalam coretan kod berikut,
Buka scratch/myfirst.cc dalam editor kegemaran anda dan tambah baris,
NS_LOG_INFO ("Creating Topology");
betul-betul sebelum garisan,

NodeContainer nodes;
nodes.Create (2);

Sekarang susun skrip menggunakan WAF, dan kosongkan pembolehubah NS_LOG untuk melumpuhkan aliran pengelogan yang kami dayakan sebelum ini:

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

Anda tidak akan melihat mesej baharu kerana komponen pengelogan yang berkaitan (FirstScriptExample) belum didayakan. Untuk melihat mesej anda, anda perlu mendayakan komponen pengelogan FirstScriptContoh dengan tahap tidak lebih rendah daripada NS_LOG_INFO. Jika anda hanya mahu melihat tahap pengelogan khusus ini, anda boleh mendayakannya seperti ini,

$ export NS_LOG=FirstScriptExample=info

Jika anda menjalankan skrip sekarang, anda akan melihat mesej baharu "Mencipta 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 Menggunakan hujah baris arahan

5.2.1 Mengatasi nilai atribut lalai

Satu lagi cara untuk mengubah tingkah laku skrip ns-3 tanpa menyunting atau membina adalah dengan menggunakan argumen baris arahan. Kami menyediakan mekanisme untuk menghuraikan hujah baris arahan dan secara automatik menetapkan pembolehubah tempatan dan global berdasarkan keputusan.

Langkah pertama dalam menggunakan sistem hujah baris arahan ialah mengisytiharkan penghurai baris arahan. Ini agak mudah dilakukan (dalam program utama anda), seperti dalam kod berikut,

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

Coretan dua baris ringkas ini sebenarnya sangat berguna dengan cara tersendiri. Ia membuka pintu kepada sistem pembolehubah dan atribut global ns-3. Mari tambah dua baris kod pada permulaan fungsi skrip utama scratch/myfirst.cc. Seterusnya, kami menyusun skrip dan menjalankannya, apabila berjalan kami membuat permintaan bantuan seperti berikut,

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

Perintah ini akan bertanya Waf jalankan skrip calar/pertama saya dan berikannya hujah baris arahan β€”CetakBantuan. Tanda petikan diperlukan untuk menunjukkan program yang dimaksudkan untuk hujah. Penghurai baris arahan akan mengesan hujah β€”CetakBantuan dan akan memaparkan jawapan,

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.

Sekarang mari kita lihat pilihan β€”CetakAtribut. Kami telah menyebut sistem atribut ns-3 semasa mengkaji skrip first.cc. Kami telah melihat baris kod berikut,

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

dan mereka berkata demikian Kadar Data sebenarnya adalah atribut PointToPointNetDevice. Mari gunakan penghurai hujah baris arahan untuk melihat atribut PointToPointNetDevice. Senarai bantuan menyatakan perkara yang mesti kami sediakan JenisId. Ini ialah nama kelas yang mempunyai atribut minat. Dalam kes kami ia akan menjadi ns3::PointToPointNetDevice. Mari kita terus maju, masuk,

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

Sistem akan mencetak semua atribut jenis peranti rangkaian ini. Anda akan melihat bahawa antara atribut dalam senarai ialah,

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

Ini ialah nilai lalai yang akan digunakan oleh sistem semasa mencipta objek PointToPointNetDevice. Kami akan mengatasi nilai lalai ini menggunakan parameter atribut Π² PointToPointHelper lebih tinggi. Mari gunakan nilai lalai untuk peranti dan saluran titik ke titik. Untuk melakukan ini, kami akan memadamkan panggilan SetDeviceAttribute ΠΈ SetChannelAttribute daripada myfirst.cc, yang kami ada dalam direktori yang bersih.

Skrip anda kini sepatutnya mengisytiharkan sahaja PointToPointHelper dan jangan lakukan sebarang operasi pemasangan seperti yang ditunjukkan dalam contoh di bawah,

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

Teruskan dan buat skrip baharu dengan Waf (./waff) dan mari kita kembali dan sertakan beberapa entri daripada aplikasi pelayan gema UDP dan sertakan awalan masa.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

Jika anda menjalankan skrip anda akan melihat output berikut:

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

Ingat bahawa kali terakhir kita melihat masa simulasi, saat paket diterima oleh pelayan gema, ia adalah 2,00369 saat.

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

Sekarang dia menerima paket dalam 2.25732 saat. Ini kerana kami hanya menetapkan semula kadar data PointToPointNetDevice daripada lima megabit sesaat kepada nilai lalai, iaitu 32768 bit sesaat. Jika kami menggantikan DataRate baharu menggunakan baris arahan, kami boleh mempercepatkan simulasi kami sekali lagi. Kami akan melakukan ini seperti berikut, mengikut formula yang tersirat oleh elemen bantuan:

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

Ini akan mengembalikan atribut DataRate kepada nilai lalainya iaitu lima megabit sesaat. Adakah anda terkejut dengan hasilnya? Ternyata untuk mengembalikan kelakuan asal skrip, kita juga perlu menetapkan kelewatan saluran agar sepadan dengan kelajuan cahaya. Kami boleh meminta sistem baris arahan untuk mencetak atribut saluran, seperti yang kami lakukan untuk peranti rangkaian:

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

Kami akan mendapati bahawa atribut kelewatan saluran ditetapkan seperti berikut:

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

Kemudian kita boleh, melalui sistem baris arahan, menetapkan kedua-dua nilai lalai ini.

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

dalam kes ini, kami memulihkan masa yang kami ada apabila kami menetapkan DataRate dan Kelewatan dalam skrip secara eksplisit:

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

Ambil perhatian bahawa paket diterima oleh pelayan sekali lagi selepas 2,00369 saat. Kami sebenarnya boleh menetapkan mana-mana atribut yang digunakan dalam skrip dengan cara ini. Khususnya, kami boleh menetapkan atribut MaxPackets kepada nilai bukan satu UdpEchoClient.

Bagaimana anda akan menggunakannya? Mencubanya. Ingat bahawa anda mesti mengulas tempat di mana kami mengatasi nilai atribut lalai dan ditetapkan secara eksplisit MaxPackets dalam skrip. Kemudian anda mesti membina semula skrip. Anda juga boleh menggunakan baris arahan untuk mendapatkan bantuan sintaks untuk menetapkan nilai atribut lalai baharu. Sebaik sahaja anda memahami perkara ini, anda boleh mengawal bilangan pakej yang dipaparkan pada baris arahan. Oleh kerana kami adalah orang yang rajin belajar, baris arahan kami sepatutnya kelihatan seperti ini:

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

Persoalan semula jadi yang timbul pada ketika ini ialah bagaimana untuk mengetahui tentang kewujudan semua sifat ini. Sekali lagi, sistem baris arahan mempunyai fungsi bantuan untuk perkara ini. Jika kita meminta bantuan baris arahan, kita harus melihat:

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

Jika anda memilih hujah "PrintGroups", anda harus melihat senarai semua kumpulan yang didaftarkan JenisId. Nama kumpulan adalah konsisten dengan nama modul dalam direktori sumber (walaupun huruf besar). Mencetak semua maklumat sekaligus akan menjadi terlalu besar, jadi penapis tambahan tersedia untuk mencetak maklumat mengikut kumpulan. Jadi, sekali lagi memfokuskan pada modul point-to-point:

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

Di sini anda boleh menemui nama TypeId yang tersedia untuk carian atribut, contohnya dalam
--PrintAttributes = ns3 :: PointToPointChannelseperti yang ditunjukkan di atas.

Satu lagi cara untuk mengetahui tentang atribut ialah melalui Doxygen ns‑3. Terdapat halaman yang menyenaraikan semua atribut yang didaftarkan dalam simulator.

5.2.2 Menangkap arahan anda sendiri

Anda juga boleh menambah cangkuk anda sendiri melalui sistem baris arahan. Ini dilakukan dengan mudah menggunakan kaedah parser baris arahan Tambah Nilai.
Mari gunakan ciri ini untuk menentukan bilangan pakej yang akan dipaparkan dengan cara yang berbeza sama sekali. Mari tambah pembolehubah tempatan yang dipanggil nPaket menjadi fungsi utama. Kami akan menetapkannya kepada satu untuk memadankan tingkah laku lalai kami yang terdahulu. Untuk membenarkan penghurai baris perintah menukar nilai ini, kita perlu menangkap nilai ini dalam penghurai. Kami melakukan ini dengan menambah panggilan Tambah Nilai. Pergi dan tukar skrip scratch/myfirst.cc jadi untuk bermula dengan kod berikut,

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

Tatal ke bawah ke titik dalam skrip di mana kami menetapkan atribut MaxPackets dan menukarnya supaya ia ditetapkan kepada pembolehubah nPackets dan bukannya pemalar 1, seperti yang ditunjukkan di bawah.

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

Sekarang jika anda menjalankan skrip dan membekalkan hujah -PrintHelp, anda seharusnya melihat hujah pengguna baharu. disenaraikan pada paparan bantuan. masuk,

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

Jika anda ingin menukar bilangan paket yang dihantar, anda boleh melakukannya dengan menetapkan argumen baris arahan - -nPackets.

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

Sekarang anda sepatutnya lihat

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

Anda kini telah menghantar dua pakej. Cukup mudah, bukan?
Anda boleh melihat bahawa sebagai pengguna ns-3, anda boleh menggunakan sistem hujah baris arahan untuk memanipulasi nilai dan atribut global. Jika anda adalah pengarang model, anda boleh menambah atribut baharu pada objek anda dan ia akan tersedia secara automatik untuk konfigurasi oleh pengguna anda melalui sistem baris arahan. Jika anda seorang pengarang skrip, anda boleh menambah pembolehubah baharu pada skrip anda dan palamkannya dengan lancar ke dalam sistem baris arahan anda.

5.3 Menggunakan sistem pengesanan

Keseluruhan titik pemodelan adalah untuk menjana output untuk kajian lanjut, dan sistem jejak ns-3 adalah mekanisme utama untuk ini. Memandangkan ns-3 ialah program C++, cara standard untuk menjana output daripada program C++ boleh digunakan:

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

Anda juga boleh menggunakan modul pengelogan untuk menambah sedikit struktur pada penyelesaian anda. Terdapat banyak masalah yang diketahui disebabkan oleh pendekatan ini, dan oleh itu kami telah menyediakan subsistem pengesanan peristiwa umum untuk menyelesaikan masalah ini.

Matlamat utama sistem pengesanan ns-3 ialah:

  • Untuk tugas asas, sistem pengesanan harus membenarkan pengguna menjana jejak standard untuk sumber popular dan memilih objek yang menjana jejak;

  • Pengguna perantaraan harus dapat melanjutkan sistem pengesanan untuk menukar format output yang dijana atau untuk memasukkan sumber jejak baharu, tanpa mengubah suai teras simulator;

  • Pengguna lanjutan boleh mengubah suai teras simulator untuk menambah sumber surih dan sinki baharu. Sistem pengesanan ns-3 dibina berdasarkan prinsip sumber dan penerima pengesanan bebas, serta mekanisme bersatu untuk menghubungkan sumber kepada pengguna.

Sistem pengesanan ns-3 dibina berdasarkan prinsip sumber dan penerima pengesanan bebas, serta mekanisme bersatu untuk menyambungkan sumber kepada penerima. Sumber surih ialah objek yang boleh menandakan peristiwa yang berlaku dalam simulasi dan menyediakan akses kepada data asas yang diminati. Sebagai contoh, sumber surih boleh menunjukkan apabila peranti rangkaian menerima paket dan menjadikan kandungan paket tersedia kepada penerima surih yang berminat.

Sumber surih sendiri tidak berguna melainkan ia "digandingkan" dengan bahagian lain kod yang sebenarnya melakukan sesuatu yang berguna dengan maklumat yang diberikan oleh sinki. Pengesan ialah pengguna peristiwa dan data yang disediakan oleh sumber surih. Sebagai contoh, anda boleh mencipta sinki surih yang akan (apabila disambungkan kepada sumber surih contoh sebelumnya) mencetak bahagian yang menarik dalam paket yang diterima.

Rasional untuk pengasingan eksplisit ini adalah untuk membolehkan pengguna menyambungkan jenis sinki baharu kepada sumber surih sedia ada tanpa perlu mengedit dan menyusun semula teras simulator. Jadi dalam contoh di atas, pengguna boleh mentakrifkan pengesan baharu dalam skrip mereka dan menyambungkannya kepada sumber jejak sedia ada yang ditakrifkan dalam teras simulasi hanya dengan mengedit skrip pengguna.

Dalam tutorial ini, kami akan meneliti beberapa sumber dan sinki yang dipratentukan dan menunjukkan cara ia boleh dikonfigurasikan dengan usaha yang paling sedikit di pihak pengguna. Lihat bahagian Manual ns-3 atau cara untuk mendapatkan maklumat tentang konfigurasi surih lanjutan, termasuk mengembangkan ruang nama surih dan mencipta sumber surih baharu.

5.3.1 Pengesanan ASCII

ns-3 menyediakan fungsi pembantu yang menyediakan sistem pengesanan peringkat rendah untuk membantu anda dengan butiran semasa menyediakan jejak paket ringkas. Jika anda mendayakan ciri ini, anda akan melihat output dalam fail ASCII. Bagi mereka yang biasa dengan output ns-2, jejak jenis ini serupa dengan keluar.tr, yang dihasilkan oleh banyak skrip.

Mari mulakan perniagaan dan tambahkan beberapa hasil pengesanan ASCII pada skrip scratch/myfirst.cc kami. Sejurus sebelum panggilan Simulator :: Run (), tambah baris kod berikut:
AsciiTraceHelper ascii;

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

Seperti kebanyakan simpulan bahasa ns-3 lain, kod ini menggunakan objek pembantu untuk mencipta jejak ASCII. Baris kedua mengandungi dua panggilan kaedah bersarang. Kaedah "Dalam". CreateFileStream() menggunakan simpulan bahasa objek tanpa nama untuk mencipta objek aliran fail pada tindanan (tanpa nama objek) dan menyerahkannya kepada kaedah yang dipanggil. Kami akan mendalami perkara ini pada masa hadapan, tetapi semua yang anda perlu tahu pada ketika ini ialah anda mencipta objek yang mewakili fail yang dipanggil myfirst.tr dan pindahkannya ke ns-3. Kami mempercayakan ns-3 untuk menjaga objek yang dicipta untuk sepanjang hayatnya, di mana ia menyelesaikan masalah yang disebabkan oleh had (sengaja) yang kurang diketahui yang dikaitkan dengan pembina salinan objek aliran C++.

Panggilan luar EnableAsciiAll() memberitahu pembantu bahawa anda ingin memasukkan pengesanan ASCII dalam simulasi anda untuk semua sambungan peranti titik ke titik dan anda mahu penerima jejak (ditentukan) merekodkan maklumat pergerakan paket dalam format ASCII.

Bagi mereka yang biasa dengan ns-2, peristiwa yang dijejaki adalah bersamaan dengan titik jejak yang diketahui yang merekodkan peristiwa "+", "-", "d" dan "r".
Kini anda boleh membina skrip dan menjalankannya dari baris arahan:

$ ./waf --run scratch/myfirst

Seperti banyak kali sebelum ini, anda akan melihat beberapa mesej daripada Waf, dan kemudian "'bina' selesai dengan jayanya" dengan beberapa mesej daripada program yang sedang berjalan.

Apabila berjalan, program akan mencipta fail bernama myfirst.tr. Oleh kerana sifat kerja Waf, secara lalai fail dibuat bukan dalam direktori tempatan, tetapi dalam direktori peringkat atas repositori. Jika anda ingin menukar laluan tempat jejak disimpan, maka anda boleh menggunakan parameter Waf untuk menentukannya --cwd. Kami belum melakukan ini, jadi untuk melihat fail surih ASCII myfirst.tr dalam editor kegemaran anda, kami perlu menavigasi ke direktori peringkat atas repositori kami.

Menghuraikan jejak ASCII

Terdapat banyak maklumat di sana dalam bentuk yang agak padat, tetapi perkara pertama yang anda perlu perhatikan ialah fail itu terdiri daripada baris individu. Ini akan menjadi jelas kelihatan jika anda mengembangkan tetingkap tontonan dengan lebih luas.

Setiap baris dalam fail sepadan dengan peristiwa surih. Dalam kes ini, kami mengesan peristiwa dalam baris gilir penghantaran yang terdapat dalam setiap peranti rangkaian titik ke titik dalam simulasi. Barisan gilir penghantaran ialah baris gilir di mana setiap paket mesti lulus untuk pautan titik ke titik. Ambil perhatian bahawa setiap baris dalam fail surih bermula dengan satu aksara (dan mempunyai ruang selepasnya). Simbol ini akan mempunyai makna berikut:

+: operasi beratur berlaku pada baris gilir peranti;
-: operasi mendapatkan semula elemen berlaku dalam baris gilir peranti;
d: paket telah digugurkan, biasanya kerana baris gilir penuh;
r: Paket telah diterima oleh peranti rangkaian.

Mari kita lihat lebih dekat pada baris pertama dalam fail surih. Saya akan memecahkannya kepada beberapa bahagian (dengan lekukan untuk kejelasan) dan nombor baris di sebelah kiri:

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)

Bahagian pertama peristiwa jejak lanjutan ini (baris 0) ialah operasi. Kami mempunyai simbol + di sini, yang sepadan dengan operasi beratur untuk penghantaran. Bahagian kedua (baris 1) ialah masa simulasi, dinyatakan dalam saat. Anda mungkin ingat apa yang kami tanya UdpEchoClientApplication mula menghantar paket dalam dua saat. Di sini kita melihat pengesahan bahawa ini memang berlaku.

Bahagian seterusnya contoh surih (dari baris 2) menunjukkan sumber surih yang menjana peristiwa ini (menunjukkan surih ruang nama). Anda boleh memikirkan ruang nama jejak sama seperti ruang nama sistem fail. Punca ruang nama ialah NodeList. Ini sepadan dengan bekas yang diuruskan dalam kod ns-3 utama. Ia mengandungi semua nod yang dicipta dalam skrip. Sama seperti sistem fail boleh mempunyai direktori pada akarnya, NodeList kita boleh mempunyai banyak nod. Jadi baris /NodeList/0 merujuk kepada nod null dalam NodeList, yang biasanya kita anggap sebagai "nod 0". Setiap nod mempunyai senarai peranti yang telah dipasang. Senarai ini terletak di sebelah dalam ruang nama. Anda dapat melihat bahawa peristiwa surih ini berasal dari Senarai Peranti/0, iaitu peranti nol yang dipasang dalam nod.

Subrentetan seterusnya, $ ns3 :: PointToPointNetDevice, memberitahu peranti yang berada pada kedudukan sifar: senarai peranti nod sifar. Ingat bahawa operasi + yang ditemui dalam baris 0 bermakna elemen telah ditambahkan pada baris gilir penghantaran peranti. Ini ditunjukkan dalam segmen terakhir "laluan trek": TxQueue/Enqueue.

Bahagian selebihnya dalam surih harus agak intuitif. Baris 3-4 menunjukkan bahawa paket itu dikapsulkan dalam protokol titik-ke-titik. Baris 5-7 menunjukkan bahawa paket mempunyai pengepala versi IP4 dan berasal dari alamat IP 10.1.1.1 dan bertujuan untuk 10.1.1.2. Baris 8-9 menunjukkan bahawa paket ini mempunyai pengepala UDP dan akhirnya baris 10 menunjukkan bahawa muatan ialah 1024 bait yang dijangkakan.

Baris seterusnya dalam fail surih menunjukkan bahawa paket yang sama telah ditarik dari baris gilir penghantaran pada nod yang sama.

Baris ketiga dalam fail surih menunjukkan bahawa paket telah diterima oleh peranti rangkaian pada hos pelayan gema. Saya telah menghasilkan semula acara di bawah.

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)

Ambil perhatian bahawa operasi surih kini adalah r dan masa simulasi telah ditingkatkan kepada 2,25732 saat. Jika anda mengikuti tutorial dengan teliti, ini bermakna anda meninggalkan Kadar Data dan Kelewatan Pautan peranti rangkaian pada nilai lalainya. Tegang ini sepatutnya biasa, seperti yang anda lihat dalam bahagian sebelumnya.

Entri ruang nama sumber surih (baris 2) telah diubah suai untuk mencerminkan bahawa peristiwa ini berasal dari nod 1 (/NodeList/1) dan paket diterima oleh sumber surih (/MacRx). Ia sepatutnya agak mudah untuk anda mengikuti pergerakan paket melalui topologi dengan melihat jejak yang tinggal dalam fail.

5.3.2 Jejak PCAP

Pembantu Peranti ns-3 juga boleh digunakan untuk mencipta fail surih dalam format .pcap. Akronim pcap (biasanya ditulis dalam huruf kecil) bermaksud tangkapan paket dan sebenarnya merupakan API yang termasuk mentakrifkan format fail .pcap. Program paling popular yang boleh membaca dan memaparkan format ini ialah Wireshark (sebelum ini dipanggil Ethereal). Walau bagaimanapun, terdapat banyak penganalisis jejak trafik yang menggunakan format paket ini. Kami menggalakkan pengguna menggunakan banyak alatan yang tersedia untuk menganalisis jejak pcap. Dalam tutorial ini kita akan menumpukan pada melihat jejak pcap menggunakan tcpdump.

Mendayakan pengesanan pcap dilakukan dengan satu baris kod.

pointToPoint.EnablePcapAll ("myfirst");

Tampal baris kod ini selepas kod surih ASCII yang baru kami tambahkan scratch/myfirst.cc. Ambil perhatian bahawa kami hanya melepasi rentetan "myfirst", bukan "myfirst.pcap" atau apa-apa yang serupa. Ini kerana parameter ialah awalan, bukan nama fail penuh. Semasa simulasi, pembantu sebenarnya akan membuat fail surih untuk setiap peranti titik ke titik. Nama fail akan dibina menggunakan awalan, nombor nod, nombor peranti dan akhiran ".pcap'.

Untuk skrip contoh kami, kami akhirnya akan melihat fail bernama "myfirst-0-0.pcap"Dan"myfirst-1-0.pcap", yang merupakan jejak pcap untuk nod 0-peranti 0 dan nod 1-peranti 0 masing-masing. Sebaik sahaja anda telah menambah baris kod untuk mendayakan pengesanan pcap, anda boleh menjalankan skrip dengan cara biasa:

$ ./waf --run scratch/myfirst

Jika anda melihat dalam direktori peringkat atas pengedaran anda, anda akan melihat tiga fail: fail surih ASCII myfirst.tr, yang kami kaji sebelum ini, fail myfirst-0-0.pcap ΠΈ myfirst-1-0.pcap - fail pcap baharu yang baru kami hasilkan.

Membaca output dengan tcpdump

Buat masa ini, cara paling mudah untuk melihat fail pcap ialah menggunakan 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

Di tempat pembuangan sampah myfirst-0-0.pcap (peranti pelanggan) anda boleh melihat paket gema dihantar selepas 2 saat simulasi. Jika anda melihat tempat pembuangan kedua (myfirst-1-0.pcap), anda akan melihat bahawa paket diterima pada 2,257324 saat. Anda akan melihat dalam pembuangan kedua bahawa paket dikembalikan pada 2.257324 saat, dan akhirnya paket itu diterima semula oleh pelanggan dalam pembuangan pertama pada 2.514648 saat.

Output Membaca dengan Wireshark

Jika anda tidak biasa dengan Wireshark, terdapat tapak web yang anda boleh memuat turun program dan dokumentasi: http://www.wireshark.org/. Wireshark ialah GUI yang boleh digunakan untuk memaparkan fail surih ini. Jika anda mempunyai Wireshark, anda boleh membuka mana-mana fail surih dan memaparkan kandungannya seolah-olah anda telah menangkap paket menggunakan penghidu paket.

Sumber: www.habr.com

Tambah komen