This shows you the differences between two versions of the page.
isrm:laboratoare:02 [2018/01/19 16:03] dragos.niculescu |
isrm:laboratoare:02 [2019/02/28 20:45] (current) mbarbulescu |
||
---|---|---|---|
Line 37: | Line 37: | ||
</file> | </file> | ||
Poate fi plotat scriind: | Poate fi plotat scriind: | ||
- | <code> | + | <code gnuplot> |
set style line 1 lc rgb '#0060ad' lt 1 lw 2 pt 7 ps 3.5 | set style line 1 lc rgb '#0060ad' lt 1 lw 2 pt 7 ps 3.5 | ||
plot 'data1' with linespoints ls 1 | plot 'data1' with linespoints ls 1 | ||
Line 44: | Line 44: | ||
Aici setăm tipul de punct (pt) și dimensiunea punctului | Aici setăm tipul de punct (pt) și dimensiunea punctului | ||
(ps), și culoarea (lc) de utilizat. Pentru stilurile de puncte și linii disponibile, puteți să | (ps), și culoarea (lc) de utilizat. Pentru stilurile de puncte și linii disponibile, puteți să | ||
- | rulați comanda test la promptul gnuplot. Imaginea rezultată este | + | rulați comanda **test** la promptul gnuplot. Imaginea rezultată este |
{{ :isrm:laboratoare:02:gnuplot:plotting_data1.png?nolink |}} | {{ :isrm:laboratoare:02:gnuplot:plotting_data1.png?nolink |}} | ||
Line 82: | Line 82: | ||
Și plotăm cu comenzile: | Și plotăm cu comenzile: | ||
- | <code> | + | <code gnuplot> |
# albastru: | # albastru: | ||
set line style 1 lc rgb '# 0060ad' lt 1 lw 2 pt 7 ps 3.5 | set line style 1 lc rgb '# 0060ad' lt 1 lw 2 pt 7 ps 3.5 | ||
Line 131: | Line 131: | ||
Vom plota astfel: | Vom plota astfel: | ||
- | <code shell> | + | <code gnuplot> |
set xrange [ -2 : 52 ] | set xrange [ -2 : 52 ] | ||
set yrange [ 0 : 0.12 ] | set yrange [ 0 : 0.12 ] | ||
Line 158: | Line 158: | ||
directă a datelor de intrare: | directă a datelor de intrare: | ||
- | <code shell> | + | <code gnuplot> |
set yrange [ 0:120 ] | set yrange [ 0:120 ] | ||
- | plot 'battery.dat' using 1:($2*1000):($4*1000)\ | + | plot 'battery.dat' using 1:($2*1000):($3*1000)\ |
w yerrorbars ls 1 | w yerrorbars ls 1 | ||
</code> | </code> | ||
Line 168: | Line 168: | ||
În ultimul grafic adăugăm date teoretice și o legendă: | În ultimul grafic adăugăm date teoretice și o legendă: | ||
- | <code > | + | <code gnuplot> |
# Legendă | # Legendă | ||
set key at 50,112 | set key at 50,112 | ||
Line 175: | Line 175: | ||
# Curba teoretică | # Curba teoretică | ||
P(x) = 1.53**2 * x/(5.67 + x)**2 * 1000 | P(x) = 1.53**2 * x/(5.67 + x)**2 * 1000 | ||
- | plot 'battery.dat' using 1:($2*1000):($4*1000) \ | + | plot 'battery.dat' using 1:($2*1000):($3*1000) \ |
title "Power" w yerr ls 2 , \ | title "Power" w yerr ls 2 , \ | ||
P(x) title 'Theory' w lines ls 1 | P(x) title 'Theory' w lines ls 1 | ||
Line 190: | Line 190: | ||
* Alte comenzi utile gnuplot: | * Alte comenzi utile gnuplot: | ||
- | <code shell> | + | <code gnuplot> |
set term png # setează terminalul într-un format | set term png # setează terminalul într-un format | ||
set out 'file.png' # va plota într-un fisier | set out 'file.png' # va plota într-un fisier | ||
Line 203: | Line 203: | ||
- | * **Exercițiul 1** realizați folosind ''gnuplot'' graficul din laboratorul 1. Indicați semnificațiile axelor și legenda. Salvați imaginea în format ''png/svg'', și scriptul pentru restaurarea imaginilor. | + | **Exercițiul 1** realizați folosind ''gnuplot'' graficul din laboratorul 1. Indicați semnificațiile axelor și legenda. Salvați imaginea în format ''png/svg'', și scriptul pentru restaurarea imaginilor. |
- | * Exemplu<code> | + | * Exemplu<code gnuplot> |
plot 'out.tr' using 1:2 t "TCP" with lp, \ | plot 'out.tr' using 1:2 t "TCP" with lp, \ | ||
'out.tr' using 1:3 t "UDP" with lines lw 3 | 'out.tr' using 1:3 t "UDP" with lines lw 3 | ||
Line 218: | Line 218: | ||
=== 2. Introducere în awk === | === 2. Introducere în awk === | ||
* AWK (K vine de la Kernighan) este mic, simplu, și rapid, spre deosebire de perl sau python. Nu poți face tot ce faci în perl/python, dar poți face foarte ușor multe taskuri de procesare de text. Are o sintaxă apropiată de C, dar preferă datele organizate pe coloane, ca foarte multe date în rețelistică: trace-uri de simulare, tcpdump, loguri, etc. Un mare avantaj este ca poate fi rulat direct de pe linia de comandă, fără a mai folosi un script separat - de multe ori apare într-un pipeline cu cat, sed, tr. | * AWK (K vine de la Kernighan) este mic, simplu, și rapid, spre deosebire de perl sau python. Nu poți face tot ce faci în perl/python, dar poți face foarte ușor multe taskuri de procesare de text. Are o sintaxă apropiată de C, dar preferă datele organizate pe coloane, ca foarte multe date în rețelistică: trace-uri de simulare, tcpdump, loguri, etc. Un mare avantaj este ca poate fi rulat direct de pe linia de comandă, fără a mai folosi un script separat - de multe ori apare într-un pipeline cu cat, sed, tr. | ||
- | * În cazul cel mai des întâlnit, se specifică un program care este rulat succesiv pentru fiecare linie de intrare: <code>cat trace.out | awk '{print $2}'</code> afișează coloana a doua a fiecărei linii. De exemplu, pentru acest fișier: <file txt trace.out> | + | * În cazul cel mai des întâlnit, se specifică un program care este rulat succesiv pentru fiecare linie de intrare: <code awk>cat trace.out | awk '{print $2}'</code> afișează coloana a doua a fiecărei linii. De exemplu, pentru acest fișier: <file txt trace.out> |
10 2 0.2 | 10 2 0.2 | ||
11 3 0.3 | 11 3 0.3 | ||
Line 225: | Line 225: | ||
13 3 0.1 | 13 3 0.1 | ||
14 4 0.05 </file> | 14 4 0.05 </file> | ||
- | * <code>cat trace.out | awk '{print $1+$2, $2 $3, i++;}'</code> produce <code> | + | * <code awk>cat trace.out | awk '{print $1+$2, $2 $3, i++;}'</code> produce <code> |
12 20.2 0 | 12 20.2 0 | ||
14 30.3 1 | 14 30.3 1 | ||
Line 239: | Line 239: | ||
* tipurile sunt slabe - int, float, string, din context | * tipurile sunt slabe - int, float, string, din context | ||
* spațiu este operator de concatenare pe stringuri | * spațiu este operator de concatenare pe stringuri | ||
- | * <code>cat trace.out | awk 'NF==3 { s+=$3; n++} /1[2-3]/{print $0} END{print n, s/n}'</code> produce <code> | + | * <code awk>cat trace.out | awk 'NF==3 { s+=$3; n++} /1[2-3]/{print $0} END{print n, s/n}'</code> produce <code> |
12 2 0.2 | 12 2 0.2 | ||
13 3 0.1 | 13 3 0.1 | ||
Line 250: | Line 250: | ||
/********************** | /********************** | ||
- | - Exercițiul 2: Folosind <code>set qfile [$ns monitor-queue $n3 $n4 [open queue.tr w] 0.1] | + | - Exercițiul 2: Folosind <code tcl>set qfile [$ns monitor-queue $n3 $n4 [open queue.tr w] 0.1] |
[$ns link $n3 $n4] queue-sample-timeout; </code> | [$ns link $n3 $n4] queue-sample-timeout; </code> | ||
plotați dimensiunea în pachete cozii pe link-ul de ieșire [[http://www.mathcs.emory.edu/~cheung/Courses/558-old/Syllabus/90-NS/trace.html#QMon | Formatul]] fișierului queue.tr | plotați dimensiunea în pachete cozii pe link-ul de ieșire [[http://www.mathcs.emory.edu/~cheung/Courses/558-old/Syllabus/90-NS/trace.html#QMon | Formatul]] fișierului queue.tr | ||
* {{:isrm:laboratoare:02:lab02qsize.png?300|}} | * {{:isrm:laboratoare:02:lab02qsize.png?300|}} | ||
************************/ | ************************/ | ||
- | - **Exercițiul 2**: În laboratorul 1, folosiți <code tcl>$tcp attach [open tcp.tr w] | + | |
+ | **Exercițiul 2**: În laboratorul 1, folosiți <code tcl>$tcp attach [open tcp.tr w] | ||
$tcp trace cwnd_ | $tcp trace cwnd_ | ||
$tcp trace rtt_ </code> | $tcp trace rtt_ </code> | ||
Line 266: | Line 267: | ||
=== 3. comenzi utile de shell === | === 3. comenzi utile de shell === | ||
- | * <code> | + | * bash face toate calculele pe integer. <code bash> |
$ x=5 | $ x=5 | ||
$ echo $(($x / 3)) | $ echo $(($x / 3)) | ||
1 | 1 | ||
</code> | </code> | ||
- | + | * <code bash> | |
- | bash face toate calculele pe integer. | + | |
- | * <code> | + | |
$ awc() { awk "BEGIN{print $*}"; } | $ awc() { awk "BEGIN{print $*}"; } | ||
funcția poate fi adăugata la .bashrc | funcția poate fi adăugata la .bashrc | ||
- | $ echo "$x / 3" | + | $ awc "$x / 3" |
1.66667 | 1.66667 | ||
</code> | </code> | ||
- | * este necesar adesea să rulăm o buclă de pe linia de comandă <code> | + | * este necesar adesea să rulăm o buclă de pe linia de comandă <code bash> |
$for i in `seq 10 2 20`; do awc "$i / 10"; done | $for i in `seq 10 2 20`; do awc "$i / 10"; done | ||
1 | 1 | ||
Line 290: | Line 289: | ||
</code> | </code> | ||
* în multe cazuri se lucrează direct de la prompt pentru a pregăti datele de plotat | * în multe cazuri se lucrează direct de la prompt pentru a pregăti datele de plotat | ||
- | * script one liner <color red>**foarte des folosit în majoritatea laboratoarelor**</color>, datele vor fi pe ecran și în fișierul "out.a" <code> | + | * script one liner <color red>**foarte des folosit în majoritatea laboratoarelor**</color>, datele vor fi pe ecran și în fișierul "out.a" <code bash> |
$ i=1; while [ $i -le 10 ]; do echo -n "$i "; ns ./script.tcl -rate0 "$(($i*100))Kbps"| grep Throughput |head -n1 | awk '{print $2}'; i=$(($i+1)); done | tee ./out.a | $ i=1; while [ $i -le 10 ]; do echo -n "$i "; ns ./script.tcl -rate0 "$(($i*100))Kbps"| grep Throughput |head -n1 | awk '{print $2}'; i=$(($i+1)); done | tee ./out.a | ||
1 505744.0 | 1 505744.0 | ||
Line 346: | Line 345: | ||
* detaliu http://www.isi.edu/nsnam/ns/doc/node186.html | * detaliu http://www.isi.edu/nsnam/ns/doc/node186.html | ||
- | - Exercițiul 3: modificați ''simple-wireless.tcl'' din Marc Greis sec IX pentru | + | **Exercițiul 3**: modificați ''simple-wireless.tcl'' din Marc Greis sec IX pentru |
* a utiliza noul format de trace ( cu ''$ns_ use-newtrace'') | * a utiliza noul format de trace ( cu ''$ns_ use-newtrace'') | ||
* a monitoriza evenimentele de la nivelele 2 și 4 (agent și MAC) | * a monitoriza evenimentele de la nivelele 2 și 4 (agent și MAC) | ||
Line 364: | Line 363: | ||
* comparați pierderile între cadrele ACK și RTS (( ACK=0 pierderi, RTS=14 pierderi. Dacă nodurile sunt în apropiere, conversația RTS-CTS-Date-ACK se desfășoară cu bine, nu se pierd ACK-uri. La distanță mare, destinația nu răspunde la RTS, deci sunt pierdute, și nu se mai ajunge la ACK.)) | * comparați pierderile între cadrele ACK și RTS (( ACK=0 pierderi, RTS=14 pierderi. Dacă nodurile sunt în apropiere, conversația RTS-CTS-Date-ACK se desfășoară cu bine, nu se pierd ACK-uri. La distanță mare, destinația nu răspunde la RTS, deci sunt pierdute, și nu se mai ajunge la ACK.)) | ||
* justificați diferențele | * justificați diferențele | ||
- | - dezactivați RTS/CTS folosind <code>Mac/802_11 set RTSThreshold_ 3000</code> și comparați performanța TCP cu cazul precendent. Sugestie: plotați evoluția în timp a numerelor de secvență ((Numărul de secvență în timp este de fapt throughput. RTS-CTS introduce un overhead, de fapt timp pierdut, care duce la un throughput redus. )) | + | |
- | * <code> cat simple.tr | grep '^r' | grep AGT | grep tcp | grep -v ack | awk '{print $3, $47}' </code> | + | **Exercițiu 4** dezactivați RTS/CTS folosind <code>Mac/802_11 set RTSThreshold_ 3000</code> și comparați performanța TCP cu cazul precendent. Sugestie: plotați evoluția în timp a numerelor de secvență. Numărul de secvență în timp este de fapt throughput. RTS-CTS introduce un overhead, de fapt timp pierdut, care duce la un throughput redus. |
- | * {{:isrm:laboratoare:02:lab02tcp_rts.png?300|}} | + | * <code bash> cat simple.tr | grep '^r' | grep AGT | grep tcp | grep -v ack | awk '{print $3, $47}' </code> |
+ | * {{:isrm:laboratoare:02:lab02tcp_rts.png?300|}} |