Ασύρματες Κινητές Επικοινωνίες Ενότητα 3: Σημεία πρόσβασης στο Wireless Fidelity (WiFi) Μιχάλας Άγγελος Τμήμα Μηχανικών Πληροφορικής ΤE
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα του ΤΕΙ Δυτικής Μακεδονίας και της Ανώτατης Εκκλησιαστικής Ακαδημίας Θεσσαλονίκης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Σημεία πρόσβασης στο WiFi
Σκοποί ενότητας Με αυτή την ενότητα εξετάζουμε τη λειτουργικότητα του σημείων πρόσβασης (access points) στα δίκτυο IEEE 802.11. Ακόμα, μελετούμε τον τρόπο εκτέλεσης προσομοιώσεων εκτός του scratch. 5
Περιεχόμενα ενότητας (1/4) Αρχεία κεφαλίδας και βασικές παράμετροι. Δημιουργία των κόμβων του δικτύου. Υλοποίηση του Φυσικού επιπέδου του WiFi. Υλοποίηση του επιπέδου Medium Access Control (MAC) του WiFi. Παράμετροι για την ανίχνευση του δικτύου. Δημιουργία των συσκευών WiFi. 6
Περιεχόμενα ενότητας (2/4) Ρύθμιση παραμέτρων του σημείου πρόσβασης. Δημιουργία της συσκευής του σημείου πρόσβασης. Ορισμός της θέσης των κόμβων. Καθορισμός διευθύνσεων Internet Protocol (IP). User Datagram Protocol (UDP) server. 7
Περιεχόμενα ενότητας (3/4) UDP client. Πίνακες δρομολόγησης. Διάρκεια προσομοίωσης. Η τοποθεσία ns-3.**/examples. Windows script (Wscript). Εκτέλεση προσομοίωσης. 8
Περιεχόμενα ενότητας (4/4) Ανάλυση αποτελεσμάτων. Ασκήσεις. 9
Αρχεία κεφαλίδας και βασικές παράμετροι (1/2) Εισάγουμε τα απαραίτητα αρχεία κεφαλίδας (header files), καθορίζουμε το namespace που θα χρησιμοποιήσουμε, τις παραμέτρους που μπορούμε να περάσουμε μέσω του τερματικού και το επίπεδο καταγραφής των μηνυμάτων. 10
Αρχεία κεφαλίδας και βασικές παράμετροι (2/2) #include "ns3/core-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" using namespace ns3; NS_LOG_COMPONENT_DEFINE ("lab3"); int main (int argc, char *argv[]){ uint32_t nwifi = 3; double xdist = 50.0; CommandLine cmd;cmd.addvalue ("xdist", "Distance between two nodes along axis x", xdist); cmd.parse (argc,argv); LogComponentEnable("UdpClient", LOG_LEVEL_INFO); LogComponentEnable("UdpServer", LOG_LEVEL_INFO); 11
Δημιουργία των κόμβων του δικτύου Δημιουργούμε τους κόμβους του ασύρματου δικτύου. Χαρακτηρίζουμε έναν κόμβο ως σημείο πρόσβασης (Access Point). NodeContainer wifistanodes, wifiapnode; wifistanodes.create (nwifi); wifiapnode = wifistanodes.get (0); 12
Υλοποίηση του Φυσικού επιπέδου του WiFi Δημιουργούμε το φυσικό επίπεδο και το κανάλι και τα συσχετίζουμε. Εφαρμόζουμε τις προεπιλεγμένες ρυθμίσεις. YansWifiChannelHelper channel = YansWifiChannelHelper::Default (); YansWifiPhyHelper phy = answifiphyhelper::default (); phy.setchannel (channel.create ()); 13
Υλοποίηση του επιπέδου MAC του WiFi Θέτουμε τον τύπο του αλγορίθμου για τον έλεγχο του ρυθμού και υλοποιούμε το επίπεδο MAC για το οποίο ορίζουμε ότι δεν θα παρέχει κάποιο μηχανισμό για Ποιότητα της Υπηρεσίας. WifiHelper wifi = WifiHelper::Default (); wifi.setremotestationmanager ("ns3::aarfwifimanager"); NqosWifiMacHelper mac = NqosWifiMacHelper::Default (); 14
Παράμετροι για την ανίχνευση του δικτύου Ορίζουμε ένα Service Set Identifier (SSID) για το δίκτυο. Επίσης, δηλώνουμε ότι δε θα χρησιμοποιείται ο μηχανισμός Active Probing για την ανίχνευση του σημείου πρόσβασης. Θα χρησιμοποιούνται beacon frames, όπως θα δούμε παρακάτω. Ssid ssid = Ssid ("ns-3-ssid"); mac.settype ("ns3::stawifimac", "Ssid", SsidValue (ssid), "ActiveProbing", BooleanValue (false)); 15
Δημιουργία των συσκευών WiFi Καθορίζουμε τις παραμέτρους φυσικού και MAC επιπέδου των κόμβων μας κι έτσι δημιουργούμε τις συσκευές WiFi. NetDeviceContainer stadevices; stadevices = wifi.install (phy, mac, wifistanodes.get (1)); 16
Ρύθμιση παραμέτρων του σημείου πρόσβασης Θέτουμε το SSID για το σημείο πρόσβασης. Ρυθμίζουμε το σημείο πρόσβασης να στέλνει ένα beacon frame κάθε 5 δευτερόλεπτα. Έτσι, το σημείο πρόσβασης θα γνωστοποιεί την ύπαρξή του στους χρήστες που βρίσκονται εντός της περιοχής κάλυψής του. Ο μηχανισμός αυτός ονομάζεται παθητική σάρωση (Passive Scanning). mac.settype ("ns3::apwifimac", "Ssid", SsidValue (ssid), "BeaconGeneration", BooleanValue (true), "BeaconInterval", TimeValue (Seconds (5))); 17
Δημιουργία της συσκευής του σημείου πρόσβασης Δημιουργούμε τη συσκευή WiFi για το σημείο πρόσβασης καθορίζοντας τις παραμέτρους του Φυσικού και του MAC επιπέδου της. NetDeviceContainer apdevice; apdevice = wifi.install (phy, mac, wifiapnode); 18
Ορισμός της θέσης των κόμβων Ορίζουμε τη θέση των κόμβων στο δίκτυο. mobility.setpositionallocator ("ns3::gridpositionallocator","minx", DoubleValue (0.0),"MinY", DoubleValue (0.0),"DeltaX", DoubleValue (xdist),"deltay", DoubleValue(25.0), "GridWidth", UintegerValue(3), "LayoutType", StringValue ("RowFirst")); mobility.setmobilitymodel ("ns3::constantpositionmobilitymodel"); mobility.install (wifistanodes); 19
Καθορισμός διευθύνσεων IP Εγκαθιστούμε τη στοίβα πρωτοκόλλων Transmission Control Protocol (TCP) κι ορίζουμε τις IP διευθύνσεις των κόμβων. InternetStackHelper stack; stack.install (wifistanodes); Ipv4AddressHelper address; Ipv4InterfaceContainer wifiinterfaces, wifiapinterface; address.setbase ("10.1.5.0", "255.255.255.0"); wifiapinterface = address.assign (apdevice); wifiinterfaces = address.assign (stadevices); 20
UDP server Δημιουργούμε ένα κόμβο που θα λαμβάνει πακέτα (server), θέτουμε την πόρτα που θα στην οποία θα ακούει και καθορίζουμε τις χρονικές στιγμές έναρξης και λήξης της κίνησης. UdpServerHelper Server (22000); ApplicationContainer serverapps = Server.Install (wifiapnode.get(0)); serverapps.start (Seconds (1.0)); serverapps.stop (Seconds (15.0)); 21
UDP client (1/2) Δημιουργούμε τον κόμβο που θα στέλνει την κίνηση στο δίκτυο (client) και θέτουμε κάποιες παραμέτρους. Το χρονικό διάστημα μεταξύ δύο διαδοχικών πακέτων. Το μέγιστο αριθμό πακέτων που μπορεί να στείλει ο client και το μέγεθος του πακέτου. Τις χρονικές στιγμές έναρξης και λήξης της αποστολής πακέτων. 22
UDP client (2/2) UdpClientHelper Client (wifiapinterface.getaddress (0), 22000); Client.SetAttribute ("Interval", TimeValue (Seconds(0.5))); Client.SetAttribute ("PacketSize", UintegerValue (768)); ApplicationContainer clientapps = Client.Install (wifistanodes.get(1)); clientapps.start (Seconds (2.0)); clientapps.stop (Seconds (14.0)); 23
Πίνακες δρομολόγησης Συμπλήρωση των πινάκων δρομολόγησης. Ipv4GlobalRoutingHelper::PopulateRoutingTables (); 24
Διάρκεια προσομοίωσης Ρυθμίζουμε τη διάρκεια της προσομοίωσης και δημιουργούμε το αρχείο για το Network Animator. Simulator::Stop (Seconds (18.0)); AnimationInterface anim ("lab3.xml"); Simulator::Run (); Simulator::Destroy (); return 0; } 25
Η τοποθεσία ns-3.**/examples Αποθηκεύουμε τον κώδικα σε ένα αρχείο με όνομα lab3.cc στην τοποθεσία ns-allinone- 3.**/ns-3.**/examples/tutorial. Η τοποθεσία ns-3.**/examples περιέχει μία σειρά από παραδείγματα σχετικά με τις τεχνολογίες που υποστηρίζει ο NS3. 26
Wscript (1/4) Η διαφορά στην περίπτωση της τοποθεσίας ns- 3.**/examples με την τοποθεσία scratch όπου τοποθετούμε συνήθως τις προσομοιώσεις μας εντοπίζεται στην ύπαρξη των αρχείων wscript. Περιγράφουν τα περιεχόμενα του κάθε φακέλου. Τα wscripts είναι από τα βασικά συστατικά του NS3, με αποτέλεσμα να κρίνεται χρήσιμη η γνωριμία με αυτά στα πλαίσια του μαθήματος. 27
Wscript (2/4) Η μορφή των περιεχομένων ενός αρχείου wscript είναι η παρακάτω: def build(bld): obj = bld.create_ns3_program('hello-simulator', ['core']) obj.source = 'hello-simulator.cc' obj = bld.create_ns3_program('first', ['core', 'point-to-point', 'internet', 'applications']) obj.source = 'first.cc obj = bld.create_ns3_program('second', ['core', 'point-to-point', 'csma', 'internet', 'applications']) obj.source = 'second.cc' 28
Wscript (3/4) Με τις εντολές της μορφής obj = bld.create_ns3_program('first', ['core', 'point-to-point', 'internet', 'applications']) obj.source = 'first.cc καθορίζουμε: Το όνομα μίας προσομοίωσης που υπάρχει στην ίδια τοποθεσία με το wscript (πχ first). Τις εξαρτήσεις (dependencies) που έχει η εν λόγω προσομοίωση (πχ core, point-to-point, internet κι 'applications']). Το αρχείο που περιέχει την προσομοίωσή μας (πχ. first.cc). 29
Wscript (4/4) Για να μπορούμε να εκτελέσουμε το αρχείο lab3.cc μέσα από το examples/template, προσθέτουμε τις παρακάτω γραμμές στο αρχείο wscript που υπάρχει σε αυτή την τοποθεσία. obj = bld.create_ns3_program(lab3, ['core', 'wifi', 'csma', 'netanim', 'internet', 'applications']) obj.source = 'lab3.cc' 30
Εκτέλεση προσομοίωσης (1/2) Για να εκτελέσουμε την προσομοίωσή μεταφερόμαστε με την κατάλληλη εντολή cd στην τοποθεσία ns-allinone-3.**/ns-3.** κι εκτελούμε την εντολή:./waf --run examples/tutorial/lab3. Μπορούμε να αποθηκεύσουμε τα αποτελέσματα της προσομοίωσης σε ένα αρχείο με την εντολή:./waf --run examples/tutorial/lab3 &> out3. 31
Εκτέλεση προσομοίωσης (2/2) Το αρχείο out3 θα εξαχθεί στην τοποθεσία ns-allinone-3.**/ns-3.**. Για ευκολότερη επεξεργασία των δεδομένων που περιέχει το αρχείο out3 θα χρησιμοποιήσουμε το αρχείο awk που παρουσιάστηκε στην προηγούμενη ενότητα. 32
Απεικόνιση της προσομοίωσης με το NetAnim Ανοίγουμε το αρχείο lab3.xml με το NetAnim. Εικόνα 1. Απεικόνιση της προσομοίωσης από το NetAnim, εμφάνιση μετά την εγκατάσταση του προγράμματος ns-3, ελεύθερο λογισμικό, με άδεια GNU GPLv2 license, διαθέσιμο στο κοινό για έρευνα, ανάπτυξη και χρήση. 33
Ανάλυση αποτελεσμάτων Για το λόγο αυτό, τοποθετούμε το αρχείο awk στην τοποθεσία ns-allinone-3.**/ns-3.** κι εκτελούμε στο τερματικό την παρακάτω εντολή: awk -f myawk.awk < out3. Με αυτή την εντολή, εκτελούμε το αρχείο myawk.awk δίνοντας του ως είσοδο το αρχείο out2 που περιέχει τα αποτελέσματα της προσομοίωσης μας. Το αρχείο awk τυπώνει στο τερματικό τα σχετικά αποτελέσματα που περιγράφηκαν νωρίτερα. 34
Ασκήσεις (1/8) Σε αυτή την άσκηση εξετάζουμε την επίδοση του μηχανισμού Request To Send / Clear To Send (RTS/CTS) σε ένα δίκτυο IEEE 802.11. Επίσης, πραγματοποιείται εξάσκηση στον εναλλακτικό τρόπο εκτέλεσης των προσομοιώσεων μέσα από κάποια τοποθεσία όπως η examples/tutorial, που επεξηγήθηκε στις προηγούμενες διαφάνειες. 35
Ασκήσεις (2/8) Το δίκτυο IEEE 802.11 που θα προσομοιωθεί αποτελείται από 9 στατικούς κόμβους τοποθετημένους σε πλέγμα. Δίνεται το παρακάτω κομμάτι κώδικα: #include "ns3/core-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" 36
Ασκήσεις (3/8) Συνέχεια κώδικα. using namespace ns3; NS_LOG_COMPONENT_DEFINE ("Lab3b"); int main (int argc, char *argv[]) { LogComponentEnable ("UdpClient", LOG_LEVEL_INFO); LogComponentEnable ("UdpServer", LOG_LEVEL_INFO); /* Τοποθετίστε εδώ τον κώδικα που θα σας ζητηθεί παρακάτω*/ phy.enablepcap ("lab3b", stadevices.get (0)); Simulator::Run (); Simulator::Destroy (); return 0; } 37
Ασκήσεις (4/8) Μέσα στη συνάρτηση main. 1. Δημιουργήστε ένα δίκτυο IEEE 802.11 με 9 κόμβους. 2. Δημιουργήστε το φυσικό επίπεδο του δικτύου. 3. Εισάγετε το παρακάτω κομμάτι κώδικα για την ενεργοποίηση του μηχανισμού RTS/CTS. WifiHelper wifi = WifiHelper::Default (); wifi.setremotestationmanager ("ns3::aarfwifimanager"); Config::SetDefault ("ns3::wifiremotestationmanager::rtsctsthreshold", UintegerValue (0)); NqosWifiMacHelper mac = NqosWifiMacHelper::Default (); 38
Ασκήσεις (5/8) 4. Δημιουργήστε τις συσκευές WiFi. 5. Δημιουργήστε το πλέγμα όπου θα είναι τοποθετημένοι οι κόμβοι και ρυθμίστε τους κόμβους ώστε να μην κινούνται στο χώρο. Στην κάθε σειρά του πλέγματος θα πρέπει να είναι τοποθετημένοι 3 κόμβοι. 6. Εισάγετε τη στοίβα του internet. 7. Ορίστε τις IP διευθύνσεις. 39
Ασκήσεις (6/8) 8. Δημιουργήστε 2 servers (κόμβος 0 και 2) και 2 clients (κόμβος 6 και 8). a. Ο κόμβος 6 να στέλνει κίνηση στον κόμβο 0 και ο κόμβος 8 να στέλνει κίνηση στον κόμβο 2. b. Οι servers να ξεκινούν τη χρονική στιγμή 2 και να σταματούν τη χρονική στιγμή 10. c. Οι clients να ξεκινούν τις χρονικές στιγμές 3 και 3.15 και να σταματούν τη χρονική στιγμή 9. d. Ορίστε το μέγεθος των πακέτων που θα στέλνουν οι clients να είναι ίσο με 1024 bytes. 40
Ασκήσεις (7/8) e. Το χρονικό διάστημα μεταξύ δύο διαδοχικών πακέτων να είναι ίσο με 0.01. f. Ο μέγιστος αριθμός πακέτων (MaxPackets) να είναι ίσος με 1000. 9. Ορίστε το συνολικό διάστημα της προσομοίωσης σε 12 δευτερόλεπτα. 10.Εκτελέστε τον κώδικα κι εξάγεται τα αποτελέσματα σε ένα αρχείο με όνομα homework. 41
Ασκήσεις (8/8) 12. Αναλύστε τα αποτελέσματα χρησιμοποιώντας το αρχείο myawk.awk. Πόσα πακέτα εστάλησαν και πόσα ελήφθησαν; Ποιες είναι οι τιμές για την απόλυα πακέτων, τη χρονική καθυστέρηση και τη ρυθμαπόδοση; 13. Αλλάξτε την τιμή του RtsCtsThreshold από 0 σε 1200 και κάντε πάλι τα δύο προηγούμενα ερωτήματα. Δώστε μία σύντομη εξήγηση. 42
Βιβλιογραφία 1. Βασικές Αρχές Ασύρματης Επικοινωνίας, David Tse, Pramod Viswanath, Εκδόσεις Κλειδάριθμος. 2. ΔΙΚΤΥΑ ΚΙΝΗΤΩΝ & ΠΡΟΣΩΠΙΚΩΝ ΕΠΙΚΟΙΝΩΝΙΩΝ, Θεολόγου Μ., Εκδοτικός Οίκος: ΤΖΙΟΛΑ Έτος έκδοσης: 2007 ISBN: 978-960-418-126-1. 3. Εισαγωγή στα ασύρματα συστήματα, Black, Dipiazza, Ferguson. 4. Συστήματα Κινητών Επικοινωνιών, Κανάτας Αθανάσιος, Κωνσταντίνου Φίλιππος, Πάντος Γεώργιος. 43
Τέλος Ενότητας