tutorial simulator jaringan ns-3. bagian 4

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

4 Ikhtisar konsep
4.1 Abstraksi kunci
4.1.1 Simpul
4.1.2 Aplikasi
4.1.3 Saluran
4.1.4 Perangkat Bersih
4.1.5 Asisten topologi
4.2 Skrip ns-3 pertama
4.2.1 Kode pelat ketel
4.2.2 Plug-in
4.2.3 ruang nama ns3
4.2.4 Pencatatan
4.2.5 Fungsi utama
4.2.6 Menggunakan asisten topologi
4.2.7 Menggunakan Aplikasi
4.2.8 Simulator
4.2.9 Membangun skrip Anda
4.3 ns-3 Kode sumber

Bab 4

Ikhtisar konsep

Hal pertama yang perlu kita lakukan sebelum mulai mempelajari atau menulis kode ns-3 adalah menjelaskan beberapa konsep dasar dan abstraksi dalam sistem. Sebagian besar dari hal ini mungkin tampak jelas bagi sebagian orang, namun kami menyarankan Anda meluangkan waktu untuk membaca bagian ini untuk memastikan Anda memulai dengan dasar yang kuat.

4.1 Abstraksi kunci

Pada bagian ini, kita akan melihat beberapa istilah yang umum digunakan di web tetapi memiliki arti khusus di ns-3.

4.1.1 Simpul

Dalam jargon Internet, perangkat komputer yang terhubung ke jaringan disebut host atau terkadang sistem akhir. Karena ns-3 adalah simulator jaringan dan bukan simulator Internet, kami sengaja tidak menggunakan istilah host, karena istilah ini berkaitan erat dengan Internet dan protokolnya. Sebaliknya, kami menggunakan istilah yang lebih umum, yang juga digunakan oleh simulator lain, yang berasal dari teori graf: node (simpul).

Di ns-3, abstraksi yang mendasari perangkat komputasi disebut node. Abstraksi ini direpresentasikan dalam C++ oleh kelas Node. Kelas NodeNode (node) menyediakan metode untuk memanipulasi representasi perangkat komputasi dalam simulasi.

Kamu harus mengerti Node seperti komputer yang Anda tambahkan fungsionalitasnya. Anda akan menambahkan hal-hal seperti aplikasi, tumpukan protokol, dan kartu periferal dengan driver yang memungkinkan komputer melakukan pekerjaan yang berguna. Kami menggunakan model dasar yang sama di ns-3.

4.1.2 Aplikasi

Secara umum, perangkat lunak komputer dibagi menjadi dua kelas besar. Perangkat lunak sistem mengatur berbagai sumber daya komputer seperti memori, siklus prosesor, disk, jaringan, dll. Menurut beberapa model komputasi. Perangkat lunak sistem biasanya tidak menggunakan sumber daya ini untuk melakukan tugas-tugas yang secara langsung menguntungkan pengguna. Seorang pengguna biasanya menjalankan aplikasi untuk mencapai tujuan tertentu, yang memperoleh dan menggunakan sumber daya yang dikendalikan oleh perangkat lunak sistem.

Seringkali garis pemisah antara sistem dan perangkat lunak aplikasi ditarik pada perubahan tingkat hak istimewa yang terjadi pada jebakan sistem operasi. ns-3 tidak memiliki konsep nyata tentang sistem operasi dan oleh karena itu tidak ada konsep tingkat hak istimewa atau panggilan sistem. Namun, kami punya ide untuk sebuah aplikasi. Sama seperti aplikasi perangkat lunak β€œdunia nyata” yang dijalankan pada komputer untuk melakukan tugas, aplikasi ns-3 dijalankan pada node ns-3 untuk mengontrol simulasi di dunia simulasi.

Di ns-3, abstraksi dasar untuk program pengguna yang menghasilkan beberapa aktivitas untuk pemodelan adalah sebuah aplikasi. Abstraksi ini direpresentasikan dalam C++ oleh kelas Aplikasi. Kelas Aplikasi menyediakan metode untuk memanipulasi tampilan aplikasi versi tingkat pengguna dalam simulasi. Pengembang diharapkan untuk mengkhususkan kelas Aplikasi dalam pengertian pemrograman berorientasi objek untuk membuat aplikasi baru. Dalam tutorial ini, kita akan menggunakan spesialisasi kelas Aplikasi yang disebut Aplikasi UdpEchoClient ΠΈ Aplikasi UdpEchoServer. Seperti yang Anda duga, aplikasi ini membentuk sekumpulan aplikasi klien/server yang digunakan untuk menghasilkan dan menggemakan paket jaringan.

4.1.3 Saluran

Di dunia nyata, Anda dapat menghubungkan komputer ke jaringan. Seringkali media dimana data ditransmisikan dalam jaringan ini disebut saluran. Saat Anda menyambungkan kabel Ethernet ke stopkontak, Anda menghubungkan komputer Anda ke tautan Ethernet. Dalam dunia simulasi ns-3, sebuah node terhubung ke objek yang mewakili saluran komunikasi. Di sini, abstraksi dasar subjaringan komunikasi disebut saluran dan direpresentasikan dalam C++ oleh kelas Channel.

Kelas SaluranSaluran menyediakan metode untuk mengelola interaksi objek subnet dan menghubungkan node ke objek tersebut. Saluran juga dapat dispesialisasikan oleh pengembang dalam pengertian pemrograman berorientasi objek. Spesialisasi saluran dapat memodelkan sesuatu yang sederhana seperti kabel. Saluran khusus juga dapat memodelkan hal-hal kompleks seperti saklar Ethernet besar atau ruang tiga dimensi yang penuh rintangan dalam kasus jaringan nirkabel.

