This shows you the differences between two versions of the page.
isrm:laboratoare:01 [2016/09/28 21:02] dragos.niculescu |
isrm:laboratoare:01 [2016/10/05 12:46] (current) dragos.niculescu |
||
---|---|---|---|
Line 1: | Line 1: | ||
==== Laboratorul 1 ==== | ==== Laboratorul 1 ==== | ||
- | == Ne jucăm! == | + | Citim tutoriale și rulăm exemple. Textul de mai jos este bazat pe ghidul [[ http://nile.wpi.edu/NS/ | NS by example ]] de J. Chung și M. Claypool. |
- | [[ http://www.medcalf.com/games/cisco_games/game_page.html?userName=Melissa&game=wireless | Wireless Explorer ]] doar câteva nivele LOL. | + | |
- | + | ||
- | În continuare, citim tutoriale și rulăm exemple. Textul de mai jos este bazat pe ghidul [[ http://nile.wpi.edu/NS/ | NS by example ]] de J. Chung și M. Claypool. | + | |
== Introducere în ns2 == | == Introducere în ns2 == | ||
Line 12: | Line 9: | ||
== Limbajul OTcl == | == Limbajul OTcl == | ||
- | NS-2 este în esență un interpretor de OTcl cu biblioteci de obiecte C++ specializate în simularea rețelelor. Este necesar să se cunoască sumar programarea în OTcl pentru a utiliza NS-2. Această secțiune prezintă un exemplu OTcl care ilustrează ideea de bază a programării în OTcl, exemplu importat din manualul oficial NS-2. Această secțiune, ca și secțiunile următoare presupun că cititorul a instalat NS-2, și este familiarizat cu C++. | + | NS-2 este în esență un interpretor de OTcl cu biblioteci de obiecte C++ specializate în simularea rețelelor. Este necesar să se cunoască sumar programarea în OTcl pentru a utiliza NS-2. Această secțiune prezintă un exemplu OTcl care ilustrează ideea de bază a programării în OTcl, exemplu importat din manualul oficial NS-2. Această secțiune, ca și secțiunile următoare presupun că cititorul a instalat NS-2, și este familiarizat cu shell și cu C++. |
- | Primul exemplu este un script general OTcl, care arată modul de declarare o procedură și a o apela, modul de a atribui valori variabilelor, și modul de a implementa o buclă. OTcl este de fapt extensia orientată obiect a TCL(pronunțat "tickle"), relația dintre Tcl și Otcl este la fel ca și cea dintre C și C++, dar în acest laborator rareori sunt folosite obiectele în OTcl. Pentru a rula acest script rulați "ns ex-tcl.tcl" la promptul shell - comanda "ns" execută NS-2 (interpretorul OTcl). Veți obține aceleași rezultate dacă tastați "tclsh ex-tcl.tcl", în cazul în care tcl8.0 este instalat pe mașina dumneavoastră. | + | Primul exemplu este un script general OTcl, care arată modul de declarare o procedură și a o apela, modul de a atribui valori variabilelor, și modul de a implementa o buclă. OTcl este de fapt extensia orientată obiect a Tcl(pronunțat "tickle"), relația dintre Tcl și Otcl este la fel ca și cea dintre C și C++, dar în acest laborator rareori sunt folosite obiectele în OTcl. Pentru a rula acest script rulați "ns ex-tcl.tcl" la promptul shell - comanda "ns" execută NS-2 (interpretorul OTcl). Veți obține aceleași rezultate dacă tastați "tclsh ex-tcl.tcl", în cazul în care tcl8.0 este instalat pe mașina dumneavoastră. |
<file tcl ex-tcl.tcl> | <file tcl ex-tcl.tcl> | ||
Line 36: | Line 33: | ||
</file> | </file> | ||
- | In Tcl, the keyword proc is used to define a procedure, followed by an procedure name and arguments in curly brackets. The keyword set is used to assign a value to a variable. [expr ...] is to make the interpreter calculate the value of expression within the bracket after the keyword. One thing to note is that to get the value assigned to a variable, $ is used with the variable name. The keyword puts prints out the following string within double quotation marks. The following shows the result of Example 1. | ||
- | În Tcl, cuvântul cheie ''proc'' este folosit pentru a defini o procedură, urmat de un nume de procedură și argumentele în acolade. Cuvântul cheie ''set'' este folosit pentru a atribui o valoare unei variabile. ''[Expr ...]'' este pentru a calcula valoarea expresiei între paranteze drepte, după cuvântul cheie. Un lucru de remarcat este faptul că pentru a obține valoarea atribuită unei variabile, ''$'' este utilizat cu numele variabilei. Cuvântul cheie ''puts'' imprimă șirul de caractere la consolă. Rulănd exemplul de mai sus, se obține: | + | În Tcl, cuvântul cheie ''proc'' este folosit pentru a defini o procedură, urmat de un nume de procedură și argumentele în acolade. Cuvântul cheie ''set'' este folosit pentru a atribui o valoare unei variabile. ''[Expr ...]'' este pentru a calcula valoarea expresiei între paranteze drepte, după cuvântul cheie. Un lucru de remarcat este faptul că pentru a obține valoarea atribuită unei variabile, ''$'' este utilizat cu numele variabilei (ca în shell). Cuvântul cheie ''puts'' imprimă șirul de caractere la consolă. Rulând exemplul de mai sus, se obține: |
<code> | <code> | ||
Line 53: | Line 49: | ||
</code> | </code> | ||
- | == Simple Simulation Example == | + | == Primul exemplu de simulare == |
Această secțiune prezintă un script simplu NS-2 si explica ce face fiecare linie. Exemplul este un script OTcl care creează o configurație de rețea simplă și rulează scenariul de simulare din figura de mai jos. Pentru a rula această simulare, descărcați "ns-simple.tcl" și rulați "ns ns-simple.tcl" în shell. | Această secțiune prezintă un script simplu NS-2 si explica ce face fiecare linie. Exemplul este un script OTcl care creează o configurație de rețea simplă și rulează scenariul de simulare din figura de mai jos. Pentru a rula această simulare, descărcați "ns-simple.tcl" și rulați "ns ns-simple.tcl" în shell. | ||
Line 68: | Line 64: | ||
$ns color 1 Blue | $ns color 1 Blue | ||
$ns color 2 Red | $ns color 2 Red | ||
+ | |||
+ | #Open the NAM trace file | ||
+ | set nf [open out.nam w] | ||
+ | $ns namtrace-all $nf | ||
+ | |||
+ | #ns trace file | ||
+ | set tracefd [open simple.tr w] | ||
+ | $ns use-newtrace | ||
+ | $ns trace-all $tracefd | ||
+ | |||
#Create four nodes | #Create four nodes | ||
Line 120: | Line 126: | ||
$cbr set rate_ 1mb | $cbr set rate_ 1mb | ||
$cbr set random_ false | $cbr set random_ false | ||
- | |||
- | #Open the NAM trace file | ||
- | set nf [open out.nam w] | ||
- | $ns namtrace-all $nf | ||
#Define a 'finish' procedure | #Define a 'finish' procedure | ||
Line 153: | Line 155: | ||
</file> | </file> | ||
- | În continuare, descriem script-ul de mai sus. În general, un script NS-2 începe cu o instanță a obiectului simulator: | + | == Descrierea script-ului == |
+ | |||
+ | În general, un script NS-2 începe cu o instanță a obiectului simulator: | ||
* ''set ns [new Simulator]'' generează un obiect de tip simulator și îl atribuie variabilei //ns// (caracterele cursive sunt folosite pentru variabile și valori). Această linie: | * ''set ns [new Simulator]'' generează un obiect de tip simulator și îl atribuie variabilei //ns// (caracterele cursive sunt folosite pentru variabile și valori). Această linie: | ||
* inițializează formatul pachetelor (ignorați acest lucru deocamdată) | * inițializează formatul pachetelor (ignorați acest lucru deocamdată) | ||
Line 165: | Line 169: | ||
* specifică opțiunile NAM (network animator) | * specifică opțiunile NAM (network animator) | ||
- | Cele mai multe dintre funcțiile sunt pentru configurarea simularii și pentru planificare, iar unele dintre ele sunt pentru animatorulul NAM. Alte setăriu ale simulatorului pot fi consultate în fișierul ''ns-2 / TCL / lib / ns-lib.tcl''. | + | Cele mai multe dintre funcții sunt pentru configurarea simularii și pentru planificare, iar unele dintre ele sunt pentru animatorulul NAM. Multe alte setări ale simulatorului pot fi consultate în fișierul ''ns-2 / TCL / lib / ns-lib.tcl''. |
- | * ''$ns color fid color'' stabilește culoarea pachetelor pentru un flux specificat de id-ul fluxului (FID). Acest membru al obiectului "Simulator" este pentru afișajul NAM, și nu are nici un efect asupra simulării propriuzise. | + | * ''$ns color fid color'' stabilește culoarea pachetelor pentru un flux specificat de id-ul fluxului (fid). Acest membru al obiectului "simulator" este pentru afișajul NAM, și nu are nici un efect asupra simulării propriuzise. |
* ''$ns namtrace-all file-descriptor'' Acest membru specifică un fișier trace de simulare în format specific NAM. Acesta oferă numele de fișier pe care informațiile de trace vor fi scrise mai târziu de comandă ''$ns flush-trace''. În mod similar, ''trace-all'' este pentru înregistrarea trace-urilor de simulare într-un format general. | * ''$ns namtrace-all file-descriptor'' Acest membru specifică un fișier trace de simulare în format specific NAM. Acesta oferă numele de fișier pe care informațiile de trace vor fi scrise mai târziu de comandă ''$ns flush-trace''. În mod similar, ''trace-all'' este pentru înregistrarea trace-urilor de simulare într-un format general. | ||
- | * ''proc finish {}'' este rulată ls sfârșitul simulării când se interpretează comanda ''$ns at 15.0 "finish"''. În această funcție, sunt specificate procesări post-simulare. | + | * ''proc finish {}'' este rulată la sfârșitul simulării când se interpretează comanda ''$ns at 15.0 "finish"''. În această funcție, sunt specificate diverse procesări post-simulare. |
- | * ''set n0 [$ns node]'' Funcția membru ''node'' creează un nod nou. Un nod în NS-2 este un obiect compus din adresa si port clasificator. Utilizatorii pot crea un nod prin crearea separată a adresei și a unui port clasificator, și conectarea lor ulterioară. Pentru a vedea modul în care se creează un nod, se pot consulta fișierele: "ns-2 / tcl / libs / ns-lib.tcl" și "ns-2 / tcl / libs / ns-node.tcl". | + | * ''set n0 [$ns node]'' Funcția membru ''node'' creează un nod nou. Un nod în NS-2 este un obiect compus din adresa si port clasificator. Utilizatorii pot crea un nod prin crearea separată a adresei și a unui port clasificator, și conectarea lor ulterioară. Pentru a vedea modul în care se creează un nod, se pot consulta fișierele: ''ns-2 / tcl / libs / ns-lib.tcl'' și ''ns-2 / tcl / libs / ns-node.tcl''. |
* ''$ns duplex-link node1 node2 bandwidth delay queue-type'' creează **două** legături simplex de bandă și întârziere specificate, pentru a conecta cele două noduri. În NS-2, coada de ieșire a unui nod este implementată ca parte a unei legături, prin urmare, utilizatorii ar trebui să specifice tipul de coadă atunci când crează legături. În script-ul de mai sus, este utilizată coadă de tip DropTail. În cazul în care se dorește o coadă RED, pur și simplu se înlocuiește DropTail cu RED. Implementarea NS-2 a unei legături este prezentată într-o secțiune ulterioară. Ca și nodurile, link-urile sunt obiect compuse, deci se pot crea sub-obiecte ce pot fi conectate. Codul sursă pentru legături poate fi găsit în "ns-2 / tcl / libs / ns-lib.tcl" și "ns-2 / tcl / libs / ns-link.tcl". Se remarcă faptul că se pot insera modulele de eroare într-o legătură pentru a simula o legătură cu pierderi (de fapt, utilizatorii pot crea și insera orice obiect de rețea). Consultați documentația pentru NS pentru detalii. | * ''$ns duplex-link node1 node2 bandwidth delay queue-type'' creează **două** legături simplex de bandă și întârziere specificate, pentru a conecta cele două noduri. În NS-2, coada de ieșire a unui nod este implementată ca parte a unei legături, prin urmare, utilizatorii ar trebui să specifice tipul de coadă atunci când crează legături. În script-ul de mai sus, este utilizată coadă de tip DropTail. În cazul în care se dorește o coadă RED, pur și simplu se înlocuiește DropTail cu RED. Implementarea NS-2 a unei legături este prezentată într-o secțiune ulterioară. Ca și nodurile, link-urile sunt obiect compuse, deci se pot crea sub-obiecte ce pot fi conectate. Codul sursă pentru legături poate fi găsit în "ns-2 / tcl / libs / ns-lib.tcl" și "ns-2 / tcl / libs / ns-link.tcl". Se remarcă faptul că se pot insera modulele de eroare într-o legătură pentru a simula o legătură cu pierderi (de fapt, utilizatorii pot crea și insera orice obiect de rețea). Consultați documentația pentru NS pentru detalii. | ||
* ''$ns queue-limit node1 node2 number'' Această linie stabilește dimensiunea cozii de așteptare a celor două legături simplex care conectează node1 și node2. Aruncați o privire la "ns-2 / tcl / libs / ns-lib.tcl" și "ns-2 / tcl / libs / ns-link.tcl", sau documentația NS-2 pentru mai multe informații. | * ''$ns queue-limit node1 node2 number'' Această linie stabilește dimensiunea cozii de așteptare a celor două legături simplex care conectează node1 și node2. Aruncați o privire la "ns-2 / tcl / libs / ns-lib.tcl" și "ns-2 / tcl / libs / ns-link.tcl", sau documentația NS-2 pentru mai multe informații. | ||
Line 185: | Line 189: | ||
* ''$ns at time “string”'' Această funcție programează executarea șirului specificat la un moment de simulare. De exemplu, ''$ns at 0.1 "$CBR start"'' va face scheduler-ul să apeleze o funcție membru de start al obiectului ''$CBR'' la momentul ''0.1s''. În NS-2, o sursă de trafic nu transmite date reale, ci notifică agentul care de la baza o anumită cantitate de date, iar agentul, creează pachete și le trimite în mod fidel implementărilor din kernel, **considerând un CPU cu viteză infinită**. | * ''$ns at time “string”'' Această funcție programează executarea șirului specificat la un moment de simulare. De exemplu, ''$ns at 0.1 "$CBR start"'' va face scheduler-ul să apeleze o funcție membru de start al obiectului ''$CBR'' la momentul ''0.1s''. În NS-2, o sursă de trafic nu transmite date reale, ci notifică agentul care de la baza o anumită cantitate de date, iar agentul, creează pachete și le trimite în mod fidel implementărilor din kernel, **considerând un CPU cu viteză infinită**. | ||
- | După ce sunt efectuate toate specificațiile de configurare a rețelei, programarea și procedura de post-simulare, singurul lucru rămas este de a rula simulare. Acest lucru se face prin ''$ns run''. | + | După ce s-au efectuat toate specificațiile de configurare a rețelei, specificat procedura post-simulare, singurul lucru rămas este rularea propriu-zisă. Acest lucru se face cu funcția ''$ns run''. |
- | * La rularea cu ''ns ./ns-simple.tcl'' , se execută scriptul care generează "filmul simulării" out.name, și se lansează animatorul ''nam''. Rulați slide-ul în animator pentru a accelera filmul, observați transferul pachetelor și comportarea cozii din nodul 2 | + | * La rularea din shell ''ns ./ns-simple.tcl'', se execută simularea și se generează "filmul simulării" out.nam, apoi se lansează animatorul ''nam''. Rulați slide-ul în animator pentru a accelera filmul, observând transferul pachetelor și comportarea cozii din nodul 2. |
== Trasarea unui grafic == | == Trasarea unui grafic == | ||
ns2 permite implementarea cu ușurință a procedurilor specializate de generare de loguri. Aceste proceduri sunt apelate periodic în timpul simulării și permit adresarea tuturor datelor specifice nodurilor, fluxurilor, cozilor, și ale celorlalte entități din rețea. | ns2 permite implementarea cu ușurință a procedurilor specializate de generare de loguri. Aceste proceduri sunt apelate periodic în timpul simulării și permit adresarea tuturor datelor specifice nodurilor, fluxurilor, cozilor, și ale celorlalte entități din rețea. | ||
- | În partea de final a scriptului de mai sus, inserați codul următor. Apelată periodic, această procedură contorizează numărul de octe ți primiți de destinația UDP, și numărul de octeți confirmați la sursa TCP. În acest mod, se poate calcula debitul obținut de cele două fluxuri pe intervale fixe de timp. Cele două valori sunt stocate periodic într-un fișier text ''out.tr''. | + | În partea de final a scriptului de mai sus, inserați patch-ul următor. Apelată periodic, această procedură contorizează numărul de octe ți primiți de destinația UDP, și numărul de octeți confirmați la sursa TCP. În acest mod, se poate calcula debitul obținut de cele două fluxuri pe intervale fixe de timp. Cele două valori sunt stocate periodic într-un fișier text ''out.tr''. |
<file tcl> | <file tcl> | ||
#Open a trace file | #Open a trace file | ||
Line 229: | Line 233: | ||
</file> | </file> | ||
În plus, înainte de a demara simularea, trebuie să armăm procedura record cu ''$ns at 0.0 "record"''. | În plus, înainte de a demara simularea, trebuie să armăm procedura record cu ''$ns at 0.0 "record"''. | ||
- | După execuția scriptului, se vor lansa automat atât fereastra animatorului, cât și o fereastră gnuplot care afișează conținutul fișierului trace ''out.tr'' | + | După execuția scriptului, se vor lansa automat atât fereastra animatorului, cât și o fereastră gnuplot care afișează conținutul fișierului trace ''out.tr''. {{ :isrm:laboratoare:01:lab1-gnuplot.png?nolink&300 |}} |
+ | |||
+ | == Task-uri == | ||
- examinați cu editorul de text conținutul fișierelor ''out.nam'' și ''out.tr'' | - examinați cu editorul de text conținutul fișierelor ''out.nam'' și ''out.tr'' | ||
- Ce reprezintă axele x, y? Explicați comportarea graficelor. | - Ce reprezintă axele x, y? Explicați comportarea graficelor. | ||
- Măriți coada de la link-ul bottleneck la 100. Cum explicați noua comportare? | - Măriți coada de la link-ul bottleneck la 100. Cum explicați noua comportare? | ||
- Coada aruncă pachete TCP în mod disproporționat. De ce? Folosiți o coadă SFQ pentru a remedia situația. | - Coada aruncă pachete TCP în mod disproporționat. De ce? Folosiți o coadă SFQ pentru a remedia situația. | ||
+ | - În prezent se măsoară debitul la fiecare 250ms. Experimentați cu diverse rezoluții de măsurare în funcția "record". | ||
+ | - **Facultativ**: monitorizarea cozii ([[http://www.mathcs.emory.edu/~cheung/Courses/558-old/Syllabus/90-NS/trace.html#QMon| formatul ]] trace-ului queue) | ||
+ | <code tcl> | ||
+ | set qfile [$ns monitor-queue $n2 $n3 [open queue.tr w] 0.1] | ||
+ | [$ns link $n2 $n3] queue-sample-timeout | ||
+ | </code> | ||
+ | |||
+ | |||
+ | == Ne jucăm! == | ||
+ | [[ http://www.cisco.com/E-Learning/prod/curriculum/cco_tdo_ldd/demos/DandEguideSPN/SpaceGame/remote.html | Wireless Explorer ]] câteva nivele LOL. | ||
+ | |||