Εκμάθηση προσομοιωτή δικτύου ns-3. κεφάλαιο 4

Εκμάθηση προσομοιωτή δικτύου ns-3. κεφάλαιο 4
κεφάλαιο 1,2
Κεφάλαιο 3

4 Επισκόπηση έννοιας
4.1 Βασικές αφαιρέσεις
4.1.1 Κόμβος
4.1.2 Εφαρμογή
4.1.3 Κανάλι
4.1.4 Net Device
4.1.5 Τοπολογικοί βοηθοί
4.2 Πρώτη δέσμη ενεργειών ns-3
4.2.1 Κωδικός λέβητα
4.2.2 Πρόσθετα
4.2.3 Χώρος ονομάτων ns3
4.2.4 Καταγραφή
4.2.5 Κύρια λειτουργία
4.2.6 Χρήση βοηθών τοπολογίας
4.2.7 Χρήση της εφαρμογής
4.2.8 Προσομοιωτής
4.2.9 Δημιουργία του σεναρίου σας
4.3 ns-3 Πηγαίος κώδικας

Κεφάλαιο 4

Επισκόπηση έννοιας

Το πρώτο πράγμα που πρέπει να κάνουμε πριν αρχίσουμε να μαθαίνουμε ή να γράφουμε κώδικα ns-3 είναι να εξηγήσουμε μερικές βασικές έννοιες και αφαιρέσεις στο σύστημα. Πολλά από αυτά μπορεί να φαίνονται προφανή σε μερικούς, αλλά συνιστούμε να αφιερώσετε χρόνο για να διαβάσετε αυτήν την ενότητα για να βεβαιωθείτε ότι ξεκινάτε με γερές βάσεις.

4.1 Βασικές αφαιρέσεις

Σε αυτήν την ενότητα, θα εξετάσουμε ορισμένους όρους που χρησιμοποιούνται συνήθως στον Ιστό, αλλά έχουν συγκεκριμένη σημασία στο ns-3.

4.1.1 Κόμβος

Στην ορολογία του Διαδικτύου, μια συσκευή υπολογιστή που συνδέεται σε ένα δίκτυο ονομάζεται κεντρικός υπολογιστής ή μερικές φορές τελικό σύστημα. Επειδή το ns-3 είναι προσομοιωτής δικτύου και όχι προσομοιωτής Διαδικτύου, σκόπιμα δεν χρησιμοποιούμε τον όρο κεντρικός υπολογιστής, καθώς αυτός σχετίζεται στενά με το Διαδίκτυο και τα πρωτόκολλά του. Αντίθετα, χρησιμοποιούμε έναν πιο γενικό όρο, που χρησιμοποιείται επίσης από άλλους προσομοιωτές, ο οποίος προέρχεται από τη θεωρία γραφημάτων: κόμβος (κόμβος).

Στο ns-3, η υποκείμενη αφαίρεση μιας υπολογιστικής συσκευής ονομάζεται κόμβος. Αυτή η αφαίρεση αντιπροσωπεύεται στη C++ από την κλάση Node. Τάξη NodeNode (κόμβος) παρέχει μεθόδους χειρισμού αναπαραστάσεων υπολογιστικών συσκευών σε προσομοιώσεις.

Πρέπει να καταλάβετε Κόμβος όπως ένας υπολογιστής στον οποίο προσθέτετε λειτουργικότητα. Θα προσθέσετε πράγματα όπως εφαρμογές, στοίβες πρωτοκόλλων και κάρτες περιφερειακών με προγράμματα οδήγησης που επιτρέπουν στον υπολογιστή να κάνει χρήσιμη εργασία. Χρησιμοποιούμε το ίδιο βασικό μοντέλο στο ns-3.

4.1.2 Εφαρμογή

Γενικά, το λογισμικό υπολογιστών χωρίζεται σε δύο μεγάλες κατηγορίες. Το λογισμικό συστήματος οργανώνει διάφορους πόρους υπολογιστή, όπως μνήμη, κύκλους επεξεργαστή, δίσκο, δίκτυο κ.λπ. σύμφωνα με κάποιο υπολογιστικό μοντέλο. Το λογισμικό συστήματος συνήθως δεν χρησιμοποιεί αυτούς τους πόρους για την εκτέλεση εργασιών που ωφελούν άμεσα τον χρήστη. Ένας χρήστης συνήθως εκτελεί μια εφαρμογή για την επίτευξη ενός συγκεκριμένου στόχου, ο οποίος αποκτά και χρησιμοποιεί πόρους που ελέγχονται από το λογισμικό του συστήματος.

Συχνά, η γραμμή διαχωρισμού μεταξύ του λογισμικού συστήματος και της εφαρμογής σχεδιάζεται σε αλλαγές επιπέδου προνομίων που συμβαίνουν στις παγίδες του λειτουργικού συστήματος. Το ns-3 δεν έχει πραγματική έννοια λειτουργικού συστήματος και επομένως δεν έχει έννοια επιπέδων προνομίων ή κλήσεων συστήματος. Ωστόσο, έχουμε μια ιδέα για μια εφαρμογή. Ακριβώς όπως στον «πραγματικό κόσμο» οι εφαρμογές λογισμικού τρέχουν σε υπολογιστές για την εκτέλεση εργασιών, οι εφαρμογές ns-3 εκτελούνται σε κόμβους ns-3 για τον έλεγχο προσομοιώσεων στον προσομοιωμένο κόσμο.

Στο ns-3, η βασική αφαίρεση για ένα πρόγραμμα χρήστη που δημιουργεί κάποια δραστηριότητα για μοντελοποίηση είναι μια εφαρμογή. Αυτή η αφαίρεση αντιπροσωπεύεται στη C++ από την κλάση Application. Η κλάση Application παρέχει μεθόδους για τον χειρισμό προβολών της έκδοσης εφαρμογών σε επίπεδο χρήστη σε προσομοιώσεις. Οι προγραμματιστές αναμένεται να εξειδικεύσουν την κλάση Application σε αντικειμενοστραφή προγραμματισμό για τη δημιουργία νέων εφαρμογών. Σε αυτό το σεμινάριο, θα χρησιμοποιήσουμε εξειδικεύσεις της κλάσης Εφαρμογές που ονομάζεται Εφαρμογή UdpEchoClient и Εφαρμογή UdpEchoServer. Όπως θα περίμενε κανείς, αυτές οι εφαρμογές συνθέτουν ένα σύνολο εφαρμογών πελάτη/διακομιστή που χρησιμοποιούνται για τη δημιουργία και την απήχηση πακέτων δικτύου.

4.1.3 Κανάλι

Στον πραγματικό κόσμο, μπορείτε να συνδέσετε έναν υπολογιστή σε ένα δίκτυο. Συχνά τα μέσα μέσω των οποίων μεταδίδονται δεδομένα σε αυτά τα δίκτυα ονομάζονται κανάλια. Όταν συνδέετε ένα καλώδιο Ethernet σε μια πρίζα τοίχου, συνδέετε τον υπολογιστή σας σε μια σύνδεση Ethernet. Στον προσομοιωμένο κόσμο ns-3, ένας κόμβος συνδέεται με ένα αντικείμενο που αντιπροσωπεύει ένα κανάλι επικοινωνίας. Εδώ, η βασική αφαίρεση του υποδικτύου επικοινωνίας ονομάζεται κανάλι και αναπαρίσταται σε C++ από την κλάση Channel.

Κατηγορία ChannelChannel παρέχει μεθόδους για τη διαχείριση της αλληλεπίδρασης των αντικειμένων υποδικτύου και τη σύνδεση κεντρικών υπολογιστών σε αυτά. Τα κανάλια μπορούν επίσης να εξειδικεύονται από προγραμματιστές με την έννοια του αντικειμενοστρεφούς προγραμματισμού. Η εξειδίκευση του καναλιού μπορεί να μοντελοποιήσει κάτι τόσο απλό όσο ένα καλώδιο. Ένα αποκλειστικό κανάλι μπορεί επίσης να μοντελοποιήσει πολύπλοκα πράγματα όπως ένας μεγάλος διακόπτης Ethernet ή ένας τρισδιάστατος χώρος γεμάτος εμπόδια στην περίπτωση ασύρματων δικτύων.