Kami akan menggunakan versi saluran khusus dalam tutorial ini yang disebut CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel ΠΈ WifiChannelWifiChannel. Saluran Csma, misalnya, memodelkan versi subnet komunikasi yang mengimplementasikan lingkungan komunikasi akses ganda yang dapat dideteksi oleh operator. Ini memberi kita fungsionalitas seperti Ethernet.

4.1.4 Perangkat Bersih

Dulu jika Anda ingin menghubungkan komputer ke jaringan, Anda harus membeli kabel jaringan tertentu dan perangkat keras yang disebut (dalam terminologi PC) kartu periferal yang perlu dipasang di komputer. Jika kartu periferal mengimplementasikan beberapa fungsi jaringan, maka disebut kartu antarmuka jaringan atau kartu jaringan. Saat ini, sebagian besar komputer dilengkapi dengan perangkat keras antarmuka jaringan terintegrasi dan tidak dilihat oleh pengguna sebagai perangkat terpisah.

Kartu jaringan tidak akan berfungsi tanpa driver perangkat lunak yang mengontrol perangkat kerasnya. Di Unix (atau Linux), peralatan periferal diklasifikasikan sebagai perangkat. Perangkat dikelola menggunakan driver perangkat, dan perangkat jaringan (NIC) dikelola menggunakan driver perangkat jaringan (driver perangkat jaringan) dan secara kolektif disebut perangkat jaringan (perangkat bersih). Di Unix dan Linux, Anda merujuk ke perangkat jaringan dengan nama seperti eth0.

Di ns-3, abstraksi perangkat jaringan mencakup driver perangkat lunak dan perangkat keras yang dimodelkan. Dalam simulasi, perangkat jaringan "dipasang" di sebuah node untuk memungkinkannya berkomunikasi dengan node lain melalui saluran. Sama seperti komputer sebenarnya, sebuah node dapat dihubungkan ke banyak saluran melalui beberapa perangkat Perangkat Bersih.

Abstraksi jaringan suatu perangkat direpresentasikan dalam C++ oleh kelas Perangkat Bersih. Kelas Perangkat Bersih menyediakan metode untuk mengelola koneksi ke objek Node dan Saluran; dan dapat dispesialisasikan oleh pengembang dalam arti pemrograman berorientasi objek. Dalam tutorial ini kita akan menggunakan beberapa versi khusus NetDevice yang disebut Perangkat CsmaNet, Perangkat PointToPointNet ΠΈ Perangkat WifiNet. Sama seperti adaptor jaringan Ethernet yang dirancang untuk bekerja dengan jaringan Ethernet, Perangkat CsmaNet dirancang untuk bekerja dengannya Saluran Csma, Perangkat PointToPointNet dirancang untuk bekerja dengannya PointToPointChannelDan Perangkat WifiNet - dirancang untuk digunakan Saluran Wifi.

4.1.5 Asisten topologi

Dalam jaringan nyata, Anda akan menemukan komputer host dengan kartu jaringan yang ditambahkan (atau terintegrasi). Di ns-3 kami akan mengatakan bahwa Anda akan melihat node dengan NetDevices terpasang. Dalam jaringan simulasi yang besar, Anda perlu mengatur koneksi antara banyak objek Node, Perangkat Bersih ΠΈ Saluran.

Sejak menghubungkan NetDevices ke node, NetDevices ke tautan, menetapkan alamat IP, dll. di ns-3 adalah tugas umum, untuk membuatnya semudah mungkin kami menyediakan apa yang disebut pembantu topologi. Misalnya, untuk membuat NetDevice, Anda perlu melakukan banyak operasi kernel ns-3, menambahkan alamat MAC, menginstal perangkat jaringan di Node, mengkonfigurasi tumpukan protokol node, dan kemudian menghubungkan NetDevice ke Saluran. Dibutuhkan lebih banyak pekerjaan untuk menghubungkan beberapa perangkat ke tautan multipoint dan kemudian menghubungkan masing-masing jaringan ke dalam jaringan Internetworks. Kami menyediakan objek pembantu topologi yang menggabungkan banyak operasi ini menjadi model yang mudah digunakan untuk kenyamanan Anda.

4.2 Skrip ns-3 pertama

Jika Anda menginstal sistem seperti yang disarankan di atas, Anda akan memiliki rilis ns-3 di direktori bernama repos di direktori home Anda. Buka direktori melepaskan

Jika Anda tidak memiliki direktori seperti itu, berarti Anda tidak menentukan direktori keluaran saat membuat versi rilis ns-3, buat seperti ini:
$ ./waf konfigurasikan β€”build-profile=release β€”out=build/release,
$ ./waf membangun

di sana Anda akan melihat struktur direktori yang mirip dengan berikut:

AUTHORS       examples      scratch       utils       waf.bat*
bindings      LICENSE       src           utils.py    waf-tools
build         ns3           test.py*      utils.pyc   wscript
CHANGES.html  README        testpy-output VERSION     wutils.py
doc           RELEASE_NOTES testpy.supp   waf*        wutils.pyc

Buka direktori contoh/tutorial. Anda akan melihat file yang terletak di sana bernama pertama.cc. Ini adalah skrip yang akan membuat koneksi point-to-point sederhana antara dua node dan mengirimkan satu paket antar node. Mari kita lihat skrip ini baris demi baris; untuk melakukannya, buka dulu.cc di editor favorit Anda.

4.2.1 Kode pelat ketel
Baris pertama dalam file tersebut adalah baris mode editor emacs. Ini memberi tahu emacs tentang konvensi pemformatan (gaya pengkodean) yang kami gunakan dalam kode sumber kami.

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

Masalah ini selalu menjadi isu kontroversial, jadi kita perlu mencatatnya secara langsung agar masalah ini segera teratasi. Proyek ns-3, seperti kebanyakan proyek besar, telah mengadopsi gaya pengkodean yang harus dipatuhi oleh semua kode yang dikontribusikan. Jika Anda ingin menyumbangkan kode Anda ke proyek, pada akhirnya Anda harus mematuhi standar pengkodean ns-3, seperti yang dijelaskan dalam file doc/codingstd.txt atau ditampilkan di halaman web proyek: https://www.nsnam.org/develop/contributing-code/coding-style/.

