Ασύρματες Κινητές Επικοινωνίες Ενότητα 2: Το επίπεδο MAC του WiFi Μιχάλας Άγγελος Τμήμα Μηχανικών Πληροφορικής ΤΕ
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα του ΤΕΙ Δυτικής Μακεδονίας και της Ανώτατης Εκκλησιαστικής Ακαδημίας Θεσσαλονίκης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Το επίπεδο MAC του WiFi
Σκοποί ενότητας Σε αυτή την ενότητα εξετάζουμε την επίδοση του MAC πρωτοκόλλου του IEEE 802.11. Οι μετρικές επίδοσης που μας ενδιαφέρουν είναι το ποσοστό των πακέτων που στάλθηκαν, το ποσοστό των πακέτων που ελήφθησαν επιτυχώς, η μέση καθυστέρηση μετάδοσης των πακέτων (delay) και τη μέση ρυθμαπόδοση του δικτύου (throughput). 5
Περιεχόμενα ενότητας (1/3) Σενάριο Προσομοίωσης Αρχεία κεφαλίδας και βασικές παράμετροι Δημιουργία των κόμβων του δικτύου Υλοποίηση του Φυσικού επιπέδου του WiFi Υλοποίηση του επιπέδου MAC του WiFi Δημιουργία των συσκευών WiFi 6
Περιεχόμενα ενότητας (2/3) Ορισμός της θέσης των κόμβων Καθορισμός διευθύνσεων IP UDP server UDP client Διάρκεια προσομοίωσης Εκτέλεση προσομοίωσης 7
Περιεχόμενα ενότητας (3/3) Ανάλυση αποτελεσμάτων Πρόγραμμα ανάλυσης αποτελεσμάτων - Awk Ανάλυση αποτελεσμάτων (συνέχεια) Ασκήσεις Τροποποίηση του αρχικού σεναρίου προσομοίωσης Ασκήσεις (συνέχεια) 8
Σενάριο Προσομοίωσης Το ασύρματο δίκτυο που εξετάζουμε αποτελείται από 8 κόμβους. Ο κόμβος 4 στέλνει πακέτα στον κόμβο 1. Οι κόμβοι είναι τοποθετημένοι σε πλέγμα και είναι στατικοί. 9
Αρχεία κεφαλίδας και βασικές παράμετροι (1/2) Εισάγουμε τα απαραίτητα αρχεία κεφαλίδας (header files), το namespace που θα χρησιμοποιήσουμε, τις παραμέτρους που μπορούμε να περάσουμε μέσω του τερματικού και το επίπεδο καταγραφής των μηνυμάτων. 10
Αρχεία κεφαλίδας και βασικές παράμετροι (2/2) #include "ns3/core-module.h " #include "ns3/point-to-pointmodule.h " #include "ns3/network-module.h " #include "ns3/applicationsmodule.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" using namespace ns3; NS_LOG_COMPONENT_DEFINE ("Lab2"); int main (int argc, char *argv[]){ uint32_t nwifi = 8; CommandLine cmd; cmd.addvalue ("nwifi", "Number of wifi STA devices", nwifi); cmd.parse (argc,argv); LogComponentEnable ("UdpClient", LOG_LEVEL_INFO); LogComponentEnable ("UdpServer", LOG_LEVEL_INFO); 11
Δημιουργία των κόμβων του δικτύου Δημιουργούμε τους κόμβους του ασύρματου δικτύου: NodeContainer wifistanodes; wifistanodes.create (nwifi); 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
Δημιουργία των συσκευών WiFi Καθορίζουμε τις παραμέτρους φυσικού και MAC επιπέδου των κόμβων μας κι έτσι δημιουργούμε τις συσκευές WiFi. NetDeviceContainer stadevices; stadevices = wifi.install (phy, mac, wifistanodes); 15
Ορισμός της θέσης των κόμβων Ορίζουμε τη θέση των κόμβων στο δίκτυό μας. MobilityHelper mobility; mobility.setpositionallocator ("ns3::gridpositionallocator", "MinX", DoubleValue (0.0), "MinY", DoubleValue (0.0), "DeltaX", DoubleValue (40.0), "DeltaY", DoubleValue (50.0), "GridWidth", UintegerValue (2), "LayoutType", StringValue ("RowFirst")); mobility.setmobilitymodel ("ns3::constantpositionmobilitymodel"); mobility.install (wifistanodes); 16
Καθορισμός διευθύνσεων IP Εγκαθιστούμε τη στοίβα πρωτοκόλλων TCP κι ορίζουμε τις IP διευθύνσεις των συσκευών. InternetStackHelper stack; stack.install (wifistanodes); Ipv4AddressHelper address; address.setbase ("10.1.2.0", "255.255.255.0"); Ipv4InterfaceContainer interfaces = address.assign(stadevices); 17
UDP server Δημιουργούμε ένα κόμβο που θα λαμβάνει πακέτα (server), θέτουμε την πόρτα στην οποία θα ακούει και καθορίζουμε τις χρονικές στιγμές έναρξης και λήξης της κίνησης. UdpServerHelper server (22000); ApplicationContainer serverapps = server.install (wifistanodes.get (1)); serverapps.start (Seconds (1.0)); serverapps.stop (Seconds (10.0)); 18
UDP client (1/2) Δημιουργούμε τον κόμβο που θα στέλνει την κίνηση στο δίκτυο (client) και θέτουμε κάποιες παραμέτρους: Το χρονικό διάστημα μεταξύ δύο διαδοχικών πακέτων. Το μέγιστο αριθμό πακέτων που μπορεί να στείλει ο client και το μέγεθος του πακέτου. Τις χρονικές στιγμές έναρξης και λήξης της αποστολής πακέτων. 19
UDP client (2/2) UdpClientHelper client (interfaces.getaddress (1), 22000); client.setattribute ("Interval", TimeValue (Seconds (0.01))); client.setattribute ("PacketSize", UintegerValue (512)); client.setattribute ("MaxPackets", UintegerValue (15000)); ApplicationContainer clientapps = client.install (wifistanodes.get (4)); clientapps.start (Seconds (1.5)); clientapps.stop (Seconds (9.5)); 20
Διάρκεια προσομοίωσης Δηλώνουμε τη διάρκεια της προσομοίωσης και το αρχείο που θα χρησιμοποιήσουμε για το NetAnim. Simulator::Stop (Seconds (14.0)); // Create the animation object and configure for specified output AnimationInterface anim ("lab2.xml"); Simulator::Run (); Simulator::Destroy (); return 0; } 21
Εκτέλεση προσομοίωσης Αποθηκεύουμε τον κώδικα σε ένα αρχείο με όνομα lab2.cc στην τοποθεσία ns-allinone- 3.**/ns-3.**/scratch. Για να εκτελέσουμε το εν λόγω αρχείο μεταφερόμαστε με την κατάλληλη εντολή cd στην τοποθεσία ns-allinone-3.**/ns-3.** κι εκτελούμε την εντολή:./waf --run lab2 22
Απεικόνιση της προσομοίωσης με το NetAnim Ανοίγουμε το αρχείο lab2.xml με το NetAnim. 23
Ανάλυση αποτελεσμάτων Αποθηκεύσουμε τα αποτελέσματα της προσομοίωσης σε ένα αρχείο εκτελώντας την εντολή:./waf --run lab2 &> out2 Το αρχείο out2 δημιουργείται στην τοποθεσία nsallinone-3.**/ns-3.**. Για ευκολότερη επεξεργασία των δεδομένων του, χρησιμοποιούμε ένα script που είναι γραμμένο σε γλώσσα awk. 24
Πρόγραμμα ανάλυσης αποτελεσμάτων - Awk (1/6) Ένα πρόγραμμα awk αποτελείται από τρία τμήματα. Το πρώτο τμήμα του προγράμματος ορίζεται με την εντολή BEGIN { }. Περιλαμβάνει όλες τις εντολές που θα εκτελεστούν κατά την εκκίνηση της του προγράμματος. Όπως αρχικοποίηση μεταβλητών. 25
Πρόγραμμα ανάλυσης αποτελεσμάτων - Awk (2/6) Το τμήμα BEGIN του αρχείο awk που θα χρησιμοποιήσουμε: BEGIN { sum = 0; count = 0; sent = 0; starttime = -1; stoptime = -1; bytes = 0; started= 0; } 26
Πρόγραμμα ανάλυσης αποτελεσμάτων - Awk (3/6) Το δεύτερο τμήμα περιλαμβάνει ένα σύνολο από κανόνες που θα εκτελεστούν για κάθε γραμμή του αρχείου εισόδου. Αποτελούνται από δύο τμήματα. Το πρώτο τμήμα καθορίζει σε ποιες γραμμές του αρχείου εισόδου αναφέρεται ο κανόνας. Το δεύτερο τμήμα καθορίζει ποιες λειτουργίες θα πραγματοποιηθούν για αυτές τις γραμμές. 27
Πρόγραμμα ανάλυσης αποτελεσμάτων - Awk (4/6) Για παράδειγμα ο κανόνας δεξιά ορίζει ότι: Όταν συναντήσουμε μια γραμμή του αρχείου εισόδου που περιέχει τους όρους «TraceDelay TX» Αν η τιμή της δέκατης λέξη είναι μεγαλύτερη από 5 τότε η τιμή της μεταβλητής started γίνεται ίση με 1. Στο δεύτερο if, αν η τιμή της μεταβλητής started είναι ίση με 1, τότε η τιμή της μεταβλητής sent αυξάνεται κατά 1. /TraceDelay TX/ { if ($10 > 1.0) { started = 1; } if (started == 1) { sent++; } } 28
Πρόγραμμα ανάλυσης αποτελεσμάτων - Awk (5/6) Το κομμάτι κώδικα δεξιά ελέγχει τις γραμμές που περιέχουν τον όρο «RXtime» και: Προσθέτει στη μεταβλητή sum την τιμή της 17 ης λέξης η οποία είναι η καθυστέρηση (delay) του πακέτου. Η μεταβλητή count είναι ο αριθμός των πακέτων που ελήφθησαν επιτυχώς. Στη μεταβλητή bytes προστίθενται κάθε φορά η ποσότητα των Bytes που λαμβάνεται. /RXtime/ { split($13, tmp, "."); timesent = tmp[1]; if (timesent > 1e9) { count++; split($17,tmp,".") sum += tmp[1]; } # print starttime # print tmp[1] if ( started == 1) { split($15, tmp, ".") if (starttime < 0) { tarttime=tmp[1];} stoptime = tmp[1]; bytes += $3; } } 29
Πρόγραμμα ανάλυσης αποτελεσμάτων - Awk (6/6) Το τελευταίο τμήμα ορίζεται από την εντολή END{ } Τυπώνονται Τα πακέτα που εστάλησαν (sent) Τα πακέτα που ελήφθησαν (received) Οι απώλιες πακέτων (packet loss) Η καθυστέρηση μετάδοσης (delay) Η ρυθμαπόδοση (throughput) END { # print sent, count print "sent", sent, " recv", count, " pl ", (1.0*(sent - count)/sent), "delay", (1e-9*sum)/count, "throughput", 1e9*8*bytes / (1.0*stoptime - starttime); } 30
Ανάλυση αποτελεσμάτων (συνέχεια) Εισάγουμε τον κώδικα awk σε ένα κενό αρχείο και το αποθηκεύουμε με όνομα myawk.awk στην τοποθεσία nsallinone-3.**/ns-3.**. Εκτελούμε το αρχείο lab2 κι εξάγουμε τα αποτελέσματά του σε ένα αρχείο με όνομα out2, Εκτελέστε στο τερματικό την εντολή: awk f myawk.awk < out2 Με αυτή την εντολή, εκτελούμε το αρχείο myawk.awk δίνοντας του ως είσοδο το αρχείο out2 που περιέχει τα αποτελέσματα της προσομοίωσης μας. Το αρχείο awk τυπώνει στο τερματικό τα σχετικά αποτελέσματα που περιγράφηκαν νωρίτερα. 31
Ασκήσεις (1/2) 1. Πόσα πακέτα στάλθηκαν και πόσα λήφθηκαν; 2. Ποια είναι η ρυθμαπόδοση (throughput) του δικτύου; 3. Ποια είναι η μέση καθυστέρηση μετάδοσης των πακέτων (delay); 32
Ασκήσεις (2/2) 4. Αλλάξτε το χρονικό διάστημα μεταξύ της αποστολής δύο διαδοχικών πακέτων από 0.1 σε 1 και 0.01 κι απαντήστε ξανά στα παραπάνω ερωτήματα. Δώστε σύντομη εξήγηση για τα νέα αποτελέσματα. 5. Αλλάξτε το μέγεθος του πακέτου από 1024 σε 512 και 1500. Απαντήστε πάλι στα ερωτήσεις 1 έως 3 και δώστε μία σύντομη εξήγηση. 6. Ορίστε τον κόμβο 7 ως τον κόμβο που θα στέλνει την κίνηση. Απαντήστε στις ερωτήσεις 1 έως 3 και δώστε σύντομη εξήγηση. 33
Τροποποίηση του αρχικού σεναρίου προσομοίωσης (1/2) Θα ορίσουμε ένα πρωτόκολλο για δρομολόγηση των πακέτων μεταξύ των κόμβων του δικτύου μας. Θα εφαρμόσουμε το πρωτόκολλο δρομολόγησης Optimized Link State Routing (OLSR). Θέτουμε βάρη στις μεθόδους δρομολόγησης. Αν έχουμε στατική δρομολόγηση, το βάρος είναι 0. Αν έχουμε το πρωτόκολλο OLSR, το βάρος είναι 10. Αν έχουμε δημιουργήσει στατικές εγγραφές στον πίνακα δρομολόγησης, τότε αυτές θα προτιμηθούν έναντι των εγγραφών που δημιουργούνται από το πρωτόκολλο δρομολόγησης στον πίνακα δρομολόγησης. 34
Τροποποίηση του αρχικού σεναρίου προσομοίωσης (2/2) Εγκαθιστούμε σε όλους τους κόμβους του δικτύου, το OLSR πρωτόκολλο δρομολόγησης. Εισάγεται το κομμάτι κώδικα (δεξιά) μετά από το σημείο που ορίζουμε τις θέσεις και την κινητικότητα των κόμβων. // Enable OLSR OlsrHelper olsr; Ipv4StaticRoutingHelper staticrouting; Ipv4ListRoutingHelper list; list.add (staticrouting, 0); list.add (olsr, 10); InternetStackHelper stack; stack.setroutinghelper (list); stack.install (wifistanodes); Ipv4AddressHelper address; address.setbase ("10.1.3.0", "255.255.255.0"); 35
Ασκήσεις (συνέχεια) 8. Εκτελέστε πάλι το σενάριο προσομοίωσης κι απαντήστε ξανά στις ερωτήσεις 1 έως 3. Δώστε μία σύντομη εξήγηση για τα νέα αποτελέσματα. 36
Βιβλιογραφία 1. Βασικές Αρχές Ασύρματης Επικοινωνίας, David Tse, Pramod Viswanath, Εκδόσεις Κλειδάριθμος 2. ΔΙΚΤΥΑ ΚΙΝΗΤΩΝ & ΠΡΟΣΩΠΙΚΩΝ ΕΠΙΚΟΙΝΩΝΙΩΝ, Θεολόγου Μ., Εκδοτικός Οίκος: ΤΖΙΟΛΑ Έτος έκδοσης: 2007 ISBN: 978-960-418-126-1 3. Εισαγωγή στα ασύρματα συστήματα, Black, Dipiazza, Ferguson 4. Συστήματα Κινητών Επικοινωνιών, Κανάτας Αθανάσιος,Κωνσταντίνου Φίλιππος,Πάντος Γεώργιος 37
Τέλος Ενότητας