Θα χρησιμοποιήσουμε εξειδικευμένες εκδόσεις του καναλιού σε αυτόν τον οδηγό που ονομάζεται CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel и WifiChannelWifiChannel. CsmaChannel, για παράδειγμα, μοντελοποιεί μια έκδοση ενός υποδικτύου επικοινωνιών που υλοποιεί ένα περιβάλλον επικοινωνίας πολλαπλής πρόσβασης με αίσθηση φορέα. Αυτό μας δίνει λειτουργικότητα παρόμοια με το Ethernet.

4.1.4 Net Device

Παλαιότερα, εάν θέλατε να συνδέσετε έναν υπολογιστή σε ένα δίκτυο, έπρεπε να αγοράσετε ένα συγκεκριμένο καλώδιο δικτύου και μια συσκευή υλικού που ονομάζεται (στην ορολογία του υπολογιστή) μια περιφερειακή κάρτα που έπρεπε να εγκατασταθεί στον υπολογιστή. Εάν μια περιφερειακή κάρτα υλοποιούσε ορισμένες λειτουργίες δικτύωσης, ονομάζονταν κάρτες διασύνδεσης δικτύου ή κάρτες δικτύου. Σήμερα, οι περισσότεροι υπολογιστές διαθέτουν ενσωματωμένο υλικό διεπαφής δικτύου και δεν θεωρούνται από τους χρήστες ως ξεχωριστές συσκευές.

Μια κάρτα δικτύου δεν θα λειτουργήσει χωρίς πρόγραμμα οδήγησης λογισμικού που ελέγχει το υλικό της. Στο Unix (ή Linux), ένα κομμάτι περιφερειακού εξοπλισμού ταξινομείται ως συσκευή. Η διαχείριση των συσκευών γίνεται με χρήση προγραμμάτων οδήγησης συσκευών και η διαχείριση των συσκευών δικτύου (NIC) με τη χρήση προγραμμάτων οδήγησης συσκευών δικτύου (προγράμματα οδήγησης συσκευών δικτύου) και ονομάζονται συλλογικά συσκευές δικτύου (συσκευές δικτύου). Στο Unix και στο Linux, αναφέρεστε σε συσκευές δικτύου με ονόματα όπως eth0.

Στο ns-3, η αφαίρεση συσκευών δικτύου καλύπτει τόσο το πρόγραμμα οδήγησης λογισμικού όσο και το υλικό που μοντελοποιείται. Στην προσομοίωση, μια συσκευή δικτύου είναι «εγκατεστημένη» σε έναν κόμβο για να του επιτρέψει να επικοινωνεί με άλλους κόμβους μέσω καναλιών. Ακριβώς όπως ένας πραγματικός υπολογιστής, ένας κόμβος μπορεί να συνδεθεί σε πολλά κανάλια μέσω πολλαπλών συσκευών NetDevices.

Η αφαίρεση δικτύου μιας συσκευής αναπαρίσταται σε C++ από την κλάση NetDevice. Τάξη NetDevice παρέχει μεθόδους για τη διαχείριση των συνδέσεων σε αντικείμενα Node και Channel. και μπορεί να εξειδικεύεται από προγραμματιστές με την έννοια του αντικειμενοστρεφούς προγραμματισμού. Σε αυτό το σεμινάριο θα χρησιμοποιήσουμε αρκετές εξειδικευμένες εκδόσεις του NetDevice που ονομάζονται CsmaNetDevice, Συσκευή PointToPointNet и Συσκευή WifiNet. Ακριβώς όπως ένας προσαρμογέας δικτύου Ethernet έχει σχεδιαστεί για να λειτουργεί με ένα δίκτυο Ethernet, CsmaNetDevice σχεδιασμένο να λειτουργεί με CsmaChannel, Συσκευή PointToPointNet σχεδιασμένο να λειτουργεί με PointToPointChannelΚαι Συσκευή WifiNet - σχεδιασμένο για να λειτουργεί με WifiChannel.

4.1.5 Τοπολογικοί βοηθοί

Σε ένα πραγματικό δίκτυο, θα βρείτε κεντρικούς υπολογιστές με προστιθέμενες (ή ενσωματωμένες) κάρτες δικτύου. Στο ns-3 θα λέγαμε ότι θα δείτε κόμβους με συνδεδεμένα NetDevices. Σε ένα μεγάλο προσομοιωμένο δίκτυο, θα χρειαστεί να οργανώσετε συνδέσεις μεταξύ πολλών αντικειμένων Κόμβος, NetDevice и Κανάλι.

Από τη σύνδεση NetDevices σε κόμβους, NetDevices σε συνδέσμους, εκχώρηση διευθύνσεων IP κ.λπ. στο ns-3 είναι μια κοινή εργασία, για να το κάνουμε όσο πιο εύκολο γίνεται, παρέχουμε τους λεγόμενους βοηθούς τοπολογίας. Για παράδειγμα, για να δημιουργήσετε ένα NetDevice, πρέπει να εκτελέσετε πολλές λειτουργίες πυρήνα ns-3, να προσθέσετε μια διεύθυνση MAC, να εγκαταστήσετε τη συσκευή δικτύου στο Node, να διαμορφώσετε τη στοίβα πρωτοκόλλου του κόμβου και, στη συνέχεια, να συνδέσετε το NetDevice στο κανάλι. Θα χρειαστεί ακόμη περισσότερη δουλειά για τη σύνδεση πολλών συσκευών σε συνδέσμους πολλαπλών σημείων και στη συνέχεια τη σύνδεση των επιμέρους δικτύων σε ένα δίκτυο Internetworks. Παρέχουμε βοηθητικά αντικείμενα τοπολογίας που συνδυάζουν αυτές τις πολλές λειτουργίες σε ένα εύχρηστο μοντέλο για τη διευκόλυνσή σας.

4.2 Πρώτη δέσμη ενεργειών ns-3

Εάν εγκαταστήσατε το σύστημα όπως προτείνεται παραπάνω, θα έχετε την έκδοση ns-3 σε έναν κατάλογο που ονομάζεται repos στον αρχικό σας κατάλογο. Μεταβείτε στον κατάλογο απελευθερώνουν

Εάν δεν έχετε τέτοιο κατάλογο, σημαίνει ότι δεν προσδιορίσατε τον κατάλογο εξόδου κατά τη δημιουργία της έκδοσης έκδοσης του ns-3, δημιουργήστε ως εξής:
$ ./waf configure —build-profile=release —out=build/release,
$ ./waf κατασκευή

εκεί θα πρέπει να δείτε μια δομή καταλόγου παρόμοια με την ακόλουθη:

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

Μεταβείτε στον κατάλογο παραδείγματα / φροντιστήριο. Θα πρέπει να δείτε ένα αρχείο που βρίσκεται εκεί που ονομάζεται πρώτο.cc. Αυτό είναι ένα σενάριο που θα δημιουργήσει μια απλή σύνδεση από σημείο σε σημείο μεταξύ δύο κόμβων και θα μεταδώσει ένα πακέτο μεταξύ των κόμβων. Ας δούμε αυτό το σενάριο γραμμή προς γραμμή· για να το κάνετε αυτό, ανοίξτε το first.cc στον αγαπημένο σας επεξεργαστή.

4.2.1 Κωδικός λέβητα
Η πρώτη γραμμή στο αρχείο είναι η γραμμή λειτουργίας επεξεργασίας emacs. Ενημερώνει το emacs για τις συμβάσεις μορφοποίησης (στυλ κωδικοποίησης) που χρησιμοποιούμε στον πηγαίο κώδικα.

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

Αυτό είναι πάντα ένα αρκετά αμφιλεγόμενο θέμα, επομένως πρέπει να κάνουμε το ρεκόρ για να το βγάλουμε από τη μέση αμέσως. Το έργο ns-3, όπως και τα περισσότερα μεγάλα έργα, έχει υιοθετήσει ένα στυλ κωδικοποίησης με το οποίο πρέπει να συμμορφώνονται όλοι οι συνεισφερόμενοι κώδικας. Εάν θέλετε να συνεισφέρετε τον κώδικά σας στο έργο, θα πρέπει τελικά να συμμορφωθείτε με το πρότυπο κωδικοποίησης ns-3, όπως περιγράφεται στο αρχείο doc/codingstd.txt ή εμφανίζεται στην ιστοσελίδα του έργου: https://www.nsnam.org/develop/contributing-code/coding-style/.