Kami menyarankan Anda membiasakan diri dengan tampilan dan nuansa kode ns-3 dan menerapkan standar ini setiap kali Anda bekerja dengan kode kami. Seluruh tim pengembangan dan kontributor menyetujui hal ini setelah beberapa kali mengomel. Baris mode emacs di atas memudahkan pemformatan dengan benar jika Anda menggunakan editor emacs.

Simulator ns-3 dilisensikan menggunakan GNU General Public License. Anda akan melihat header legal GNU yang sesuai di setiap file distribusi ns-3. Seringkali Anda akan melihat pemberitahuan hak cipta untuk salah satu lembaga yang berpartisipasi dalam proyek ns-3 di atas teks GPL dan penulisnya, seperti yang ditunjukkan di bawah ini.

/* 
* This program is free software; you can redistribute it and/or modify 
* it under the terms of the GNU General Public License version 2 as 
* published by the Free Software Foundation; 
*
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
* GNU General Public License for more details. 
* 
* You should have received a copy of the GNU General Public License 
* along with this program; if not, write to the Free Software 
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
*/

4.2.2 Plug-in

Kode itu sendiri dimulai dengan serangkaian pernyataan penyertaan (memasukkan).

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"

Untuk membantu pengguna skrip tingkat tinggi kami mengatasi banyaknya file header yang ada di sistem, kami mengelompokkannya menurut penggunaannya ke dalam modul besar. Kami menyediakan satu file header yang secara rekursif akan memuat semua file header yang digunakan dalam modul tertentu. Daripada harus mencari header apa yang Anda perlukan dan mungkin mendapatkan daftar dependensi yang benar, kami memberi Anda kemampuan untuk mengunduh sekelompok file dengan sangat rinci. Ini bukan pendekatan yang paling efisien, namun tentu saja membuat penulisan skrip jauh lebih mudah.

Masing-masing file penyertaan ns-3 ditempatkan di direktori bernama ns3 (build subdirektori) untuk menghindari konflik nama file selama proses build. Mengajukan ns3/core-modul.h sesuai dengan modul ns-3, yang akan Anda temukan di direktori src/inti dalam rilis yang Anda instal. Dalam daftar direktori ini Anda akan menemukan sejumlah besar file header. Saat Anda melakukan perakitan, Waf menempatkan file header publik di direktori ns3 dalam subdirektori membangun/men-debug

Jika Anda tidak memiliki direktori seperti itu, berarti Anda tidak menentukan direktori keluaran saat membuat versi rilis ns-3, buat seperti ini:
$ ./waf konfigurasikan --build-profile=debug --out=build/debug
$ ./waf membangun
ΠΈΠ»ΠΈ
$ ./waf konfigurasikan --build-profile=dioptimalkan --out=build/dioptimalkan
$ ./waf membangun

ΠΈΠ»ΠΈ membangun/dioptimalkan, bergantung pada konfigurasi Anda. Waf juga akan secara otomatis menghasilkan file penyertaan modul untuk memuat semua file header publik. Karena Anda tentu saja mengikuti panduan ini dengan setia, Anda sudah melakukannya

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

untuk mengonfigurasi proyek agar menjalankan build debug yang menyertakan contoh dan pengujian. Anda juga melakukannya

$ ./waf

untuk merakit proyek. Jadi sekarang ketika Anda melihat di direktori ../../build/debug/ns3, lalu di sana Anda akan menemukan antara lain file header dari keempat modul yang ditunjukkan di atas. Anda dapat melihat isi file-file ini dan menemukan bahwa file-file tersebut menyertakan semua file publik yang digunakan oleh modul terkait.

4.2.3 ruang nama ns3

Baris berikutnya dalam skrip pertama.cc adalah deklarasi namespace.

using namespace ns3;

Proyek ns-3 diimplementasikan dalam namespace C++ yang disebut ns3. Ini mengelompokkan semua deklarasi terkait ns-3 ke dalam cakupan di luar namespace global, yang diharapkan akan membantu integrasi dengan kode lain. Menggunakan operator C++ memperkenalkan namespace ns-3 ke wilayah deklaratif (global) saat ini. Ini adalah cara yang bagus untuk mengatakan bahwa setelah deklarasi ini, Anda tidak perlu mengetikkan operator izin ns3::scope sebelum semua kode ns-3 Anda dapat menggunakannya. Jika Anda tidak terbiasa dengan namespace, lihat hampir semua buku teks C++ dan bandingkan namespace ns3 menggunakan namespace dan deklarasi std using namespace std; dalam contoh bekerja dengan operator keluaran biaya dan sungai.

4.2.4 Pencatatan

Baris skrip berikutnya adalah,

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Kami akan menggunakan pernyataan ini sebagai tempat yang nyaman untuk mendiskusikan sistem dokumentasi kami Doksigen. Jika Anda melihat situs web proyek ns-3, Anda akan menemukan tautan Dokumentasi di bilah navigasi. Jika Anda mengklik tautan ini, Anda akan dibawa ke halaman dokumentasi kami. Ada tautan "Rilis Terbaru" yang akan membawa Anda ke dokumentasi untuk versi stabil terbaru ns-3. Jika Anda memilih link "Dokumentasi API", Anda akan dibawa ke halaman dokumentasi API ns-3.

