Added scripts to repo. And some changes to report.
[packetlaptime.git] / rapport / rapport.tex
blob6493216ac8d1d8dbfdc6ac594e7f07b719045a9e
1 \documentclass[a4paper, 12pt]{article}
2 \usepackage[swedish]{babel}
3 \usepackage[utf8]{inputenc}
4 \usepackage{verbatim}
5 \usepackage{graphicx}
6 \usepackage{fancyhdr}
8 % vars
9 \def\dokumentTyp{Laborationsrapport}
11 \def\preTitle{Laboration 2}
12 \def\title{Kommunikationsringar}
14 \def\namn{Anton Johansson, Victor Zamanian}
15 \def\username{dit06ajn, dit06vzy}
16 \def\mail{dit06ajn@cs.umu.se, dit06vzy@cs.umu.se}
18 \def\handledareEtt{Thomas Johansson (thomasj@cs.umu.se)}
19 \def\inst{Datavetenskap}
20 \def\kurs{Datakommunikation och Internet, HT-07}
22 \def\pathToCode{/home/dit06/dit06vzy/edu/doi/lab2/}
23 \def\pathToApi{http://www.cs.umu.se/$\sim$dit06ajn/doi/}
25 \begin{document}
26 \begin{titlepage}
27 \thispagestyle{empty}
28 \begin{small}
29 \begin{tabular}{@{}p{\textwidth}@{}}
30 UMEÅ UNIVERSITET \hfill \today \\
31 Institutionen för \inst \\
32 \dokumentTyp \\
33 \end{tabular}
34 \end{small}
35 \vspace{10mm}
36 \begin{center}
37 \LARGE{\preTitle} \\
38 \huge{\textbf{\kurs}} \\
39 \vspace{10mm}
40 \LARGE{\title} \\
41 \vspace{15mm}
42 \begin{large}
43 \begin{tabular}{rl}
44 \textbf{Namn} & \namn \\
45 \textbf{Användarnamn} & \username \\
46 \textbf{E-mail} & \mail \\
47 \textbf{Sökväg} & \texttt{\pathToCode} \\
48 \end{tabular}
49 \end{large}
50 \vfill
51 \large{\textbf{Handledare}}\\
52 \mbox{\large{\handledareEtt}}
53 \end{center}
54 \end{titlepage}
56 \pagestyle{fancy}
57 \rhead{\today}
58 \lhead{\footnotesize{\namn}}
59 \chead{}
60 \lfoot{}
61 \cfoot{}
62 \rfoot{}
64 \tableofcontents
65 % No indrag
66 \setlength{\parindent}{0pt} % but some space
67 \setlength{\parskip}{10pt}
68 \newpage
70 % start pagenumbering
71 \rfoot{\thepage}
72 \pagenumbering{arabic}
73 % VAD SOM SKA TAS UPP
74 % # Diskussioner kring din lösning, finns utrymme för optimering?
75 % # Utförliga och välkommenterade testkörningar
77 \section{Problembeskrivning}
78 Uppgiften gick ut på att skapa TCP- respektive UDP-noder som ska
79 ansluta till varandra i en ring. Noderna ska vara självstående och får
80 inte ha mer information om ringen än anslutningen till nästa nod. Det
81 ska automatiskt med en decentraliserad algoritm bestämmas en nod som
82 är ''huvud-nod'' och skickar det första meddelandet. Detta meddelande ska
83 sedan vandra ett antal varv i ringen medan en nod loggar varvtider.
85 Problemspecifikationen finns i original på:\\
86 \verb!http://www.cs.umu.se/kurser/5DV065/HT07/ou2/index.html!\\
88 \section{Åtkomst}
89 Katalogen som källkoden till vårt program ligger i är:\\
90 \pathToCode
92 \section{Systembeskrivning}
93 % contructPacket(); Tillverkare ett paket, olika beroende på vilken
94 % protokolltyp man använder.
96 Varje nod slumpar fram ett unikt nummer. Detta nummer skickas vidare
97 till anslutande nod i fas ett. När noder tar emot meddelande i denna
98 fas så jämförs nodens egna nummer med det som kommer i meddelandet. Om
99 ankomande nummer är större än nodens egna så skickas detta nummer
100 vidare istället för nodens egna genererade nummer. När en nod får
101 tillbaka sitt egna nummer så är ringen sluten och denna nod sätts att
102 vara den ''utvalda''. Efter det inleds fas två.
104 I fas två, börjar den utvalda noden att skicka ett meddelande, sedan
105 skickas detta meddelande runt i ringen ett specificerat antal
106 varv. För varje varv loggar en av noderna medeltiden av alla varv
107 hitintills och skriver denna data till en fil. När meddelandet har
108 skickats sina varv runt i ringen så skickas ett annat meddelande
109 ut. I denna fas avslutas varje instans av noderna i ringen.
111 Efter en avslutat körning finns resultatet av loggningen att läsa i en
112 fil \verb!lap-times-tcp.log! eller \verb!lap-times-udp.log! i
113 katalogen hos den instans som vid start valdes till ''logg-nod''. Log
114 filerna innehåller en rad för varje varv meddelandet skickats,
115 nodfilen har följande utseende:
116 \begin{verbatim}
118 Average time so far: 309001.600480144 ns, ID = 1921013324
119 Average time so far: 308998.699739948 ns, ID = 1921013324
120 Average time so far: 308997.899789979 ns, ID = 1921013324
122 \end{verbatim}
124 ID-numret på slutet av varje rad är det nummer som slumpats fram av
125 den utvalda noden. Genom att testa att det är samma ID efter varje
126 körning dras slutsatsen att enbart ett meddelande skickas runt i
127 ringen.
129 \begin{verbatim}
130 $ cat lap-times-tcp.log | grep 1921013324$ > greptest
131 $ diff lap-times-tcp.log greptest
133 \end{verbatim}
135 Körningen ovan är ett test som visar på att det är samma ID på varje
136 rad i filen (ID-numret i detta fallet var alltå 1921013324). Första
137 kommandot hämtar alla rader ur lap-times-tcp.log som avslutas med
138 1921013324 och lägger dessa i en ny fil "greptest". Andra kommandot visar
139 skillnaden mellan denna nya fil och den ursprungliga. Eftersom alla
140 rader innehåller samma ID så är det ingen skillnad mellan filerna, och
141 outputen från kommandot diff uteblir.
143 % Metoder:
144 % sendMessage();
145 % receiveMessage(); // Tråd
146 % interpretMessage(); // Tolkar meddelanden och kör kod beroende på
147 % innehåll (switch sats? Typ)
148 % logLapTimes() // Loggar varvtider till fil och stdout. Körs bara av
149 % utvald nod. Tråd?
150 \subsection{API}
151 Full API på implementationen finns på:\\
152 \pathToApi
154 \section{Testkörningar}
155 \subsection{Hjälpmedel}
156 För att testköra vår implementerade lösning använde vi oss av ''shell
157 script''. Ett shell script kan användas för att instruera en dator
158 till att göra många saker bara genom en enda körning av
159 scriptet. (''Script'': ''manus'' på engelska.)
161 Vi skapade två olika script för testkörningar av UDPNode respektive
162 TCPNode. Strukturen är likadan för båda script-typerna (TCP och UDP)
163 och går ut på att skapa fem stycken noder på en värddator och fem
164 noder på en annan värddator, där varje nod som skapas på den ena
165 värddatorn försöker upprätta kontakt med en nod som skapats på den
166 andra värddatorn. Våra UDP-script ser till exempel ut som följer:
168 udp.10.cirkel.sh:
169 \begin{footnotesize}
170 \verbatiminput{../scripts/udp/udp.10.cirkel.sh}
171 \end{footnotesize}
173 udp.10.fyrkant.sh:
174 \begin{footnotesize}
175 \verbatiminput{../scripts/udp/udp.10.fyrkant.sh}
176 \end{footnotesize}
178 TCP-scripten fungerar alltså på samma sätt: UDPNode ersätts med
179 TCPNode.
181 \subsection{Resultat}
182 De testkörningar som utfördes gick ut på att skapa olika många noder
183 och sedan jämföra varvtider när antalet noder ökar. Det antal noder
184 som testades var 6, 10, 20 och 50 noder. Antal varv som ett paket
185 cirkulerade var i varje fall $10 000$ varv.
187 Tabell: Varvtider för UDP- och TCP-ringar.
189 \begin{small}
190 \begin{tabular}{clll}
191 \textbf{Antal noder} & \textbf{Varvtider för UDP (ns)} & \textbf{Varvtider för TCP (ns)} \\
192 \hline
193 \textbf{6} & 931270 & 1031404 \\
194 \textbf{10} & 1622223 & 1718308 \\
195 \textbf{20} & 3335335 & 3548170 \\
196 \textbf{50} & 8519825 & 9648063 \\
197 \textbf{100} & 6646337 & 18122576 \\
198 \end{tabular}
199 \end{small}
201 En 9439245
203 \section{Diskussion}
204 För att testa tillförlitligheten hos TCP- och UDP-noderna kördes
205 noderna utan begränsning på antal varv mellan olika datorer på skolan,
206 när körningen varit igång 30 min vardera utan att förlora ett enda
207 paket avbröts körningen manuellt. Slutsats om tillförlitligheten hos
208 TCP jämfört med UDP går i det här fallet alltså inte att
209 göra. Generellt sett så borde fler fel dock uppkomma hos en
210 UDP-implementation eftersom någon felkoll om paketen kommit fram inte
211 görs av protokollet.
213 Implementation av noderna är sådan att begreppen Klient och Server går
214 att använda samtidigt på noderna. När de skickar ett meddelande till
215 nästa nod i ringen kan man säga att Noden agerar som en Klient. När
216 noden skickat sitt meddelande går den över i ett annat läge och väntar
217 på inkommande meddelanden, nu agerar noden mer som en Server.
219 \section{Problem och reflektioner}
220 Vi hade egentligen velat använda oss av mer arv och smarta lösningar i
221 vår implementation för att slippa dublicering av kod i UDPNode.java
222 och TCPNode.java. En del saker klarade vi av att trycka in i en
223 gemensam Node.java men vi hade helst velat ha mer funktionalitet där.
225 \newpage
226 \appendix
227 \section{Appendix Källkod}
229 \subsection{Node.java}
230 \begin{footnotesize}
231 \verbatiminput{../Node.java}
232 \end{footnotesize}
233 \newpage
235 \subsection{UDPNode.java}
236 \begin{footnotesize}
237 \verbatiminput{../UDPNode.java}
238 \end{footnotesize}
239 \newpage
241 \subsection{TCPNode.java}
242 \begin{footnotesize}
243 \verbatiminput{../TCPNode.java}
244 \end{footnotesize}
245 \newpage
247 \subsection{Makefile}
248 \begin{footnotesize}
249 \verbatiminput{../Makefile}
250 \end{footnotesize}
251 \newpage
253 \subsection{NodeInterface.java}
254 \begin{footnotesize}
255 \verbatiminput{../NodeInterface.java}
256 \end{footnotesize}
257 \end{document}