ίκτυα Υπολογιστών Εργαστήριο 1 Υπεύθυνος : Τσαουσίδης Βασίλης Βοηθός : Μαµάτας Λευτέρης Τί είναι ο Network Simulator-2 Ο Network Simulator-2 (NS-2) είναι ένας αντικειµενοστρεφής προσοµοιωτής δικτύων, γραµµένος σε C++ και OTcl (αντικειµενοστρεφής έκδοση της γλώσσας TCL). Στον NS-2 είναι ενσωµατωµένα τα γνωστότερα δικτυακά πρωτόκολλα, όπως π.χ τα πρωτόκολλα TCP και UDP, πρωτόκολλα εφαρµογής (FTP, Telnet, Web, CBR), προσοµοιώσεις διαχείρισης ουρών δροµολογητών (DropTail, RED), δροµολόγησης κτλ. Οι προγραµµατιστές του NS-2 προκειµένου να ισορροπήσουν ανάµεσα στην υψηλού επιπέδου υλοποίηση και στην ευκολία προγραµµατισµού χώρισαν τον προσοµοιωτή σε δύο τµήµατα. Το ένα τµήµα (κυρίως για την διασύνδεση µε τον χρήστη) είναι γραµµένο στη γλώσσα OTcl ώστε να µην χρειάζεται ο απλός χρήστης να γνωρίζει την δυσκολότερη αλλά πανίσχυρη C++ προκειµένου να τον χρησιµοποιήσει. Ο υπόλοιπος κώδικας του NS-2 είναι γραµµένος στην γλώσσα C++ ώστε το αποτέλεσµα να είναι υψηλού επιπέδου και να είναι αποδοτικός σε σχέση µε την ταχύτητα. ηλαδή, ένα δικτυακό πρόβληµα µπορεί να εκφραστεί µόνο µε την OTcl, µόνο µε την C++ ή και µε συνδυασµό των δύο. Συνήθως η παραµετροποίηση του προβλήµατος γίνεται µε την OTcl για µεγαλύτερη ταχύτητα και ευκολία, ενώ το υπόλοιπο πρόβληµα χρησιµοποιεί κώδικα C++. Τα αντικείµενα της C++ έχουν αναπαρασταθεί και σαν αντικείµενα της OTcl, έτσι ώστε να µπορεί να εκφράσει κάποιος ένα πρόβληµα και µε τους δύο τρόπους. Λίγα λόγια για την OTcl Η OTcl αποτελεί την αντικειµενοστρεφή έκδοση της TCL. Είναι µια αρκετά εύκολη στη χρήση γλώσσα προγραµµατισµού. Με την ϐοήθεια της, συνήθως παραµετροποιούµε και περιγράφουµε ένα σύστηµα, την λειτουργία του οποίου προσοµοιώνουµε µε την ϐοήθεια του NS-2. Με την δήλωση set ϑέτουµε µια τιµή σε µία µεταβλητή ή δηµιουργούµε το στιγµιαίο δείγµα (instance) ενός αντικειµένου : Set a 43 1
# Writing a procedure called "test" proc test { { set a 43 set b 27 set c [expr $a + $b] set d [expr [expr $a - $b] * $c] for {set k 0 {$k < 10 {incr k { if {$k < 5 { puts "k < 5, pow = [expr pow($d, $k)]" else { puts "k >= 5, mod = [expr $d % $k]" # Calling the "test" procedure created above test Κώδικας 1: Βασικός κώδικας ενός OTcl Script του NS-2 Θέτουµε στη µεταβλητή a την τιµή 43. Οταν χρησιµοποιούµε την τιµή µιας µεταβλητής ϐάζουµε πάντα πρίν από αυτήν τον χαρακτήρα $. Για να δηµιουργήσουµε το instance ενός αντικειµένου : set ns [new Simulator] µε την δήλωση αυτή δηµιουργούµε ένα Simulator αντικείµενο που ονο- µάζεται ns. Στο παραπάνω παράδειγµα δηµιουργούµε µια µέθοδο µε ονοµασία test και την εκτελούµε. Οι µαθηµατικές πράξεις γίνονται µε την ϐοήθεια της δεσµευµένης λέξης expr. ηλαδή µε την ϐοήθεια της παρακάτω εντολής ϑέτουµε στη µεταβλητή c το άθροισµα των µεταβλητών a και b : set c [expr $a + $b] Με την µέθοδο puts τυπώνουµε στην οθόνη. Π.χ : puts "Program Started" Η ϐασική µέθοδος επανάληψης είναι η for : for {set k 0 {$k < 10 {incr k 2
Αποτελεί την ισοδύναµη µέθοδο της C: for (k=0;k<10;k++) Ολα τα παραδείγµατα που ϑα µας απασχολήσουν ϑα έχουν κοινό τον κώδικα 2. Ο κώδικας αυτός περιέχεται στο αρχείο template.tcl. Σε κάθε παράδειγµα, ϑα συµπληρώνουµε δικές µας εντολές στο template.tcl. Πείραµα 1 Επιλέγουµε το εικονίδιο ns.bat από την επιφάνεια εργασίας. Στη συνέχεια δίνουµε τις παρακάτω εντολές : Αντιγράφουµε το αρχείο template.tcl ώστε να µην ξαναγράψουµε τον ϐασικό κώδικα : copy template.tcl example1.tcl Για να προσθέσουµε κώδικα στο αρχείο µε όνοµα example1.tcl, το ανοίγουµε µε την ϐοήθεια της εφαρµογής notepad. Ετσι, ανοίγουµε το notepad µε την ϐοήθεια του Start Menu ή απλά δίνουµε την παρακάτω εντολή : notepad example1.tcl Γράφουµε τον κώδικα που ϑέλουµε να προσθέσουµε και σώζουµε το αρχείο µε τον συνδιασµό πλήκτρων ctrl+s ή επιλέγουµε File και µετά Save. Για να εκτελέσουµε τον κώδικα που έχουµε γράψει δίνουµε την εντολή : ns example1.tcl ηµιουργία τοπολογίας και Link Στο σηµείο αυτό δηλώνουµε µια πολύ απλή τοπολογία που αποτελείται από δύο κόµβους (nodes) οι οποίοι συνδέονται µε την ϐοήθεια ενός link. Ετσι µε την ϐοήθεια του επεξεργαστή κειµένου notepad προσθέτουµε τον παρακάτω κώδικα στο σηµείο που δηλώνεται µε σχόλιο (αρχίζει µε τον χαρακτήρα #) ότι ϐάζουµε τον κώδικα µας (πρίν από την δήλωση $ns at 5.0 "finish") set n0 [$ns node] set n1 [$ns node] 3
Με τον κώδικα αυτό δηλώνουµε ότι δηµιουργούµε δύο κόµβους µε ονό- µατα n0 και n1. Η επόµενη σειρά ενώνει τους δύο κόµβους µε ένα link µε τα στοιχεία (Duplex link, Bandwidth 1 Megabit, καθυστέρηση 5ms, τύπος ουράς DropTail) $ns duplex-link $n0 $n1 1Mb 5ms DropTail Στο σηµείο αυτό σώζουµε το αρχείο (µε ctrl+s και εκτελούµε τον κώδικα µας : ns example1.tcl Ετσι ϑα δούµε το παρακάτω σχήµα µε την ϐοήθεια του προγράµµατος network animator (nam) : ηλαδή δύο κόµβους (τους 1 και 2) και ένα link που τους συνδέει. Αποστολή εδοµένων Προφανώς το παράδειγµα αυτό δεν είναι πολύ προχωρηµένο, εφόσον µπο- ϱούµε µόνο να δούµε την τοπολογία χωρίς να γίνεται κάτι περισσότερο. Ετσι, το επόµενο ϐήµα είναι να στείλουµε δεδοµένα από τον κόµβο n0 στον κόµβο n1. Στον NS-2, τα δεδοµένα στέλνονται πάντα από έναν πράκτορα (agent) σε έναν άλλον. Εποµένως, στη συνέχεια ϑα δηµιουργήσουµε ένα αντικείµενο τύπου agent το οποίο στέλνει δεδοµένα από τον κόµβο n0 και ένα αντικείµενο τύπου agent το οποίο δέχεται τα δεδοµένα στον κόµβο n1. Αυτά γίνονται µε την ϐοήθεια του παρακάτω κώδικα : ηµιουργούµε έναν UDP Agent και τον τοποθετούµε στον κόµβο n0 4
set udp0 [new Agent/UDP] $ns attach-agent $n0 $udp0 ηµιουργούµε µια πηγή παραγωγής πακέτων CBR (Constant Bit Rate) και την τοποθετούµε στον agent που δηµιουργήσαµε. set cbr0 [new Application/Traffic/CBR] $cbr0 set packetsize_ 500 $cbr0 set interval_ 0.005 $cbr0 attach-agent $udp0 Το πρωτόκολλο εφαρµογής CBR αποτελεί µια πηγή σταθερού δικτυακού ϕόρτου (δηµιουργεί µε σταθερό ϱυθµό UDP πακέτα). Το µέγεθος του κάθε πακέτου ϑα είναι 500 bytes (packetsize) και ϑα αποστέλλονται κάθε 0,005 δευτερόλεπτα (interval). Οι επόµενες σειρές δηµιουργούν έναν agent τύπου Null (δηλαδή έναν απαγωγό πακέτων) και τον ϑέτουν στον κόµβο n1. set null0 [new Agent/Null] $ns attach-agent $n1 $null0 Οι δύο agents ϑα πρέπει να συνδεθούν µεταξύ τους. $ns connect $udp0 $null0 Στο σηµείο αυτό ϑα πρέπει να πούµε στον CBR agent πότε να αρχίσει να στέλνει δεδοµένα και πότε να σταµατήσει. Το καλύτερο σηµειό για να τοποθετήσουµε αυτόν τον κώδικα είναι πρίν την σειρά $ns at 5.0 finish. $ns at 0.5 "$cbr0 start" $ns at 4.5 "$cbr0 stop" ηλαδή ο CBR agent ϑα αρχίσει να στέλνει δεδοµένα την χρονική στιγµή 0.5 sec µέχρι την στιγµή 4.5 sec. Στο σηµείο αυτό ξανασώζουµε το αρχείο µας και ξεκινάµε την προσοµοίωση. Μόλις πατήσουµε το πλήκτρο "play" στο παράθυρο της εφαρµογής nam, ϑα δούµε ότι µετά από 0.5 δευτερόλεπτα ο κόµβος 0 αρχίζει να στέλνει δεδοµένα στον κόµβο 1. Μπορούµε να χαµηλώσουµε τον ϱυθµό αποστολής δεδοµένων µε την ϐοήθεια της µπάρας "step". Θα προκύψει το παρακάτω σχήµα : 5
Μπορούµε να επιλέξουµε κάποιο πακέτο για να δούµε πληροφορίες για αυτό. Πειράζουµε τις τιµές των παραµέτρων της πηγής CBR δικτυακού ϕόρτου και παρατηρούµε τις διαφορές : $cbr0 set packetsize_ 500 $cbr0 set interval_ 0.005 6
#Dimiourgoume ena antikeimeno typou Simulator set ns [new Simulator] #Anoigoume ena arxeio me onoma out.nam kai katagrafoume ta #apotelesmata. set nf [open out.nam w] $ns namtrace-all $nf #Orizoume mia diadikasia me onoma finish h #opoia kleinei to arxeio out.nam kai trexei thn #efarmogh Network Animator (nam) h opoia mas #deixnei epoptika auta pou katagrafikan sto arxeio #auto. proc finish { { global ns nf $ns flush-trace #Close the trace file close $nf #Execute nam on the trace file exec nam out.nam & exit 0 #Edw topothetoume ton diko mas kwdika #Meta apo 5 deuterolepta xronou prosomoiwshs #kaloume thn methodo finish. $ns at 5.0 "finish" #Trexoume thn prosomoiwsh $ns run Κώδικας 2: Ο κώδικας του αρχείου template.tcl 7