Di sisi kiri halaman Anda akan menemukan representasi grafis dari struktur dokumentasi. Tempat yang baik untuk memulai adalah "buku" Modul ns-3 di pohon navigasi ns-3. Jika Anda mengungkapkan Modul, Anda akan melihat daftar dokumentasi modul ns-3. Seperti yang sudah dibahas di atas, konsep modul di sini berhubungan langsung dengan file-file yang terdapat pada modul di atas. Subsistem logging ns-3 dibahas di bagian Menggunakan Modul Logging, jadi kita akan membahasnya lagi nanti di tutorial ini, tetapi Anda dapat mempelajari pernyataan di atas dengan melihat modul Corelalu membuka buku itu Alat debuggingdan kemudian memilih halaman Logging. Klik Logging.

Anda sekarang harus meninjau dokumentasinya Doksigen untuk modul Logging. Dalam daftar makro di bagian atas halaman, Anda akan melihat entri untuk NS_LOG_COMPONENT_DEFINE. Sebelum mengklik link tersebut, pastikan untuk melihat β€œDeskripsi Terperinci” modul registrasi untuk memahami cara kerjanya secara umum. Untuk melakukan ini, Anda dapat menggulir ke bawah atau memilih "Lainnya..." di bawah grafik.

Setelah Anda memiliki gambaran umum tentang apa yang terjadi, lanjutkan dan lihat dokumentasi untuk NS_LOG_COMPONENT_DEFINE tertentu. Saya tidak akan menduplikasi dokumentasinya di sini, tetapi untuk meringkas, baris ini mendeklarasikan komponen registrasi yang dipanggil Contoh Skrip Pertama, yang memungkinkan Anda mengaktifkan atau menonaktifkan pencatatan log pesan di konsol dengan mengacu pada sebuah nama.

4.2.5 Fungsi utama

Di baris skrip berikut Anda akan melihat,

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

Ini hanyalah deklarasi fungsi utama program Anda (skrip). Seperti halnya program C++ lainnya, Anda perlu mendefinisikan fungsi utama, ini dijalankan terlebih dahulu. Tidak ada yang istimewa di sini. Skrip ns-3 Anda hanyalah program C++. Baris berikut menetapkan resolusi waktu ke 1 nanodetik, yang merupakan default:

Time::SetResolution (Time::NS);

Resolusi waktu, atau sekadar resolusi, adalah nilai waktu terkecil yang dapat digunakan (perbedaan terkecil yang dapat direpresentasikan antara dua kali). Anda dapat mengubah resolusi tepat satu kali. Mekanisme yang memberikan fleksibilitas ini menghabiskan memori, jadi setelah resolusi ditetapkan secara eksplisit, kami mengosongkan memori, sehingga mencegah pembaruan lebih lanjut. (Jika Anda tidak mengatur resolusi secara eksplisit, resolusi defaultnya adalah satu nanodetik dan memori akan dibebaskan saat simulasi dimulai.)

Dua baris skrip berikut digunakan untuk mengaktifkan dua komponen logging yang dibangun ke dalam aplikasi Klien Gema ΠΈ server gema:

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

Jika Anda membaca dokumentasi untuk komponen Logging, Anda akan melihat bahwa ada beberapa tingkat logging/perincian yang dapat Anda aktifkan pada setiap komponen. Dua baris kode ini mengaktifkan pencatatan debug ke tingkat INFO untuk klien dan server gema. Pada level ini, aplikasi akan mencetak pesan saat mengirim dan menerima paket selama simulasi.

Sekarang kita akan mulai membuat topologi dan menjalankan simulasi. Kami menggunakan objek pembantu topologi untuk membuat pekerjaan ini semudah mungkin.

4.2.6 Menggunakan asisten topologi

Dua baris kode berikutnya dalam skrip kita sebenarnya akan membuat objek Node ns-3 yang akan mewakili komputer dalam simulasi.

NodeContainer nodes;
nodes.Create (2);

Sebelum melanjutkan, mari cari dokumentasi kelasnya Kontainer Node. Cara lain untuk mendapatkan dokumentasi kelas tertentu adalah melalui tab Kelas di halaman Doksigen. Jika Anda sudah membuka Doxygen, cukup gulir ke atas halaman dan pilih tab Kelas. Anda akan melihat sekumpulan tab baru, salah satunya adalah daftar kelas. Di bawah tab ini Anda akan melihat daftar semua kelas ns-3. Gulir ke bawah ke ns3::NodeContainer. Saat Anda menemukan kelas, pilih kelas tersebut untuk membuka dokumentasi kelas tersebut.

Seperti yang kita ingat, salah satu abstraksi utama kita adalah node. Ini mewakili komputer yang akan kita tambahkan hal-hal seperti tumpukan protokol, aplikasi, dan kartu periferal. Asisten topologi Kontainer Node menyediakan cara mudah untuk membuat, mengelola, dan mengakses objek apa pun Node, yang kami buat untuk menjalankan simulasi. Baris pertama di atas hanya menyatakan Kontainer Node, yang kami sebut node. Baris kedua memanggil metode Create pada objek node dan meminta container untuk membuat dua node. Seperti yang dijelaskan dalam Doksigen, kontainer meminta sistem ns-3 untuk membuat dua objek Node dan menyimpan pointer ke objek-objek ini secara internal.

Node yang dibuat dalam skrip belum melakukan apa pun. Langkah selanjutnya dalam membangun topologi adalah menghubungkan node kita ke jaringan. Bentuk jaringan paling sederhana yang kami dukung adalah koneksi point-to-point antara dua node. Kami sekarang akan membuat koneksi seperti itu.

PointToPointHelper