Σας συνιστούμε να συνηθίζετε την εμφάνιση και την αίσθηση του κώδικα ns-3 και να εφαρμόζετε αυτό το πρότυπο κάθε φορά που εργάζεστε με τον κώδικά μας. Ολόκληρη η ομάδα ανάπτυξης και οι συντελεστές συμφώνησαν σε αυτό μετά από κάποια γκρίνια. Η παραπάνω γραμμή λειτουργίας emacs διευκολύνει τη σωστή μορφοποίηση εάν χρησιμοποιείτε το πρόγραμμα επεξεργασίας emacs.

Ο προσομοιωτής ns-3 έχει άδεια χρήσης GNU General Public License. Θα δείτε την κατάλληλη νομική κεφαλίδα GNU σε κάθε αρχείο διανομής ns-3. Συχνά θα δείτε μια ειδοποίηση πνευματικών δικαιωμάτων για ένα από τα συμμετέχοντα ιδρύματα στο έργο ns-3 πάνω από το κείμενο και τον συγγραφέα της GPL, όπως φαίνεται παρακάτω.

/* 
* 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 Πρόσθετα

Ο ίδιος ο κώδικας ξεκινά με μια σειρά από δηλώσεις συμπερίληψης (περιλαμβάνουν).

#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"

Για να βοηθήσουμε τους χρήστες υψηλού επιπέδου δέσμης ενεργειών μας να αντιμετωπίσουν τον μεγάλο αριθμό αρχείων κεφαλίδας που υπάρχουν στο σύστημα, τα ομαδοποιούμε ανάλογα με τη χρήση τους σε μεγάλες ενότητες. Παρέχουμε ένα μόνο αρχείο κεφαλίδας που θα φορτώνει αναδρομικά όλα τα αρχεία κεφαλίδας που χρησιμοποιούνται σε μια δεδομένη λειτουργική μονάδα. Αντί να χρειάζεται να αναζητήσετε ακριβώς την κεφαλίδα που χρειάζεστε και ενδεχομένως να λάβετε τη σωστή λίστα εξαρτήσεων, σας δίνουμε τη δυνατότητα να κατεβάσετε μια ομάδα αρχείων με μεγάλη ευαισθησία. Δεν είναι η πιο αποτελεσματική προσέγγιση, αλλά σίγουρα κάνει τη συγγραφή σεναρίων πολύ πιο εύκολη.

Κάθε ένα από τα αρχεία ns-3 που περιλαμβάνει τοποθετείται σε έναν κατάλογο που ονομάζεται ns3 (δημιουργία υποκαταλόγου) για την αποφυγή διενέξεων ονομάτων αρχείου κατά τη διαδικασία δημιουργίας. Αρχείο ns3/core-module.h αντιστοιχεί στη μονάδα ns-3, την οποία θα βρείτε στον κατάλογο src/core στην έκδοση που εγκαταστήσατε. Στη λίστα αυτού του καταλόγου θα βρείτε μεγάλο αριθμό αρχείων κεφαλίδας. Όταν κάνετε τη συναρμολόγηση, βάφ τοποθετεί δημόσια αρχεία κεφαλίδας στον κατάλογο ns3 σε έναν υποκατάλογο build/debug

Εάν δεν έχετε τέτοιο κατάλογο, σημαίνει ότι δεν προσδιορίσατε τον κατάλογο εξόδου κατά τη δημιουργία της έκδοσης έκδοσης του ns-3, δημιουργήστε ως εξής:
$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf κατασκευή
ή
$ ./waf configure --build-profile=optimized --out=build/optimized
$ ./waf κατασκευή

ή κατασκευή/βελτιστοποίηση, ανάλογα με τη διαμόρφωσή σας. βάφ θα δημιουργήσει επίσης αυτόματα μια ενότητα που περιλαμβάνει αρχείο για να φορτώσει όλα τα δημόσια αρχεία κεφαλίδας. Εφόσον ακολουθείτε φυσικά αυτόν τον οδηγό θρησκευτικά, το έχετε ήδη κάνει

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

για να ρυθμίσετε το έργο ώστε να εκτελεί εκδόσεις εντοπισμού σφαλμάτων που περιλαμβάνουν παραδείγματα και δοκιμές. Το έκανες κι εσύ

$ ./waf

για τη συναρμολόγηση του έργου. Έτσι τώρα όταν κοιτάξετε στον κατάλογο ../../build/debug/ns3, τότε εκεί θα βρείτε, μεταξύ άλλων, τα αρχεία κεφαλίδας των τεσσάρων ενοτήτων που φαίνονται παραπάνω. Μπορείτε να δείτε τα περιεχόμενα αυτών των αρχείων και να διαπιστώσετε ότι περιλαμβάνουν όλα τα δημόσια αρχεία που χρησιμοποιούνται από τις αντίστοιχες λειτουργικές μονάδες.

4.2.3 Χώρος ονομάτων ns3

Επόμενη γραμμή στο σενάριο πρώτο.cc είναι μια δήλωση χώρου ονομάτων.

using namespace ns3;

Το έργο ns-3 υλοποιείται σε έναν χώρο ονομάτων C++ που ονομάζεται ns3. Αυτό ομαδοποιεί όλες τις δηλώσεις που σχετίζονται με το ns-3 σε ένα πεδίο εκτός του παγκόσμιου χώρου ονομάτων, το οποίο ελπίζουμε ότι θα βοηθήσει στην ενσωμάτωση με άλλο κώδικα. Η χρήση του τελεστή C++ εισάγει τον χώρο ονομάτων ns-3 στην τρέχουσα (καθολική) δηλωτική περιοχή. Αυτός είναι ένας φανταχτερός τρόπος να πούμε ότι μετά από αυτήν τη δήλωση, δεν θα χρειαστεί να πληκτρολογήσετε τον τελεστή άδειας ns3::scope πριν από όλο τον κωδικό ns-3 για να τον χρησιμοποιήσετε. Εάν δεν είστε εξοικειωμένοι με τους χώρους ονομάτων, ανατρέξτε σε σχεδόν οποιοδήποτε εγχειρίδιο C++ και συγκρίνετε τον χώρο ονομάτων ns3 χρησιμοποιώντας τον χώρο ονομάτων std και τη δήλωση using namespace std; σε παραδείγματα εργασίας με τον τελεστή εξόδου cout και ρέματα.

4.2.4 Καταγραφή

Η επόμενη γραμμή του σεναρίου είναι,

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Θα χρησιμοποιήσουμε αυτήν τη δήλωση ως βολικό μέρος για να συζητήσουμε το σύστημα τεκμηρίωσής μας οξυγόνο. Αν κοιτάξετε στον ιστότοπο του έργου ns-3, θα βρείτε έναν σύνδεσμο Τεκμηρίωση στη γραμμή πλοήγησης. Εάν κάνετε κλικ σε αυτόν τον σύνδεσμο, θα μεταφερθείτε στη σελίδα τεκμηρίωσής μας. Υπάρχει ένας σύνδεσμος "Τελευταία έκδοση" που θα σας μεταφέρει στην τεκμηρίωση για την πιο πρόσφατη σταθερή έκδοση του ns-3. Εάν επιλέξετε τον σύνδεσμο "Τεκμηρίωση API", θα μεταφερθείτε στη σελίδα τεκμηρίωσης του ns-3 API.

Στην αριστερή πλευρά της σελίδας θα βρείτε μια γραφική αναπαράσταση της δομής τεκμηρίωσης. Ένα καλό μέρος για να ξεκινήσετε είναι το "βιβλίο" των Ενοτήτων ns-3 στο δέντρο πλοήγησης ns-3. Αν αποκαλύψεις ενότητες, θα δείτε μια λίστα με την τεκμηρίωση των μονάδων ns-3. Όπως συζητήθηκε παραπάνω, η έννοια της ενότητας εδώ σχετίζεται άμεσα με τα αρχεία που περιλαμβάνονται στην παραπάνω ενότητα. Το υποσύστημα καταγραφής ns-3 συζητείται στην ενότητα Χρήση της μονάδας καταγραφής, επομένως θα επανέλθουμε σε αυτό αργότερα σε αυτό το σεμινάριο, αλλά μπορείτε να μάθετε για την παραπάνω δήλωση κοιτάζοντας την ενότητα πυρήναςκαι μετά ανοίγοντας το βιβλίο Εργαλεία εντοπισμού σφαλμάτωνκαι μετά επιλέγοντας τη σελίδα Ξύλευση. Κάντε κλικ στο Ξύλευση.

Θα πρέπει τώρα να ελέγξετε την τεκμηρίωση οξυγόνο για ενότητα Ξύλευση. Στη λίστα των μακροεντολών στο επάνω μέρος της σελίδας, θα δείτε μια καταχώρηση για NS_LOG_COMPONENT_DEFINE. Πριν κάνετε κλικ στον σύνδεσμο, φροντίστε να δείτε την «Λεπτομερή περιγραφή» της ενότητας εγγραφής για να κατανοήσετε πώς λειτουργεί γενικά. Για να το κάνετε αυτό, μπορείτε να κάνετε κύλιση προς τα κάτω ή να επιλέξετε "Περισσότερα..." κάτω από το γράφημα.

Μόλις έχετε μια γενική ιδέα για το τι συμβαίνει, προχωρήστε και δείτε την τεκμηρίωση για το συγκεκριμένο NS_LOG_COMPONENT_DEFINE. Δεν θα αντιγράψω την τεκμηρίωση εδώ, αλλά για να συνοψίσω, αυτή η γραμμή δηλώνει ένα στοιχείο εγγραφής που ονομάζεται FirstScriptExample, το οποίο σας επιτρέπει να ενεργοποιήσετε ή να απενεργοποιήσετε την καταγραφή των μηνυμάτων από την κονσόλα με αναφορά σε ένα όνομα.

4.2.5 Κύρια λειτουργία

Στις παρακάτω γραμμές του σεναρίου θα δείτε,

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

Αυτή είναι απλώς μια δήλωση της κύριας λειτουργίας του προγράμματός σας (script). Όπως με κάθε πρόγραμμα C++, πρέπει να ορίσετε μια κύρια συνάρτηση, αυτή εκτελείται πρώτα. Δεν υπάρχει τίποτα ιδιαίτερο εδώ. Το σενάριο ns-3 είναι απλώς ένα πρόγραμμα C++. Η ακόλουθη γραμμή ορίζει τη χρονική ανάλυση σε 1 νανοδευτερόλεπτο, που είναι η προεπιλογή:

Time::SetResolution (Time::NS);

Η ανάλυση χρόνου, ή απλά η ανάλυση, είναι η μικρότερη χρονική τιμή που μπορεί να χρησιμοποιηθεί (η μικρότερη αναπαραστάσιμη διαφορά μεταξύ δύο φορές). Μπορείτε να αλλάξετε την ανάλυση ακριβώς μία φορά. Ο μηχανισμός που παρέχει αυτήν την ευελιξία καταναλώνει τη μνήμη, επομένως, αφού οριστεί ρητά η ανάλυση, ελευθερώνουμε τη μνήμη, αποτρέποντας περαιτέρω ενημερώσεις. (Εάν δεν ορίσετε ρητά την ανάλυση, θα είναι προεπιλεγμένη σε ένα νανοδευτερόλεπτο και η μνήμη θα ελευθερωθεί όταν ξεκινήσει η προσομοίωση.)

Οι ακόλουθες δύο γραμμές δέσμης ενεργειών χρησιμοποιούνται για την ενεργοποίηση δύο στοιχείων καταγραφής που είναι ενσωματωμένα σε εφαρμογές EchoClient и EchoServer:

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

Εάν διαβάσετε την τεκμηρίωση για το στοιχείο καταγραφής, θα δείτε ότι υπάρχουν πολλά επίπεδα καταγραφής/λεπτομέρειας που μπορείτε να ενεργοποιήσετε σε κάθε στοιχείο. Αυτές οι δύο γραμμές κώδικα επιτρέπουν την καταγραφή εντοπισμού σφαλμάτων στο επίπεδο INFO για πελάτες και διακομιστές echo. Σε αυτό το επίπεδο, η εφαρμογή θα εκτυπώνει μηνύματα καθώς στέλνει και λαμβάνει πακέτα κατά την προσομοίωση.

Τώρα θα ασχοληθούμε με τη δημιουργία της τοπολογίας και την εκτέλεση της προσομοίωσης. Χρησιμοποιούμε βοηθητικά αντικείμενα τοπολογίας για να κάνουμε αυτή τη δουλειά όσο πιο εύκολη γίνεται.

4.2.6 Χρήση βοηθών τοπολογίας

Οι επόμενες δύο γραμμές κώδικα στο σενάριο μας θα δημιουργήσουν στην πραγματικότητα τα αντικείμενα Node ns-3 που θα αντιπροσωπεύουν τους υπολογιστές στην προσομοίωση.

NodeContainer nodes;
nodes.Create (2);

Πριν συνεχίσουμε, ας βρούμε την τεκμηρίωση για την τάξη NodeContainer. Ένας άλλος τρόπος για να φτάσετε στην τεκμηρίωση για μια δεδομένη τάξη είναι μέσω της καρτέλας μαθήματα στις σελίδες οξυγόνο. Εάν έχετε ήδη ανοιχτό το Doxygen, απλώς μετακινηθείτε προς τα πάνω στην κορυφή της σελίδας και επιλέξτε την καρτέλα Τάξεις. Θα πρέπει να δείτε ένα νέο σύνολο καρτελών, μία από τις οποίες είναι μια λίστα κλάσεων. Κάτω από αυτήν την καρτέλα θα δείτε μια λίστα με όλες τις κλάσεις ns-3. Κάντε κύλιση προς τα κάτω στο ns3::NodeContainer. Όταν βρείτε μια τάξη, επιλέξτε την για να μεταβείτε στην τεκμηρίωση για την τάξη.

Όπως θυμόμαστε, μια από τις βασικές μας αφαιρέσεις είναι ο κόμβος. Αντιπροσωπεύει τον υπολογιστή στον οποίο πρόκειται να προσθέσουμε πράγματα όπως στοίβες πρωτοκόλλων, εφαρμογές και κάρτες περιφερειακών. Βοηθός Τοπολογίας NodeContainer παρέχει έναν βολικό τρόπο δημιουργίας, διαχείρισης και πρόσβασης σε οποιαδήποτε αντικείμενα Κόμβος, το οποίο δημιουργούμε για να εκτελέσουμε την προσομοίωση. Η πρώτη γραμμή παραπάνω απλώς δηλώνει NodeContainer, που ονομάζουμε κόμβους. Η δεύτερη γραμμή καλεί τη μέθοδο Δημιουργία στο αντικείμενο των κόμβων και ζητά από το κοντέινερ να δημιουργήσει δύο κόμβους. Όπως περιγράφεται στο οξυγόνο, το κοντέινερ ζητά από το σύστημα ns-3 να δημιουργήσει δύο αντικείμενα Κόμβος και αποθηκεύει δείκτες σε αυτά τα αντικείμενα εσωτερικά.

Οι κόμβοι που δημιουργήθηκαν στο σενάριο δεν κάνουν τίποτα ακόμα. Το επόμενο βήμα στη δημιουργία της τοπολογίας είναι η σύνδεση των κόμβων μας στο δίκτυο. Η απλούστερη μορφή δικτύου που υποστηρίζουμε είναι μια σύνδεση από σημείο σε σημείο μεταξύ δύο κόμβων. Τώρα θα δημιουργήσουμε μια τέτοια σύνδεση.

PointToPointHelper

Δημιουργούμε μια σύνδεση από σημείο σε σημείο χρησιμοποιώντας ένα οικείο μοτίβο, χρησιμοποιώντας ένα βοηθητικό αντικείμενο τοπολογίας για να κάνουμε την εργασία χαμηλού επιπέδου που απαιτείται για τη σύνδεση. Θυμηθείτε ότι οι δύο βασικές αφαιρέσεις μας NetDevice и Κανάλι. Στον πραγματικό κόσμο, αυτοί οι όροι αντιστοιχούν κατά προσέγγιση σε περιφερειακές κάρτες και καλώδια δικτύου. Συνήθως, αυτά τα δύο πράγματα συνδέονται στενά μεταξύ τους και κανείς δεν μπορεί να βασιστεί στην κοινή χρήση, για παράδειγμα, συσκευών Ethernet μέσω ασύρματου καναλιού. Οι βοηθοί τοπολογίας μας ακολουθούν αυτήν τη στενή σχέση και επομένως θα χρησιμοποιήσετε ένα μεμονωμένο αντικείμενο σε αυτό το σενάριο PointToPointHelper για τη ρύθμιση και τη σύνδεση αντικειμένων ns-3 Συσκευή PointToPointNet и PointToPointChannel. Οι επόμενες τρεις γραμμές στο σενάριο:

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

Πρώτη γραμμή,

PointToPointHelper pointToPoint;

δημιουργεί ένα στιγμιότυπο ενός αντικειμένου στη στοίβα PointToPointHelper. Από κορυφαίας σκοπιάς η ακόλουθη γραμμή,

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

λέει το αντικείμενο PointToPointHelper χρησιμοποιήστε την τιμή "5 Mbit/s" (πέντε megabits ανά δευτερόλεπτο) ως "Ρυθμός δεδομένων».

Από μια πιο συγκεκριμένη άποψη, η συμβολοσειρά "DataRate" αντιστοιχεί σε αυτό που ονομάζουμε χαρακτηριστικό Συσκευή PointToPointNet. Αν κοιτάξεις οξυγόνο για την ταξη ns3::PointToPointNetDevice και στην τεκμηρίωση για τη μέθοδο GetTypeId θα βρείτε μια λίστα χαρακτηριστικών που ορίζονται για τη συσκευή. Ανάμεσά τους θα είναι το χαρακτηριστικό "Ρυθμός δεδομένων" Τα περισσότερα αντικείμενα ns-3 που είναι ορατά από τον χρήστη έχουν παρόμοιες λίστες χαρακτηριστικών. Χρησιμοποιούμε αυτόν τον μηχανισμό για να ρυθμίσουμε εύκολα την προσομοίωση χωρίς επαναμεταγλώττιση, όπως θα δείτε στην επόμενη ενότητα.

Παρόμοιο με "Ρυθμός δεδομένων" στο PointToPointNetDevice, θα βρείτε το χαρακτηριστικό "Delay" που σχετίζεται με το PointToPointChannel. Η τελική γραμμή

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

Μιλάει PointToPointHelper χρησιμοποιήστε την τιμή "2 ms" (δύο χιλιοστά του δευτερολέπτου) ως την τιμή καθυστέρησης διάδοσης για τη σύνδεση από σημείο σε σημείο που δημιουργεί στη συνέχεια.

NetDeviceContainer

Αυτή τη στιγμή έχουμε στο σενάριο NodeContainer, που περιέχει δύο κόμβους. Εχουμε PointToPointHelper, το οποίο είναι προετοιμασμένο για τη δημιουργία αντικειμένων Συσκευές PointToPointNet και τη σύνδεσή τους χρησιμοποιώντας ένα αντικείμενο PointToPointChannel. Ακριβώς όπως χρησιμοποιήσαμε το βοηθητικό αντικείμενο τοπολογίας NodeContainer για να δημιουργήσουμε κόμβους, θα ρωτήσουμε PointToPointHelper εκτελούν εργασίες για εμάς που σχετίζονται με τη δημιουργία, τη διαμόρφωση και την εγκατάσταση των συσκευών μας. Χρειαζόμαστε μια λίστα με όλα τα δημιουργημένα αντικείμενα NetDevice, οπότε χρησιμοποιούμε NetDeviceContainer να τα αποθηκεύσουμε με τον ίδιο τρόπο που χρησιμοποιήσαμε NodeContainer για να αποθηκεύσουμε τους κόμβους που δημιουργήσαμε. Οι επόμενες δύο γραμμές κώδικα,

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

πλήρης ρύθμιση της συσκευής και του καναλιού. Η πρώτη γραμμή δηλώνει το κοντέινερ της συσκευής που αναφέρεται παραπάνω και η δεύτερη κάνει την κύρια εργασία. Μέθοδος εγκαταστήστε αντικείμενο PointToPointHelper αποδέχεται NodeContainer ως παράμετρος. Μέσα NetDeviceContainer για κάθε κόμβο που βρίσκεται σε NodeContainer δημιουργείται (για την επικοινωνία από σημείο σε σημείο πρέπει να υπάρχουν ακριβώς δύο από αυτά) Συσκευή PointToPointNet δημιουργείται και αποθηκεύεται στο κοντέινερ της συσκευής. PointToPointChannel δημιουργείται και προσαρτώνται δύο σε αυτό Συσκευές PointToPointNet. Μετά τη δημιουργία αντικειμένων, τα χαρακτηριστικά αποθηκεύονται σε PointToPointHelper, χρησιμοποιούνται για την προετοιμασία των αντίστοιχων χαρακτηριστικών στα δημιουργημένα αντικείμενα.

Αφού πραγματοποιήσετε μια κλήση pointToPoint.Install (κόμβοι) θα έχουμε δύο κόμβους, ο καθένας με μια συσκευή δικτύου από σημείο σε σημείο εγκατεστημένη και μια σύνδεση από σημείο σε σημείο μεταξύ τους. Και οι δύο συσκευές θα διαμορφωθούν ώστε να μεταδίδουν δεδομένα με ταχύτητα πέντε megabit ανά δευτερόλεπτο με καθυστέρηση μετάδοσης δύο χιλιοστών του δευτερολέπτου στο κανάλι.

InternetStackHelper

Τώρα έχουμε διαμορφωμένους κόμβους και συσκευές, αλλά οι κόμβοι μας δεν έχουν εγκατεστημένες στοίβες πρωτοκόλλων. Οι επόμενες δύο γραμμές κώδικα θα φροντίσουν για αυτό.

InternetStackHelper stack;
stack.Install (nodes);

InternetStackHelper - είναι ένα βοηθητικό πρόγραμμα τοπολογίας για στοίβες Internet, παρόμοιο με το PointToPointHelper για συσκευές δικτύου από σημείο σε σημείο. Μέθοδος εγκαταστήστε παίρνει το NodeContainer ως παράμετρο. Όταν εκτελεστεί, θα εγκαταστήσει τη στοίβα Internet (TCP, UDP, IP, κ.λπ.) σε κάθε κόμβο κοντέινερ.

IPv4AddressHelper

Τότε πρέπει να συσχετίσουμε τις συσκευές μας με διευθύνσεις IP. Παρέχουμε έναν βοηθό τοπολογίας για τη διαχείριση της εκχώρησης διευθύνσεων IP. Το μόνο API που είναι ορατό στον χρήστη είναι η ρύθμιση της βασικής διεύθυνσης IP και της μάσκας δικτύου που θα χρησιμοποιηθούν κατά την εκτέλεση της πραγματικής διανομής διευθύνσεων (αυτό γίνεται σε χαμηλότερο επίπεδο στο βοηθητικό πρόγραμμα). Οι επόμενες δύο γραμμές κώδικα στο παράδειγμά μας σενάριο πρώτο.cc,

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

δηλώστε το αντικείμενο βοήθειας διεύθυνσης και πείτε του ότι θα πρέπει να αρχίσει να εκχωρεί διευθύνσεις IP από το δίκτυο 10.1.1.0, χρησιμοποιώντας τη μάσκα bit 255.255.255.0 για τον προσδιορισμό. Από προεπιλογή, οι εκχωρημένες διευθύνσεις θα ξεκινούν από ένα και θα αυξάνονται μονότονα, επομένως η πρώτη διεύθυνση που θα εκχωρηθεί από αυτήν τη βάση θα είναι 10.1.1.1, μετά 10.1.1.2 κ.λπ. Στην πραγματικότητα, σε χαμηλό επίπεδο, το σύστημα ns-3 θυμάται όλες τις εκχωρημένες διευθύνσεις IP και δημιουργεί ένα μοιραίο σφάλμα εάν κατά λάθος δημιουργήσετε μια κατάσταση όπου η ίδια διεύθυνση δημιουργείται δύο φορές (παρεμπιπτόντως, αυτό το σφάλμα είναι δύσκολο να εντοπιστεί.

Η ακόλουθη γραμμή κώδικα,

Ipv4InterfaceContainer interfaces = address.Assign (devices);

εκτελεί την πραγματική εκχώρηση διεύθυνσης. Στο ns-3 δημιουργούμε μια σύνδεση μεταξύ μιας διεύθυνσης IP και μιας συσκευής που χρησιμοποιεί το αντικείμενο Διασύνδεση IPv4. Ακριβώς όπως μερικές φορές χρειαζόμαστε μια λίστα συσκευών δικτύου που δημιουργείται από τον βοηθό για μελλοντική χρήση, μερικές φορές χρειαζόμαστε μια λίστα αντικειμένων Διασύνδεση IPv4. IPv4InterfaceContainer παρέχει αυτή τη λειτουργία.

Δημιουργήσαμε ένα δίκτυο από σημείο σε σημείο, με εγκατεστημένες στοίβες και εκχωρημένες διευθύνσεις IP. Τώρα χρειαζόμαστε εφαρμογές σε κάθε κόμβο για τη δημιουργία κίνησης.

4.2.7 Χρήση της εφαρμογής

Μια άλλη από τις κύριες αφαιρέσεις του συστήματος ns-3 είναι Εφαρμογή (εφαρμογή). Σε αυτό το σενάριο χρησιμοποιούμε δύο εξειδικεύσεις βασικής κατηγορίας Εφαρμογή ns-3 κλήθηκε Εφαρμογή UdpEchoServer и Εφαρμογή UdpEchoClient. Όπως σε προηγούμενες περιπτώσεις, χρησιμοποιούμε βοηθητικά αντικείμενα για τη διαμόρφωση και τη διαχείριση των βασικών αντικειμένων. Εδώ χρησιμοποιούμε UdpEchoServerHelper и UdpEchoClientHelper αντικείμενα για να κάνουμε τη ζωή μας πιο εύκολη.

UdpEchoServerHelper

Οι ακόλουθες γραμμές κώδικα στο σενάριο του παραδείγματος first.cc χρησιμοποιούνται για τη διαμόρφωση μιας εφαρμογής διακομιστή UDP echo σε έναν από τους κόμβους που δημιουργήσαμε νωρίτερα.

UdpEchoServerHelper echoServer (9);

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

Δημιουργείται η πρώτη γραμμή κώδικα στο παραπάνω απόσπασμα UdpEchoServerHelper. Ως συνήθως, αυτή δεν είναι μια εφαρμογή η ίδια, είναι ένα αντικείμενο που μας βοηθά να δημιουργήσουμε πραγματικές εφαρμογές. Μία από τις συμβάσεις μας είναι να μεταβιβάσουμε τα απαιτούμενα χαρακτηριστικά στον κατασκευαστή του βοηθητικού αντικειμένου. Σε αυτήν την περίπτωση, ο βοηθός δεν μπορεί να κάνει τίποτα χρήσιμο εάν δεν του δοθεί ο αριθμός θύρας στην οποία ο διακομιστής θα ακούσει για πακέτα, αυτός ο αριθμός πρέπει επίσης να είναι γνωστός στον πελάτη. Σε αυτήν την περίπτωση, περνάμε τον αριθμό θύρας στον βοηθό κατασκευαστή. Ο κατασκευαστής, με τη σειρά του, απλώς το κάνει SetAttribute με την περασμένη τιμή. Αργότερα, εάν θέλετε, μπορείτε να χρησιμοποιήσετε το SetAttribute για να ορίσετε μια διαφορετική τιμή για το χαρακτηριστικό Port.

Όπως πολλά άλλα βοηθητικά αντικείμενα, το αντικείμενο UdpEchoServerHelper έχει μέθοδο εγκαταστήστε. Η εκτέλεση αυτής της μεθόδου δημιουργεί αποτελεσματικά μια βασική εφαρμογή διακομιστή ηχούς και τη συνδέει με τον κεντρικό υπολογιστή. Είναι ενδιαφέρον η μέθοδος εγκαταστήστε αποδέχεται NodeContainer ως παράμετρος όπως και οι άλλες εγκαταστήστε μεθόδους που έχουμε δει.

Η σιωπηρή μετατροπή C++ που λειτουργεί εδώ λαμβάνει το αποτέλεσμα της μεθόδου node.Get(1) (το οποίο επιστρέφει έναν έξυπνο δείκτη στο αντικείμενο κόμβου - Ptr ) και το χρησιμοποιεί στον κατασκευαστή για το ανώνυμο αντικείμενο NodeContainerπου στη συνέχεια περνά στη μέθοδο εγκαταστήστε. Εάν δεν μπορείτε να προσδιορίσετε στον κώδικα C++ ποια υπογραφή μεθόδου μεταγλωττίζεται και εκτελείται, τότε αναζητήστε τις σιωπηρές μετατροπές.

Τώρα το βλέπουμε echoServer.Install πρόκειται να εγκαταστήσετε την εφαρμογή Εφαρμογή UdpEchoServer βρέθηκε σε NodeContainerπου χρησιμοποιούμε για τη διαχείριση των κόμβων μας, κόμβος με ευρετήριο 1. Μέθοδος εγκαταστήστε θα επιστρέψει ένα κοντέινερ που περιέχει δείκτες σε όλες τις εφαρμογές (σε αυτήν την περίπτωση μία, αφού περάσαμε μια ανώνυμη NodeContainer, που περιέχει έναν κόμβο) που δημιουργήθηκε από τον βοηθό.

Οι εφαρμογές πρέπει να προσδιορίζουν πότε θα ξεκινήσει η δημιουργία επισκεψιμότητας "αρχή" και μπορεί να χρειαστεί να καθορίσετε επιπλέον χρόνο για να το σταματήσετε "να σταματήσει". Παρέχουμε και τις δύο επιλογές. Αυτοί οι χρόνοι ορίζονται χρησιμοποιώντας τις μεθόδους ApplicationContainer Αρχική и στάση. Αυτές οι μέθοδοι δέχονται παραμέτρους τύπου Χρόνος. Σε αυτήν την περίπτωση χρησιμοποιούμε μια ρητή ακολουθία μετατροπών C++ για να πάρουμε τη C++ διπλασιαστεί 1.0 και μετατρέψτε το σε ένα αντικείμενο tns-3 Time που χρησιμοποιεί το αντικείμενο Seconds για μετατροπή σε δευτερόλεπτα. Να θυμάστε ότι οι κανόνες μετατροπής μπορούν να ελεγχθούν από τον συγγραφέα του μοντέλου και η C++ έχει τους δικούς της κανόνες, επομένως δεν μπορείτε πάντα να υπολογίζετε ότι οι παράμετροι θα μετατραπούν με τον τρόπο που περιμένατε. Δύο γραμμές

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

θα προκαλέσει την εκκίνηση της εφαρμογής διακομιστή ηχούς (ενεργοποίηση αυτόματα) ένα δευτερόλεπτο μετά την έναρξη της προσομοίωσης και τη διακοπή (απενεργοποίηση) μετά από δέκα δευτερόλεπτα της προσομοίωσης. Λόγω του γεγονότος ότι δηλώσαμε ένα συμβάν προσομοίωσης (συμβάν διακοπής εφαρμογής), το οποίο θα εκτελεστεί σε δέκα δευτερόλεπτα, θα προσομοιωθούν τουλάχιστον δέκα δευτερόλεπτα λειτουργίας δικτύου.

UdpEchoClientHelper

Αίτηση πελάτη ηχώ έχει ρυθμιστεί με τρόπο σχεδόν παρόμοιο με τον διακομιστή. Υπάρχει ένα αντικείμενο βάσης Εφαρμογή UdpEchoClient, το οποίο διαχειρίζεται
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));;

Ωστόσο, για τον πελάτη echo πρέπει να ορίσουμε πέντε διαφορετικά χαρακτηριστικά. Τα δύο πρώτα χαρακτηριστικά ορίζονται τη στιγμή της δημιουργίας UdpEchoClientHelper. Περνάμε παραμέτρους που χρησιμοποιούνται (μέσα στον βοηθό) για να ορίσουμε τα χαρακτηριστικά "Απομακρυσμένη Διεύθυνση" и "RemotePort" σύμφωνα με τη συμφωνία μας να περάσουμε τις απαραίτητες παραμέτρους στον βοηθό κατασκευαστή.

Ας θυμηθούμε ότι χρησιμοποιήσαμε IPv4InterfaceContainer για να παρακολουθείτε τις διευθύνσεις IP που έχουμε εκχωρήσει στις συσκευές μας. Η διεπαφή null στο κοντέινερ διεπαφών θα αντιστοιχεί στη διεύθυνση IP του μηδενικού κόμβου στο κοντέινερ κόμβων. Η πρώτη διεπαφή στο κοντέινερ διεπαφών αντιστοιχεί στη διεύθυνση IP του πρώτου κόμβου στο κοντέινερ κόμβων. Έτσι, στην πρώτη γραμμή κώδικα (παραπάνω), δημιουργούμε έναν βοηθό και του λέμε ότι η απομακρυσμένη διεύθυνση του πελάτη θα είναι η διεύθυνση IP που έχει εκχωρηθεί στον κεντρικό υπολογιστή όπου βρίσκεται ο διακομιστής. Λέμε επίσης ότι πρέπει να κανονίσουμε την αποστολή πακέτων στη θύρα εννέα.

Το χαρακτηριστικό "MaxPackets" λέει στον πελάτη τον μέγιστο αριθμό πακέτων που μπορούμε να στείλουμε κατά τη διάρκεια της προσομοίωσης. Το χαρακτηριστικό "Interval" λέει στον πελάτη πόσο καιρό πρέπει να περιμένει μεταξύ των πακέτων και το χαρακτηριστικό "PacketSize" λέει στον πελάτη πόσο μεγάλο θα πρέπει να είναι το ωφέλιμο φορτίο του πακέτου. Με αυτόν τον συνδυασμό χαρακτηριστικών λέμε στον πελάτη να στείλει ένα μόνο πακέτο 1024 byte.

Όπως και με τον διακομιστή echo, ορίζουμε τα χαρακτηριστικά του πελάτη echo Αρχική и στάση, αλλά εδώ ξεκινάμε τον πελάτη ένα δευτερόλεπτο μετά την ενεργοποίηση του διακομιστή (δύο δευτερόλεπτα μετά την έναρξη της προσομοίωσης).

4.2.8 Προσομοιωτής

Σε αυτό το σημείο πρέπει να εκτελέσουμε την προσομοίωση. Αυτό γίνεται χρησιμοποιώντας την καθολική συνάρτηση Simulator::Run.

Simulator::Run ();

Όταν προηγουμένως ονομάζαμε μεθόδους,

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

Στην πραγματικότητα προγραμματίσαμε εκδηλώσεις στον προσομοιωτή σε 1,0 δευτερόλεπτα, 2,0 δευτερόλεπτα και δύο συμβάντα στα 10,0 δευτερόλεπτα. Μετά την κλήση Simulator::Run, το σύστημα θα αρχίσει να βλέπει τη λίστα με τα προγραμματισμένα συμβάντα και να τα εκτελεί. Θα ενεργοποιήσει πρώτα ένα συμβάν μετά από 1,0 δευτερόλεπτο, το οποίο θα ενεργοποιήσει την εφαρμογή διακομιστή ηχούς (αυτό το συμβάν μπορεί με τη σειρά του να προγραμματίσει πολλά άλλα συμβάντα). Στη συνέχεια θα ενεργοποιήσει ένα συμβάν προγραμματισμένο στα t=2,0 δευτερόλεπτα, το οποίο θα εκκινήσει την εφαρμογή πελάτη echo. Και πάλι, αυτή η εκδήλωση μπορεί να έχει προγραμματισμένες πολλές ακόμη εκδηλώσεις. Η υλοποίηση συμβάντος έναρξης στον πελάτη echo θα ξεκινήσει τη φάση μεταφοράς δεδομένων της προσομοίωσης στέλνοντας ένα πακέτο στον διακομιστή.

Η πράξη της αποστολής ενός πακέτου στον διακομιστή θα ενεργοποιήσει μια αλυσίδα γεγονότων που θα προγραμματιστούν αυτόματα στα παρασκήνια και θα εφαρμόσουν τους μηχανισμούς αποστολής ενός πακέτου ηχούς σύμφωνα με τις παραμέτρους χρονισμού που έχουμε ορίσει στο σενάριο.

Ως αποτέλεσμα, αφού στέλνουμε μόνο ένα πακέτο (θυμηθείτε, το χαρακτηριστικό MaxPackets ορίστηκε σε ένα), η αλυσίδα συμβάντων που ξεκίνησε από αυτό το μεμονωμένο ping πελάτη θα τελειώσει και η προσομοίωση θα μεταβεί σε κατάσταση αναμονής. Μόλις συμβεί αυτό, οι υπόλοιπες προγραμματισμένες εκδηλώσεις θα είναι οι εκδηλώσεις στάση για διακομιστή και πελάτη. Όταν εκτελεστούν αυτά τα συμβάντα, δεν θα απομένουν συμβάντα για περαιτέρω επεξεργασία και Simulator::Run θα επιστρέψει τον έλεγχο. Η προσομοίωση ολοκληρώθηκε.

Το μόνο που μένει είναι να καθαρίσεις τον εαυτό σου. Αυτό γίνεται καλώντας την καθολική συνάρτηση Simulator::Destroy. Επειδή κλήθηκαν οι βοηθητικές συναρτήσεις (ή ο κώδικας ns-3 χαμηλού επιπέδου), οι οποίες είναι οργανωμένες έτσι ώστε να εισαχθούν άγκιστρα στον προσομοιωτή για να καταστρέψουν όλα τα αντικείμενα που δημιουργήθηκαν. Δεν χρειαζόταν να παρακολουθείτε κανένα από αυτά τα αντικείμενα μόνοι σας - το μόνο που έπρεπε να κάνετε ήταν να καλέσετε Simulator::Destroy και βγείτε έξω. Το σύστημα ns-3 θα κάνει αυτή τη σκληρή δουλειά για εσάς. Οι υπόλοιπες γραμμές του πρώτου μας σεναρίου ns-3, first.cc, κάνουν ακριβώς αυτό:

Simulator::Destroy ();
return 0;
}

Πότε θα σταματήσει ο προσομοιωτής;

Το ns-3 είναι ένας προσομοιωτής διακριτών γεγονότων (DE). Σε έναν τέτοιο προσομοιωτή, κάθε συμβάν συνδέεται με τον χρόνο εκτέλεσής του και η προσομοίωση συνεχίζεται με την επεξεργασία των γεγονότων με τη σειρά που συμβαίνουν καθώς προχωρά η προσομοίωση. Τα συμβάντα μπορεί να προκαλέσουν τον προγραμματισμό μελλοντικών συμβάντων (για παράδειγμα, ένας χρονοδιακόπτης μπορεί να επαναπρογραμματιστεί για να ολοκληρώσει τη μέτρηση στο επόμενο διάστημα).

Τα αρχικά συμβάντα ξεκινούν συνήθως από την οντότητα, για παράδειγμα το IPv6 θα προγραμματίσει την ανακάλυψη υπηρεσιών στο δίκτυο, αιτήματα γειτόνων κ.λπ. Η εφαρμογή προγραμματίζει το πρώτο συμβάν αποστολής πακέτων και ούτω καθεξής. Όταν ένα συμβάν υποβάλλεται σε επεξεργασία, μπορεί να δημιουργήσει μηδέν, ένα ή περισσότερα συμβάντα. Καθώς η προσομοίωση προχωρά, συμβαίνουν γεγονότα, είτε τελειώνουν είτε δημιουργούνται νέα. Η προσομοίωση θα σταματήσει αυτόματα εάν η ουρά συμβάντος είναι κενή ή αν εντοπιστεί ένα ειδικό συμβάν στάση. Εκδήλωση στάση που δημιουργείται από τη συνάρτηση Simulator::Stop (ώρα διακοπής).

Υπάρχει μια τυπική περίπτωση όπου το Simulator::Stop είναι απολύτως απαραίτητο για να σταματήσει η προσομοίωση: όταν υπάρχουν αυτοσυντηρούμενα γεγονότα. Τα αυτοσυντηρούμενα (ή επαναλαμβανόμενα) γεγονότα είναι γεγονότα που πάντα αναπρογραμματίζονται. Κατά συνέπεια, διατηρούν πάντα την ουρά συμβάντων όχι κενή. Υπάρχουν πολλά πρωτόκολλα και ενότητες που περιέχουν επαναλαμβανόμενα συμβάντα, για παράδειγμα:

• FlowMonitor - περιοδικός έλεγχος για χαμένα πακέτα.

• RIPng – περιοδική μετάδοση ενημερώσεων πίνακα δρομολόγησης.

• και τα λοιπά.

Σε τέτοιες περιπτώσεις Simulator::Stop απαραίτητο για τη σωστή διακοπή της προσομοίωσης. Επιπλέον, όταν το ns-3 βρίσκεται σε λειτουργία εξομοίωσης, ο RealtimeSimulator χρησιμοποιείται για τον συγχρονισμό του ρολογιού προσομοίωσης με το ρολόι της μηχανής και Simulator::Stop είναι απαραίτητο να σταματήσει η διαδικασία.

Πολλά από τα προγράμματα προσομοίωσης στο σχολικό βιβλίο δεν καλούν Simulator::Stop ρητά, αφού τερματίζονται αυτόματα όταν εξαντληθούν τα συμβάντα στην ουρά. Ωστόσο, αυτά τα προγράμματα θα δέχονται επίσης την κλήση Simulator::Stop. Για παράδειγμα, η ακόλουθη πρόσθετη δήλωση στο πρώτο παράδειγμα προγράμματος θα προγραμματίσει μια ρητή διακοπή στα 11 δευτερόλεπτα:

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

Τα παραπάνω δεν θα αλλάξουν ουσιαστικά τη συμπεριφορά αυτού του προγράμματος, αφού η συγκεκριμένη προσομοίωση τελειώνει φυσικά μετά από 10 δευτερόλεπτα. Αλλά αν αλλάζατε τον χρόνο διακοπής στην παραπάνω δήλωση από 11 δευτερόλεπτα σε 1 δευτερόλεπτο, θα παρατηρούσατε ότι η προσομοίωση σταματά πριν εμφανιστεί οποιαδήποτε έξοδος στην οθόνη (καθώς η έξοδος εμφανίζεται μετά από περίπου 2 δευτερόλεπτα χρόνου προσομοίωσης).

Είναι σημαντικό να καλέσετε το Simulator::Stop πριν καλέσετε το Simulator::Run; Διαφορετικά, το Simulator::Run μπορεί να μην επιστρέψει ποτέ τον έλεγχο στο κύριο πρόγραμμα για την εκτέλεση της διακοπής!

4.2.9 Δημιουργία του σεναρίου σας

Κάναμε ασήμαντη τη δημιουργία των απλών σεναρίων σας. Το μόνο που έχετε να κάνετε είναι να βάλετε το σενάριό σας στον κατάλογο scratch και θα κατασκευαστεί αυτόματα εάν τρέξετε βάφ. Ας δοκιμάσουμε. Επιστρέψτε στον κατάλογο ανώτατου επιπέδου και αντιγράψτε παραδείγματα/εκμάθηση/πρώτο.cc στον κατάλογο μηδέν

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

Τώρα δημιουργήστε το πρώτο σας δείγμα σεναρίου χρησιμοποιώντας WAF:

$ ./waf

Θα πρέπει να δείτε μηνύματα που υποδεικνύουν ότι το πρώτο σας παράδειγμα δημιουργήθηκε με επιτυχία.

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)

Τώρα μπορείτε να εκτελέσετε το παράδειγμα (σημειώστε ότι εάν δημιουργήσετε το πρόγραμμά σας στον κατάλογο scratch, τότε πρέπει να το εκτελέσετε από μηδέν):

$ ./waf --run scratch/myfirst

Θα πρέπει να δείτε παρόμοια έξοδο:

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

Εδώ μπορείτε να δείτε ότι το σύστημα κατασκευής επαληθεύει ότι το αρχείο έχει δημιουργηθεί και στη συνέχεια το εκτελεί. Βλέπετε ότι η καταχώρηση στοιχείου στον υπολογιστή-πελάτη echo υποδεικνύει ότι έστειλε ένα μόνο πακέτο 1024 byte στον διακομιστή echo 10.1.1.2. Βλέπετε επίσης το στοιχείο καταγραφής στον διακομιστή echo για να πείτε ότι έλαβε 1024 byte από την 10.1.1.1. Ο διακομιστής echo αναπαράγει σιωπηλά το πακέτο και μπορείτε να δείτε στο αρχείο καταγραφής του πελάτη echo ότι έλαβε το πακέτο του πίσω από τον διακομιστή.

4.3 ns-3 Πηγαίος κώδικας

Τώρα που έχετε χρησιμοποιήσει μερικούς από τους βοηθούς ns-3, μπορείτε να ρίξετε μια ματιά σε μερικούς από τον πηγαίο κώδικα που υλοποιεί αυτήν τη λειτουργία. Μπορείτε να δείτε τον πιο πρόσφατο κώδικα στον web server μας στον παρακάτω σύνδεσμο: https://gitlab.com/nsnam/ns-3-dev.git. Εκεί θα δείτε τη σελίδα σύνοψης Mercurial για το δέντρο ανάπτυξης του ns-3. Στην κορυφή της σελίδας θα δείτε αρκετούς συνδέσμους,

summary | shortlog | changelog | graph | tags | files

Προχωρήστε και επιλέξτε τη σύνδεση αρχείων. Έτσι θα μοιάζει το ανώτατο επίπεδο των περισσότερων αποθετηρίων μας:

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

Τα παραδείγματά μας σενάρια βρίσκονται στον κατάλογο παραδείγματα. Εάν κάνετε κλικ στα παραδείγματα, θα δείτε μια λίστα με υποκαταλόγους. Ένα από τα αρχεία στον υποκατάλογο φροντιστήριο - πρώτο.κ.εκ. Εάν κάνετε κλικ στο πρώτο.cc θα δείτε τον κώδικα που μόλις μάθατε.

Ο πηγαίος κώδικας βρίσκεται κυρίως στον κατάλογο src. Μπορείτε να δείτε τον πηγαίο κώδικα κάνοντας κλικ στο όνομα του καταλόγου ή κάνοντας κλικ στη σύνδεση αρχείων στα δεξιά του ονόματος του καταλόγου. Εάν κάνετε κλικ στον κατάλογο src, θα λάβετε μια λίστα με υποκαταλόγους src. Εάν στη συνέχεια κάνετε κλικ στον υποκατάλογο πυρήνα, θα βρείτε μια λίστα αρχείων. Το πρώτο αρχείο που θα δείτε (τη στιγμή που γράφετε αυτόν τον οδηγό) είναι αποβολή.η. Εάν κάνετε κλικ στον σύνδεσμο αποβολή.η, θα σταλθείτε στο αρχείο προέλευσης για αποβολή.η, το οποίο περιέχει χρήσιμες μακροεντολές για έξοδο από σενάρια εάν εντοπιστούν μη φυσιολογικές συνθήκες. Ο πηγαίος κώδικας για τους βοηθούς που χρησιμοποιήσαμε σε αυτό το κεφάλαιο βρίσκεται στον κατάλογο src/Εφαρμογές/βοηθός. Μη διστάσετε να περιηγηθείτε στο δέντρο καταλόγου για να καταλάβετε πού βρίσκεται και να κατανοήσετε το στυλ των προγραμμάτων ns-3.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο