Ασύρματες Κινητές Επικοινωνίες Ενότητα 1: Εισαγωγή Μιχάλας Άγγελος Τμήμα Μηχανικών Πληροφορικής ΤΕ
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα του ΤΕΙ Δυτικής Μακεδονίας και της Ανώτατης Εκκλησιαστικής Ακαδημίας Θεσσαλονίκης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Σκοποί ενότητας Το ασύρματο δίκτυο που εξετάζουμε αποτελείται από 9 κόμβους, που είναι τοποθετημένοι σε πλέγμα κι αρχικά είναι στατικοί. Ο κόμβος 8 θα στέλνει User Datagram Protocol (UDP) κίνηση στον κόμβο 4. Σημειώνουμε ότι η αρίθμηση των κόμβων ξεκινάει από το 0. Η προσομοίωση διαρκεί συνολικά 12 δευτερόλεπτα. 4
Περιεχόμενα ενότητας (1/3) Αρχεία κεφαλίδας. Χώρος ονομάτων. Καταγραφή μηνυμάτων στο τερματικό. Η συνάρτηση main. Καθορισμός παραμέτρων κατά την εκτέλεση. Τύπωση μηνυμάτων για την κίνηση (Traffic). 5
Περιεχόμενα ενότητας (2/3) Δημιουργία κόμβων. Υλοποίηση του Φυσικού επιπέδου. Υλοποίηση του επιπέδου Medium Access Control (MAC). Δημιουργία συσκευών Wireless Fidelity (WiFi). Ορισμός της θέσης των κόμβων. Internet Protocol (IP) διευθύνσεις. 6
Περιεχόμενα ενότητας (3/3) UDP server. UDP client. Διάρκεια προσομοίωσης. Εκτέλεση προσομοίωσης. Εγκατάσταση του NS-3. Εγκατάσταση του NetAnim. 7
Εισαγωγή 8
Αρχεία κεφαλίδας Αρχικά, πρέπει να συμπεριλάβουμε όλα τα απαραίτητα αρχεία κεφαλίδας (header files) χρησιμοποιώντας τις κατάλληλες εντολές include. Κάθε αρχείο κεφαλίδας του ns3 βρίσκεται στην τοποθεσία ns3/src. Π.χ. το #include "ns3/coremodule.h" βρίσκεται στην τοποθεσία src/core. #include "ns3/core-module.h" #include "ns3/point-to-point module.h" #include "ns3/network-module.h" #include "ns3/applications module.h" #include "ns3/wifi-module.h" #include "ns3/mobility-module.h" #include "ns3/csma-module.h" #include "ns3/internet-module.h" #include "ns3/netanim-module.h" #include "ns3/olsr-helper.h" 9
Χώρος ονομάτων Καθορίζουμε τον χώρο ονομάτων (namespace) που θα χρησιμοποιήσουμε. Ο ns3 χρησιμοποιεί το ns3 namespace. using namespace ns3; 10
Καταγραφή μηνυμάτων στο τερματικό Ενεργοποιήσουμε την καταγραφή μηνυμάτων στο τερματικό. Δίνουμε το όνομα του σεναρίου μας, ώστε να ξέρουμε ότι τα μηνύματα που θα τυπωθούν αφορούν τη συγκεκριμένη προσομοίωση. NS_LOG_COMPONENT_DEFINE ("Lab1"); 11
Η συνάρτηση main Δηλώνουμε τη συνάρτηση main Αρχικοποιούμε τη μεταβλητή nwifi. Δηλαδή, δηλώνουμε ότι θα έχουμε 9 κόμβους στο ασύρματο δίκτυο. Η μεταβλητή npackets θα καθορίσει τον μέγιστο αριθμό πακέτων που θα αποσταλούν. int main (int argc, char *argv[]){ uint32_t nwifi = 9; int npackets = 50; 12
Καθορισμός παραμέτρων κατά την εκτέλεση Μπορούμε να ορίζουμε παραμέτρους μέσω του τερματικού, χρησιμοποιώντας ένα αντικείμενο CommandLine στον κώδικα της προσομοίωσης. Π.χ. για να αλλάξουμε τον αριθμό των κόμβων της τοπολογίας μας, εκτελούμε την προσομοίωση με την παρακάτω εντολή:./waf run scratch/intro nwifi=4 CommandLine cmd; cmd.addvalue ("nwifi", "Number of wifi devices", nwifi); cmd.addvalue ("npackets", "Number of packets", npackets); cmd.parse (argc,argv); 13
Τύπωση μηνυμάτων για την κίνηση (Traffic) Τύπωση μηνυμάτων για την κίνηση που στέλνουμε. Συγκεκριμένα, θα τυπώνονται στο τερματικό μηνύματα που αφορούν την εφαρμογή (UdpClient - UdpServer). Επίσης, δηλώνουμε το επίπεδο καταγραφής μηνυμάτων που επιθυμούμε. Υπάρχουν επτά διαφορετικά επίπεδα καταγραφής ανάλογα με το πόσο αναλυτικά θέλουμε να είναι τα μηνύματα καταγραφής. Το επίπεδο info (επίπεδο 4) τυπώνει μηνύματα που αφορούν στην αποστολή και λήψη των πακέτων κατά τη διάρκεια της προσομοίωσης. LogComponentEnable ("UdpClient", LOG_LEVEL_INFO); LogComponentEnable ("UdpServer", LOG_LEVEL_INFO); 14
Δημιουργία κόμβων Δημιουργούμε έξι κόμβους στο δίκτυο. o nwifi = 9. NodeContainer wifistanodes; wifistanodes.create (nwifi); 15
Υλοποίηση του Φυσικού επιπέδου Υλοποιούμε το φυσικό επίπεδο και το κανάλι (PHY, channel) του WiFi και τα συσχετίζουμε. Το φυσικό επίπεδο και το κανάλι έχουν τις προεπιλεγμένες ρυθμίσεις. YansWifiChannelHelper channel = YansWifiChannelHelper:: Default (); YansWifiPhyHelper phy = YansWifiPhyHelper:: Default (); phy.setchannel (channel.create ()); 16
Υλοποίηση του επιπέδου MAC Χρησιμοποιώντας τον WifiHelper, υλοποιούμε το επίπεδο MAC του WiFi. Θέτουμε τον τύπο του αλγορίθμου για τον έλεγχο του ρυθμού που θα χρησιμοποιεί. Επίσης, δεν προσθέτουμε Ποιότητα της Υπηρεσίας στο MAC επίπεδο. WifiHelper wifi = WifiHelper::Default (); wifi.setremotestationmanage ("ns3::aarfwifimanager"); NqosWifiMacHelper mac = NqosWifiMacHelper::Default (); 17
Δημιουργία συσκευών WiFi Μία συσκευή WiFi είναι ένας κόμβος που διαθέτει φυσικό και MAC επίπεδο τεχνολογίας WiFi. Δημιουργούμε τις συσκευές WiFi και καθορίζουμε τις παραμέτρους Φυσικού και MAC επιπέδου τους, καθώς και τους κόμβους με τους οποίους αντιστοιχίζονται. NetDeviceContainer stadevices; stadevices = wifi.install (phy, mac, wifistanodes); 18
Ορισμός της θέσης των κόμβων Ορίζουμε τη θέση των κόμβων στο δίκτυό μας κι αν θα είναι στατικοί ή κινούμενοι (mobility). MobilityHelper mobility; mobility.setpositionallocator ("ns3::gridpositionallocator", "MinX", DoubleValue (0.0), "MinY", DoubleValue (0.0), "DeltaX", DoubleValue (40.0), "DeltaY", DoubleValue (30.0), "GridWidth", UintegerValue (3), "LayoutType", StringValue ("RowFirst")); mobility.setmobilitymodel ("ns3::constantpositionmobilitymodel"); mobility.install (wifistanodes); InternetStackHelper stack; stack.install (wifistanodes); 19
Internet Protocol (IP) διευθύνσεις Ορίζουμε τις IP διευθύνσεις των κόμβων. Ipv4AddressHelper address; address.setbase ("10.1.3.0", "255.255.255.0"); address.assign (stadevices); Ipv4InterfaceContainer interfaces = address.assign(stadevices); 20
UDP server Δημιουργούμε έναν κόμβο θα λαμβάνει πακέτα (server) Θέτουμε την πόρτα που θα χρησιμοποιείται και τη χρονική διάρκεια που ο server θα είναι ενεργός. UdpServerHelper server (22000); ApplicationContainer serverapps =server.install(wifistanodes.get(4)); serverapps.start(seconds (2.0)); serverapps.stop(seconds(10.0)); 21
UDP client Δημιουργούμε την κίνηση (traffic) στο δίκτυο. Ορίζουμε τον κόμβο που θα στέλνει την κίνηση στο δίκτυο (client) και θέτουμε κάποιες παραμέτρους, όπως το χρονικό διάστημα μεταξύ δύο διαδοχικών πακέτων και το μέγεθος του πακέτου. UdpClientHelper client (interfaces.getaddress (4), 22000); client.setattribute ("Interval", TimeValue (Seconds (0.1))); client.setattribute ("PacketSize", UintegerValue (512)); client.setattribute ("MaxPackets", UintegerValue (npackets)); ApplicationContainer clientapps = client.install(wifistanodes.get(8)); clientapps.start (Seconds (3.0)); clientapps.stop (Seconds (9.0)); 22
Διάρκεια προσομοίωσης Δηλώνουμε τη διάρκεια της προσομοίωσης και το αρχείο που θα χρησιμοποιήσουμε για το Network Animator. Simulator::Stop (Seconds (12.0)); AnimationInterface anim ("lab1.xml"); Simulator::Run (); Simulator::Destroy (); return 0; } 23
Εκτέλεση προσομοίωσης Αποθηκεύουμε τον κώδικα σε ένα αρχείο με όνομα intro.cc στην τοποθεσία ns-allinone- 3.**/ns-3.**/scratch. Για να εκτελέσουμε το εν λόγω αρχείο μεταφερόμαστε με την κατάλληλη εντολή cd στην τοποθεσία ns-allinone-3.**/ns-3.** κι εκτελούμε την εντολή:./waf --run intro. 24
Εγκατάσταση του NS-3 (1/16) Ο παρόν οδηγός παρέχει οδηγίες για εγκατάσταση του NS3 σε Ubuntu/Debian. Την ώρα που γράφεται ο παρόν οδηγός, η τρέχουσα έκδοση του NS3 είναι η 3.16, την οποία μπορούμε να την κατεβάσουμε από εδώ. http://www.nsnam.org/ns-3-16/download/ 25
Εγκατάσταση του NS-3 (2/16) Εικόνα 1. Λήψη του NS-3 από την ιστοσελίδα του, ελεύθερο λογισμικό, με άδεια GNU GPLv2 license, διαθέσιμο στο κοινό για έρευνα, ανάπτυξη και χρήση. 26
Εγκατάσταση του NS-3 (3/16) Αφού κατεβάσουμε τον NS3 από την ιστοσελίδα του, αποσυμπιέζουμε τα περιεχόμενά του σε μία τοποθεσία της επιλογής μας. Για το παράδειγμά μας, έστω ότι έχουμε δημιουργήσει έναν φάκελο με όνομα programs στην τοποθεσία home. Εικόνα 2. Αποσυμπίεση περιεχομένων NS3, ελεύθερο λογισμικό, με άδεια GNU GPLv2 license, διαθέσιμο στο κοινό για έρευνα, ανάπτυξη και χρήση. 27
Εγκατάσταση του NS-3 (4/16) Εικόνα 3. Αποσυμπίεση των αρχείων NS3, ελεύθερο λογισμικό, με άδεια GNU GPLv2 license, διαθέσιμο στο κοινό για έρευνα, ανάπτυξη και χρήση. 28
Εγκατάσταση του NS-3 (5/16) Ανοίγουμε ένα command line και με την κατάλληλη εντολή cd μεταφερόμαστε στην τοποθεσία τοποθεσία-όπου-εξάγαμε-τον-ns3 / ns-allinone- 3.** / ns-3.**. Εικόνα 4. Εντολή για τη μεταφορά στην τοποθεσία όπου εξάγαμε τον ns-3, screen shot από τον υπολογιστή μας, άδεια GNU GPLv2 license. 29
Εγκατάσταση του NS-3 (6/16) Εγκαθιστούμε τα προαπαιτούμενα πακέτα. Ανάλογα με την έκδοση Ubuntu ή Debian που διαθέτουμε, κάποια από αυτά ίσως να μας βγάλουν μήνυμα ότι δεν υπάρχουν διαθέσιμες ενημερώσεις. Σε τέτοιου είδους περίπτωση δεν υπάρχει κάποιο πρόβλημα, προχωράμε στο επόμενο προαπαιτούμενο. 30
Εγκατάσταση του NS-3 (7/16) Για την εγκατάσταση των προαπαιτούμενων, στο command line που ανοίξαμε νωρίτερα, έχοντας μεταφερθεί πλέον στην τοποθεσία τοποθεσίαόπου-εξάγαμε-τον-ns3 / ns-allinone-3.** / ns- 3.**, εκτελούμε τις παρακάτω εντολές. o sudo apt-get install gcc g++ python. o sudo apt-get install gcc g++ python python-dev. o sudo apt-get install mercurial. 31
Εγκατάσταση του NS-3 (8/16) Εγκατάσταση προαπαιτούμενων (συνέχεια). o sudo apt-get install bzr. o sudo apt-get install gdb valgrind. o sudo apt-get install gsl-bin libgsl0-dev libgsl0ldbl. o sudo apt-get install flex bison libfl-dev. o sudo apt-get install g++-3.4 gcc-3.4. 32
Εγκατάσταση του NS-3 (9/16) Εγκατάσταση προαπαιτούμενων (συνέχεια). o sudo apt-get install tcpdump. o sudo apt-get install sqlite sqlite3 libsqlite3-dev. o sudo apt-get install libxml2 libxml2-dev. o sudo apt-get install libgtk2.0-0 libgtk2.0-dev. o sudo apt-get install vtun lxc. 33
Εγκατάσταση του NS-3 (10/16) Εγκατάσταση προαπαιτούμενων (συνέχεια). o sudo apt-get install uncrustify. o sudo apt-get install doxygen graphviz imagemagick. o sudo apt-get install texlive texlive-extra-utils texlive-latexextra. o sudo apt-get install python-sphinx dia. o sudo apt-get install uncrustify. 34
Εγκατάσταση του NS-3 (11/16) Εγκατάσταση προαπαιτούμενων (συνέχεια). o sudo apt-get install doxygen graphviz imagemagick. o sudo apt-get install texlive texlive-extra-utils texlive-latexextra. o sudo apt-get install python-sphinx dia. o sudo apt-get install python-pygraphviz python-kiwi python-pygoocanvas libgoocanvas-dev. o sudo apt-get install libboost-signals-dev libboostfilesystem-dev. 35
Εγκατάσταση του NS-3 (12/16) Εγκατάσταση προαπαιτούμενων (συνέχεια). o sudo apt-get install openmpi*. o sudo apt-get install uncrustify. o sudo apt-get install doxygen graphviz imagemagick. o sudo apt-get install texlive texlive-extra-utils texlive-latexextra. o sudo apt-get install python-sphinx dia. 36
Εγκατάσταση του NS-3 (13/16) Εγκατάσταση προαπαιτούμενων (συνέχεια). o sudo apt-get install python-pygraphviz python-kiwi python-pygoocanvas libgoocanvas-dev. o sudo apt-get install libboost-signals-dev libboostfilesystem-dev. o sudo apt-get install openmpi*. 37
Εγκατάσταση του NS-3 (14/16) Στη συνέχεια, για την εγκατάσταση του NS3, εκτελούμε τις παρακάτω εντολές. o sudo./waf clean. o sudo./waf -d optimized --enable-examples -- enable-tests configure. o sudo./waf. 38
Εγκατάσταση του NS-3 (15/16) Για να δοκιμάσουμε αν η εγκατάσταση έχει ολοκληρωθεί με επιτυχία, εκτελούμε την εντολή./test.py. Αν το αποτέλεσμα αυτής της εντολής είναι παρόμοιο με αυτό της επόμενης διαφάνειας, τότε η εγκατάσταση έχει ολοκληρωθεί με επιτυχία. 39
Εγκατάσταση του NS-3 (16/16) Εικόνα 5. Αποτέλεσμα επιτυχούς εγκατάστασης, screen shot από υπολογιστή εγκατάστασης, άδεια GNU GPLv2 license. 40
Εγκατάσταση του NetAnim (1/3) Με την κατάλληλη εντολή cd μεταφερόμαστε σε μία τοποθεσία της επιλογής μας κι εκτελούμε τις παρακάτω εντολές: 1. sudo apt-get install mercurial. 2. sudo apt-get install qt4-dev-tools. Σε περίπτωση εμφάνιση σφάλματος σχετικά με τις εξαρτήσεις (dependencies) σε αυτή την εντολή: a. Εκτελέστε την εντολή sudo nautilus. b. Στον εξερευνητή (explorer) που θα ανοίξει πηγαίνετε στην τοποθεσία /etc/apt κι ανοίξτε το αρχείο sources.list. 41
Εγκατάσταση του NetAnim (2/3) Συνέχεια εγκατάστασης. c. Στο τέλος του αρχείου προσθέστε τη γραμμή deb http://security.ubuntu.com/ubuntu precise-security main. d. Αποθηκεύστε και κλείστε το αρχείο. e. Εκτελέστε την εντολή sudo apt-get update. 42
Εγκατάσταση του NetAnim (3/3) Συνέχεια εγκατάστασης. 3. sudo hg clone http://code.nsnam.org/netanim. 4. cd netanim. 5. sudo make clean. 6. sudo qmake NetAnim.pro. 7. sudo make. 43
Άνοιγμα του NetAnim (1/4) Ανοίγουμε το NetAnim κάνοντας διπλό κλικ στο αρχείο NetAnim που υπάρχει στο φάκελο της εγκατάστασης. Εικονίδιο NetAnim, εμφάνιση μετά την εγκατάσταση του προγράμματος ns-3, ελεύθερο λογισμικό, με άδεια GNU GPLv2 license, διαθέσιμο στο κοινό για έρευνα, ανάπτυξη και χρήση. 44
Άνοιγμα του NetAnim (2/4) Κάνουμε κλικ στο εικονίδιο που βρίσκεται στο πάνω αριστερό σημείο του NetAnim, για το άνοιγμα ενός αρχείου. Εικονίδιο του NetAnim για το άνοιγμα αρχείου, εμφάνιση μετά την εγκατάσταση του προγράμματος ns-3, ελεύθερο λογισμικό, με άδεια GNU GPLv2 license, διαθέσιμο στο κοινό για έρευνα, ανάπτυξη και χρήση. 45
Άνοιγμα του NetAnim (3/4) Ανοίγουμε ένα xml αρχείο που περιέχει τα δεδομένα μίας προσομοίωσης για το NetAnim. Έχει δημιουργηθεί από κάποιο σενάριο προσομοίωσης. Άνοιγμα αρχείου lab1.xml, εμφάνιση μετά την εγκατάσταση του προγράμματος ns-3, ελεύθερο λογισμικό, με άδεια GNU GPLv2 license, διαθέσιμο στο κοινό για έρευνα, ανάπτυξη και χρήση. 46
Άνοιγμα του NetAnim (4/4) Απεικόνιση προσομοίωσης από το NetAnim, εμφάνιση μετά την εγκατάσταση του προγράμματος ns-3, ελεύθερο λογισμικό, με άδεια GNU GPLv2 license, διαθέσιμο στο κοινό για έρευνα, ανάπτυξη και χρήση.. 47
Βιβλιογραφία 1. Βασικές Αρχές Ασύρματης Επικοινωνίας, David Tse, Pramod Viswanath, Εκδόσεις Κλειδάριθμος. 2. ΔΙΚΤΥΑ ΚΙΝΗΤΩΝ & ΠΡΟΣΩΠΙΚΩΝ ΕΠΙΚΟΙΝΩΝΙΩΝ, Θεολόγου Μ., Εκδοτικός Οίκος: ΤΖΙΟΛΑ Έτος έκδοσης: 2007 ISBN: 978-960-418-126-1. 3. Εισαγωγή στα ασύρματα συστήματα, Black, Dipiazza, Ferguson. 4. Συστήματα Κινητών Επικοινωνιών, Κανάτας Αθανάσιος, Κωνσταντίνου Φίλιππος, Πάντος Γεώργιος. 48
Τέλος Ενότητας 49