Kami membuat koneksi point-to-point menggunakan pola yang sudah dikenal, menggunakan objek pembantu topologi untuk melakukan pekerjaan tingkat rendah yang diperlukan untuk koneksi. Ingatlah bahwa dua abstraksi utama kita Perangkat Bersih ΠΈ Saluran. Di dunia nyata, istilah-istilah ini secara kasar berhubungan dengan kartu periferal dan kabel jaringan. Biasanya, kedua hal ini terkait erat satu sama lain, dan tidak ada yang dapat mengandalkan berbagi, misalnya perangkat Ethernet melalui saluran nirkabel. Pembantu topologi kami mengikuti hubungan dekat ini dan oleh karena itu Anda akan menggunakan satu objek dalam skenario ini PointToPointHelper untuk mengatur dan menghubungkan objek ns-3 Perangkat PointToPointNet ΠΈ PointToPointChannel. Tiga baris berikutnya dalam skrip:

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

Garis pertama,

PointToPointHelper pointToPoint;

membuat instance objek di tumpukan PointToPointHelper. Dari sudut pandang tingkat atas, baris berikut,

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

menceritakan objeknya PointToPointHelper gunakan nilai "5 Mbit/s" (lima megabit per detik) sebagai "Tarif Data'.

Dari sudut pandang yang lebih spesifik, string "DataRate" berhubungan dengan apa yang kita sebut atribut Perangkat PointToPointNet. Jika Anda melihat Doksigen untuk kelas ns3::PointToPointNetDevice dan dalam dokumentasi untuk metode ini DapatkanTypeId Anda akan menemukan daftar atribut yang ditentukan untuk perangkat. Diantaranya adalah atribut β€œTarif Data" Sebagian besar objek ns-3 yang terlihat pengguna memiliki daftar atribut yang serupa. Kami menggunakan mekanisme ini untuk mengatur simulasi dengan mudah tanpa kompilasi ulang, seperti yang akan Anda lihat di bagian selanjutnya.

Mirip dengan "Tarif Data" di PointToPointNetDevice, Anda akan menemukan atribut "Delay" yang terkait dengan PointToPointChannel. Baris terakhir

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

Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ PointToPointHelper gunakan nilai "2 ms" (dua milidetik) sebagai nilai penundaan propagasi untuk link point-to-point yang selanjutnya dibuat.

Kontainer Perangkat Bersih

Saat ini kami memiliki naskahnya Kontainer Node, yang berisi dua node. Kita punya PointToPointHelper, yang disiapkan untuk membuat objek Perangkat PointToPointNet dan menghubungkannya menggunakan objek PointToPointChannel. Sama seperti kita menggunakan objek pembantu topologi NodeContainer untuk membuat node, kita akan bertanya PointToPointHelper melakukan pekerjaan untuk kami terkait dengan pembuatan, konfigurasi, dan pemasangan perangkat kami. Kita memerlukan daftar semua objek yang dibuat Perangkat Bersih, jadi kami menggunakan Kontainer Perangkat Bersih untuk menyimpannya dengan cara yang sama seperti yang kita gunakan Kontainer Node untuk menyimpan node yang kita buat. Dua baris kode berikutnya,

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

menyelesaikan pengaturan perangkat dan saluran. Baris pertama mendeklarasikan wadah perangkat yang disebutkan di atas, dan baris kedua melakukan pekerjaan utama. metode Install fasilitas PointToPointHelper menerima Kontainer Node sebagai parameter. Di dalam Kontainer Perangkat Bersih untuk setiap node yang terletak di Kontainer Node dibuat (untuk komunikasi point-to-point harus ada dua di antaranya) Perangkat PointToPointNet dibuat dan disimpan dalam wadah perangkat. PointToPointChannel dibuat dan dua melekat padanya Perangkat PointToPointNet. Setelah membuat objek, atribut disimpan di dalamnya PointToPointHelper, digunakan untuk menginisialisasi atribut terkait pada objek yang dibuat.

Setelah menelepon pointToPoint.Instal (node) kita akan memiliki dua node, masing-masing dengan perangkat jaringan point-to-point terpasang dan satu link point-to-point di antara keduanya. Kedua perangkat akan dikonfigurasi untuk mengirimkan data dengan kecepatan lima megabit per detik dengan penundaan transmisi dua milidetik melalui saluran tersebut.

InternetStackHelper

Kami sekarang memiliki node dan perangkat yang dikonfigurasi, tetapi node kami tidak memiliki tumpukan protokol yang terpasang. Dua baris kode berikutnya akan menangani hal ini.

InternetStackHelper stack;
stack.Install (nodes);

InternetStackHelper - adalah pembantu topologi untuk tumpukan Internet, mirip dengan PointToPointHelper untuk perangkat jaringan point-to-point. metode Install menggunakan NodeContainer sebagai parameter. Ketika dijalankan, ini akan menginstal tumpukan Internet (TCP, UDP, IP, dll.) pada setiap node kontainer.

IPv4AddressHelper

Kemudian kita perlu mengaitkan perangkat kita dengan alamat IP. Kami menyediakan asisten topologi untuk mengelola alokasi alamat IP. Satu-satunya API yang terlihat oleh pengguna adalah mengatur alamat IP dasar dan netmask yang akan digunakan ketika melakukan distribusi alamat sebenarnya (ini dilakukan pada tingkat yang lebih rendah dalam helper). Dua baris kode berikutnya dalam skrip contoh kita pertama.cc,

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

deklarasikan objek pembantu alamat dan beri tahu objek tersebut bahwa objek tersebut harus mulai mengalokasikan alamat IP dari jaringan 10.1.1.0, menggunakan bitmask 255.255.255.0 untuk menentukannya. Secara default, alamat yang dialokasikan akan dimulai dari satu dan meningkat secara monoton, sehingga alamat pertama yang dialokasikan dari basis ini adalah 10.1.1.1, lalu 10.1.1.2, dst. Pada kenyataannya, pada tingkat rendah, sistem ns-3 mengingat semua alamat IP yang dialokasikan dan menghasilkan kesalahan fatal jika Anda secara tidak sengaja membuat situasi di mana alamat yang sama dihasilkan dua kali (omong-omong, kesalahan ini sulit untuk di-debug).

Baris kode berikut,

Ipv4InterfaceContainer interfaces = address.Assign (devices);

melakukan penugasan alamat sebenarnya. Di ns-3 kami membuat koneksi antara alamat IP dan perangkat menggunakan objek IPv4Interface. Sama seperti terkadang kita memerlukan daftar perangkat jaringan yang dibuat oleh asisten untuk digunakan nanti, terkadang kita memerlukan daftar objek IPv4Interface. IPv4InterfaceContainer menyediakan fungsionalitas ini.

Kami membangun jaringan point-to-point, dengan tumpukan terpasang dan alamat IP ditetapkan. Sekarang kita membutuhkan aplikasi di setiap node untuk menghasilkan lalu lintas.

4.2.7 Menggunakan Aplikasi

Abstraksi utama lainnya dari sistem ns-3 adalah Aplikasi (aplikasi). Dalam skenario ini kami menggunakan dua spesialisasi kelas dasar Aplikasi ns-3 dipanggil Aplikasi UdpEchoServer ΠΈ Aplikasi UdpEchoClient. Seperti dalam kasus sebelumnya, kami menggunakan objek tambahan untuk mengonfigurasi dan mengelola objek dasar. Di sini kami menggunakan UdpEchoServerHelper ΠΈ UdpEchoClientBantuanr objek untuk membuat hidup kita lebih mudah.

UdpEchoServerHelper

Baris kode berikut dalam contoh skrip first.cc kami digunakan untuk mengkonfigurasi aplikasi server gema UDP pada salah satu node yang kami buat sebelumnya.

UdpEchoServerHelper echoServer (9);

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

Baris kode pertama dalam cuplikan di atas dibuat UdpEchoServerHelper. Seperti biasa, ini bukanlah aplikasi itu sendiri, ini adalah objek yang membantu kita membuat aplikasi nyata. Salah satu konvensi kami adalah meneruskan atribut yang diperlukan ke konstruktor objek pembantu. Dalam hal ini, helper tidak dapat melakukan apapun yang berguna kecuali ia diberikan nomor port dimana server akan mendengarkan paket, nomor ini juga harus diketahui oleh klien. Dalam hal ini, kami meneruskan nomor port ke konstruktor pembantu. Konstruktor, pada gilirannya, melakukannya begitu saja Setel Atribut dengan nilai yang dilewati. Nanti, jika diinginkan, Anda dapat menggunakan SetAttribute untuk menetapkan nilai berbeda untuk atribut Port.

Seperti banyak objek bantu lainnya, objek UdpEchoServerHelper memiliki metode Install. Menjalankan metode ini secara efektif membuat aplikasi server gema dasar dan mengikatnya ke host. Menariknya, metodenya Install menerima NodeContainer sebagai parameter sama seperti yang lainnya Install metode yang telah kita lihat.

Konversi implisit C++ yang berfungsi di sini mengambil hasil dari metode ini simpul.Dapatkan(1) (yang mengembalikan penunjuk cerdas ke objek simpul - Ptr ) dan menggunakannya di konstruktor untuk objek anonim Kontainer Nodeyang kemudian diteruskan ke metode Install. Jika Anda tidak dapat menentukan dalam kode C++ tanda tangan metode mana yang dikompilasi dan dieksekusi, lihat di antara konversi implisit.

Sekarang kita melihatnya echoServer.Instal hendak menginstal aplikasi Aplikasi UdpEchoServer pada ditemukan di Kontainer Nodeyang kita gunakan untuk mengelola node kita, node dengan indeks 1. Metode Install akan mengembalikan wadah yang berisi petunjuk ke semua aplikasi (dalam hal ini, karena kami meneruskan anonim Kontainer Node, berisi satu node) yang dibuat oleh helper.

Aplikasi perlu menentukan kapan mulai menghasilkan lalu lintas "awal" dan mungkin perlu menentukan waktu tambahan untuk menghentikannya "berhenti". Kami menyediakan kedua opsi tersebut. Waktu-waktu ini diatur menggunakan metode Wadah Aplikasi Start ΠΈ berhenti. Metode ini menerima parameter tipe Waktu. Dalam hal ini kami menggunakan urutan eksplisit konversi C++ untuk mengambil C++ dua kali lipat 1.0 dan mengubahnya menjadi objek Waktu tns-3 yang menggunakan objek Detik untuk mengubahnya menjadi detik. Ingatlah bahwa aturan konversi dapat dikontrol oleh pembuat model, dan C++ memiliki aturannya sendiri, jadi Anda tidak dapat selalu mengandalkan parameter yang dikonversi sesuai harapan Anda. Dua baris

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

akan menyebabkan aplikasi server gema memulai (hidup secara otomatis) satu detik setelah simulasi dimulai dan berhenti (mati) setelah sepuluh detik simulasi. Karena kami mendeklarasikan peristiwa simulasi (acara penghentian aplikasi), yang akan dieksekusi dalam sepuluh detik, setidaknya sepuluh detik operasi jaringan akan disimulasikan.

UdpEchoClientHelper

Aplikasi klien gema dikonfigurasi dengan cara yang hampir mirip dengan server. Ada objek dasar Aplikasi UdpEchoClient, yang dikelola
UdpEchoClientHelper.

UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));;

Namun, untuk klien gema kita perlu menyetel lima atribut berbeda. Dua atribut pertama ditetapkan pada waktu pembuatan UdpEchoClientHelper. Kami meneruskan parameter yang digunakan (di dalam helper) untuk mengatur atribut "Alamat Jarak Jauh" ΠΈ "Pelabuhan Jarak Jauh" sesuai dengan kesepakatan kami untuk meneruskan parameter yang diperlukan ke konstruktor pembantu.

Mari kita ingat apa yang kita gunakan IPv4InterfaceContainer untuk melacak alamat IP yang telah kami tetapkan untuk perangkat kami. Antarmuka null dalam wadah antarmuka akan sesuai dengan alamat IP node nol dalam wadah node. Antarmuka pertama dalam wadah antarmuka sesuai dengan alamat IP node pertama dalam wadah node. Jadi, pada baris kode pertama (di atas), kita membuat helper dan memberitahukannya bahwa alamat jarak jauh klien akan menjadi alamat IP yang ditetapkan ke host tempat server berada. Kami juga mengatakan bahwa kami perlu mengatur agar paket dikirim ke port sembilan.

Atribut "MaxPackets" memberi tahu klien jumlah maksimum paket yang dapat kami kirim selama simulasi. Atribut "Interval" memberi tahu klien berapa lama waktu menunggu antar paket, dan atribut "PacketSize" memberi tahu klien seberapa besar muatan paket yang seharusnya. Dengan kombinasi atribut ini kami memberitahu klien untuk mengirim satu paket 1024-byte.

Seperti halnya server gema, kami mengatur atribut klien gema Start ΠΈ berhenti, tapi di sini kita memulai klien sedetik setelah server dihidupkan (dua detik setelah dimulainya simulasi).

4.2.8 Simulator

Pada titik ini kita perlu menjalankan simulasi. Ini dilakukan dengan menggunakan fungsi global Simulator::Lari.

Simulator::Run ();

Ketika kita sebelumnya memanggil metode,

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

kami sebenarnya menjadwalkan acara di simulator pada 1,0 detik, 2,0 detik, dan dua acara pada 10,0 detik. Setelah panggilan Simulator::Lari, sistem akan mulai melihat daftar acara yang dijadwalkan dan menjalankannya. Ini pertama-tama akan memicu suatu peristiwa setelah 1,0 detik, yang akan memicu aplikasi server gema (peristiwa ini pada gilirannya dapat menjadwalkan banyak peristiwa lainnya). Kemudian akan memicu acara yang dijadwalkan pada t=2,0 detik yang akan meluncurkan aplikasi klien gema. Sekali lagi, acara ini mungkin memiliki lebih banyak acara yang direncanakan. Implementasi start event pada echo client akan memulai tahap simulasi transfer data dengan mengirimkan paket ke server.

Tindakan pengiriman paket ke server akan memicu rangkaian peristiwa yang akan dijadwalkan secara otomatis di belakang layar dan yang akan mengimplementasikan mekanisme pengiriman paket gema sesuai dengan parameter waktu yang telah kita tetapkan dalam skrip.

Akibatnya, karena kita hanya mengirimkan satu paket (ingat, atributnya Paket Max disetel ke satu), rangkaian peristiwa yang dimulai oleh ping klien tunggal ini akan berakhir dan simulasi akan masuk ke mode siaga. Setelah ini terjadi, sisa acara yang dijadwalkan akan menjadi acara berhenti untuk server dan klien. Ketika peristiwa ini dijalankan, tidak akan ada lagi peristiwa yang tersisa untuk diproses lebih lanjut dan Simulator::Lari akan mengembalikan kendali. Simulasi selesai.

Yang tersisa hanyalah membersihkan diri Anda sendiri. Hal ini dilakukan dengan memanggil fungsi global Simulator::Hancurkan. Karena fungsi pembantu (atau kode ns-3 tingkat rendah) dipanggil, yang diatur sedemikian rupa sehingga kait dimasukkan ke dalam simulator untuk menghancurkan semua objek yang dibuat. Anda tidak perlu melacak sendiri objek-objek ini - yang perlu Anda lakukan hanyalah menelepon Simulator::Hancurkan dan keluar. Sistem ns-3 akan melakukan kerja keras ini untuk Anda. Baris yang tersisa dari skrip ns-3 pertama kita, first.cc, lakukan hal itu:

Simulator::Destroy ();
return 0;
}

Kapan simulator akan berhenti?

ns-3 adalah simulator peristiwa diskrit (DE). Dalam simulator seperti itu, setiap peristiwa dikaitkan dengan waktu eksekusinya, dan simulasi dilanjutkan dengan memproses peristiwa sesuai urutan kejadiannya seiring berjalannya simulasi. Peristiwa dapat menyebabkan peristiwa di masa depan dijadwalkan (misalnya, pengatur waktu dapat menjadwal ulang dirinya sendiri untuk menyelesaikan penghitungan pada interval berikutnya).

Peristiwa awal biasanya dimulai oleh entitas, misalnya IPv6 akan menjadwalkan penemuan layanan di jaringan, permintaan tetangga, dll. Aplikasi menjadwalkan acara pengiriman paket pertama, dan seterusnya. Saat suatu peristiwa diproses, peristiwa tersebut dapat menghasilkan nol, satu, atau lebih peristiwa. Seiring berjalannya simulasi, terjadilah peristiwa-peristiwa, baik berakhir atau terciptanya peristiwa baru. Simulasi akan berhenti secara otomatis jika antrian event kosong atau event khusus terdeteksi berhenti. Peristiwa berhenti dihasilkan oleh fungsi tersebut Simulator::Berhenti (Hentikan waktu).

Ada kasus umum di mana Simulator::Stop mutlak diperlukan untuk menghentikan simulasi: ketika ada kejadian yang bersifat mandiri. Peristiwa yang berlangsung sendiri (atau berulang) adalah peristiwa yang selalu dijadwal ulang. Alhasil, mereka selalu menjaga antrian acara agar tidak kosong. Ada banyak protokol dan modul yang berisi kejadian berulang, misalnya:

β€’ FlowMonitor - memeriksa paket yang hilang secara berkala;

β€’ RIPng – siaran periodik update tabel routing;

β€’ dll.

Dalam beberapa kasus Simulator::Berhenti diperlukan untuk menghentikan simulasi dengan benar. Selain itu, ketika ns-3 berada dalam mode emulasi, RealtimeSimulator digunakan untuk menyinkronkan jam simulasi dengan jam mesin, dan Simulator::Berhenti diperlukan untuk menghentikan proses tersebut.

Banyak program simulasi di buku teks tidak menyebutkan nama Simulator::Berhenti secara eksplisit, karena mereka berakhir secara otomatis ketika peristiwa yang diantrekan habis. Namun, program ini juga akan menerima panggilan Simulator::Stop. Misalnya, pernyataan tambahan berikut pada contoh program pertama akan menjadwalkan perhentian eksplisit pada 11 detik:

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

Hal di atas sebenarnya tidak akan mengubah perilaku program ini, karena simulasi khusus ini secara alami berakhir setelah 10 detik. Namun jika Anda mengubah waktu berhenti pada pernyataan di atas dari 11 detik menjadi 1 detik, Anda akan melihat bahwa simulasi berhenti sebelum keluaran apa pun muncul di layar (karena keluaran terjadi setelah sekitar 2 detik waktu simulasi).

Penting untuk memanggil Simulator::Stop sebelum memanggil Simulator::Run; jika tidak, Simulator::Run mungkin tidak akan pernah mengembalikan kendali ke program utama untuk mengeksekusi penghentian!

4.2.9 Membangun skrip Anda

Kami telah membuat pembuatan skrip sederhana Anda menjadi hal yang sepele. Yang harus Anda lakukan adalah meletakkan skrip Anda di direktori awal dan skrip itu akan dibuat secara otomatis jika Anda menjalankannya Waf. Mari mencoba. Kembali ke direktori tingkat atas dan salin contoh/tutorial/pertama.cc ke katalog menggaruk

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

Sekarang buat skrip sampel pertama Anda menggunakan WAF:

$ ./waf

Anda akan melihat pesan yang menunjukkan bahwa contoh pertama Anda berhasil dibuat.

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
[614/708] cxx: scratch/myfirst.cc -> build/debug/scratch/myfirst_3.o
[706/708] cxx_link: build/debug/scratch/myfirst_3.o -> build/debug/scratch/myfirst
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (2.357s)

Sekarang Anda dapat menjalankan contohnya (perhatikan bahwa jika Anda membangun program Anda di direktori awal, maka Anda harus menjalankannya dari menggaruk):

$ ./waf --run scratch/myfirst

Anda akan melihat keluaran serupa:

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.418s) Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
Received 1024 bytes from 10.1.1.2

Di sini Anda dapat melihat bahwa sistem pembangunan memverifikasi bahwa file telah dibuat dan kemudian menjalankannya. Anda melihat entri komponen pada klien gema menunjukkan bahwa ia mengirim paket 1024-byte tunggal ke server gema 10.1.1.2. Anda juga melihat komponen logging di server gema yang mengatakan bahwa ia menerima 1024 byte dari 10.1.1.1. Server gema secara diam-diam memutar ulang paket tersebut dan Anda dapat melihat di log klien gema bahwa ia menerima paketnya kembali dari server.

4.3 ns-3 Kode sumber

Sekarang setelah Anda menggunakan beberapa pembantu ns-3, Anda dapat melihat beberapa kode sumber yang mengimplementasikan fungsi ini. Kode terbaru dapat dilihat di web server kami pada link berikut: https://gitlab.com/nsnam/ns-3-dev.git. Di sana Anda akan melihat halaman ringkasan Mercurial untuk pohon pengembangan ns-3 kami. Di bagian atas halaman Anda akan melihat beberapa tautan,

summary | shortlog | changelog | graph | tags | files

Silakan dan pilih tautan file. Seperti inilah tampilan tingkat teratas dari sebagian besar repositori kami:

drwxr-xr-x                               [up]
drwxr-xr-x                               bindings python  files
drwxr-xr-x                               doc              files
drwxr-xr-x                               examples         files
drwxr-xr-x                               ns3              files
drwxr-xr-x                               scratch          files
drwxr-xr-x                               src              files
drwxr-xr-x                               utils            files
-rw-r--r-- 2009-07-01 12:47 +0200 560    .hgignore        file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 1886   .hgtags          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 1276   AUTHORS          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 30961  CHANGES.html     file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 17987  LICENSE          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 3742   README           file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 16171  RELEASE_NOTES    file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 6      VERSION          file | revisions | annotate
-rwxr-xr-x 2009-07-01 12:47 +0200 88110  waf              file | revisions | annotate
-rwxr-xr-x 2009-07-01 12:47 +0200 28     waf.bat          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 35395  wscript          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 7673   wutils.py        file | revisions | annotate

Contoh skrip kami ada di direktori contoh. Jika Anda mengklik contohnya, Anda akan melihat daftar subdirektori. Salah satu file di subdirektori tutorial - pertama.cc. Jika Anda mengklik pertama.cc Anda akan melihat kode yang baru saja Anda pelajari.

Kode sumber sebagian besar terletak di direktori src. Anda dapat melihat kode sumber dengan mengklik nama direktori atau mengklik link file di sebelah kanan nama direktori. Jika Anda mengklik direktori src, Anda akan mendapatkan daftar subdirektori src. Jika Anda mengklik subdirektori inti, Anda akan menemukan daftar file. File pertama yang akan Anda lihat (pada saat penulisan panduan ini) adalah batalkan.h. Jika Anda mengklik tautannya batalkan.h, Anda akan dikirim ke file sumber untuk batalkan.h, yang berisi makro yang berguna untuk keluar dari skrip jika kondisi abnormal terdeteksi. Kode sumber untuk pembantu yang kita gunakan dalam bab ini dapat ditemukan di direktori src/Aplikasi/helper. Jangan ragu untuk melihat-lihat pohon direktori untuk mencari tahu di mana dan memahami gaya program ns-3.

Sumber: www.habr.com

Tambah komentar