\documentclass{uebungsblatt}

\usepackage{tikz}

\author{Marek Kubica kubica@in.tum.de, Michael Kerscher kerschem@in.tum.de}
\fach{Rechnernetze und Verteilte Systeme}
\blatt{9}
\gruppe{G}

\begin{document}

\aufgabe[24]

\teilaufgabe

Flusssteuerung soll präventiv einen Stau im Netz verhindern, Staukontrolle soll
reaktiv einen entstandenen Stau auflösen. Zusammen soll der Durchsatz des
Netzes optimiert werden.

\teilaufgabe

Slow-Start (Staukontrolle): Bei Staus (Paketverlust) wird das Receiver-Window
auf 1 gesetzt, so dass zusätzliche Stauung vermieden wird.

Receiver-Window (Flusssteuerung): Der Empfänger teilt dem Sender mit, wie viele
Bytes er momentan noch empfangen will/kann und hilft so Staus vorzubeugen,
indem er sichergeht dass nicht zu viele Daten verschickt werden.

Congestion-Avoidance (Staukontrolle): Nachdem der Schwellwert des
Receiver-Windows überschritten wurde, wird das Fenster pro quittiertem,
empfangenem Paket nur noch um 1 erhöht. Dadurch soll bei Staus sichergestellt
werden, dass nicht noch mehr Daten erzeugt werden, die den Stau vergrößern.

Multiplicative Decrease (Staukontrolle): Der Schwellwert des Receiver-Windows
wird bei Paketverlust halbiert, wodurch die Anzahl der Daten verringert wird
und der Stau nicht verstärkt wird.

\teilaufgabe

\begin{tikzpicture}[scale=0.5]
  % Koordinatensystem
  \draw (24,0) node[right, below]{Vielfaches von RTT} -- (0,0) -- (0,17)
node[left below]{Größe CW};
  % Beschriftung
  \foreach \y in {2,4,6,8,10,12,14,16}
    \draw (-0.2,\y) -- (0.2,\y);
  \node[left] at (0,8) {8};
  \foreach \x in {2,4,6,8,10,12,14,16,18,20,22,24}
    \draw (\x,-0.2) -- (\x,0.2);
  \node[below] at (8,0) {8};
  % Zacken
  \draw (0,8) -- (8,16) -- (9,8) -- (16,16) -- (17,8) -- (24,16);
  \foreach \x in {8,16,24}
    \draw[dashed] (\x,0) -- (\x,16);
\end{tikzpicture}


\aufgabe

\teilaufgabe

Man verwendet das kleinere der beiden Fenster, da dieses den Flaschenhals
darstellt.

\teilaufgabe

Die RTT in der Verbindung beträgt 800ms, deshalb wählt man das Sendefenster so,
dass die 800ms mit voller Bandbreite gesendet werden kann.

\begin{align*}
\mathrm{Sendefenster} = 24 \frac{\mathrm{MBit}}{s} \cdot 0.8s =
19.2\mathrm{MBit} = 2.4\mathrm{MB}
\end{align*}

\teilaufgabe

Im TCP-Header stehen nur 16 Bit für die Windowsize zur Verfügung, deshalb sind
nur Fenstergrößen bis max. 65535 Byte möglich. Der in b) berechnete Wert ist
jedoch größer, deshalb gibt es hier ein Problem.

\teilaufgabe

In RFC1323 ist eine Möglichkeit definiert, wie man Fenstergrößen mit einer
Option skalieren kann. Damit sind Fenstergrößen bis $2^{30}$ ($2^{16}$ um 14
Bits geschiftet).

Als konkrete Zahlen kann man als Windowsize 37500 nutzen und als TCP Window
Scale Option (WSopt) verwendet man Kind = 3, Len = 3, shift.cnt = 6.

\teilaufgabe

Bei einer Fenstergröße von 1.2MB können $\frac{1.2MB}{1500Byte} = 800$ Segmente
in einer Phase mit der Dauer 0.8s verschickt werden. Dann wird nach jeder Phase
ein Segment mehr verschickt, bis das Maximum von 1600 Segmenten erreicht ist.
Dies geschieht nach $800 \cdot 0.8s = 640s$. Das ist ein Problem, da die volle
Auslastung erst nach recht langer Zeit erreicht wird und der Kanal anfangs nur
zur Hälfte genutzt  werden kann.

\teilaufgabe

Linux hat seit 2.6.19 die Variante TCP-Cubic. Hierbei wird im Vergleich zu
TCP-Reno die Fairness verbessert (bei kleinerer Round-Trip-Time und langsamen
Verbindungen). Die Fenstergröße wird hierbei durch eine kubische Funktion
bestimmt.

\aufgabe

\teilaufgabe

\includegraphics{grafik-9}

\teilaufgabe

\begin{enumerate}
 \item DNS-Anfrage: who is server.i8.tum?\\
   Identification: 0x0001, Flags: 0, Question: server.i8.tum
 \item DNS-Anfrage: who is server.i8.tum?\\
   Identification: 0x0002, Flags: 0, Question: server.i8.tum
 \item DNS-Antwort: query ns.tum!\\
   Identification: 0x0002, Flags: 1, Authority: name: tum, data: ns.tum
 \item DNS-Anfrage: who is server.i8.tum?\\
   Identification: 0x0003, Flags: 0, Question: server.i8.tum
 \item DNS-Antwort: query ns.i8.tum!\\
   Identification: 0x0002, Flags: 1, Authority: name: i8.tum, data: ns.i8.tum
 \item DNS-Anfrage: who is server.i8.tum?\\
   Identification: 0x0003, Flags: 0, Question: server.i8.tum
 \item DNS-Antwort: server.i8.tum is ...\\
   Identification: 0x0003, Flags: 1, Answer: name: server.i8.tum, date: <ip>
   Authority: name: i8.tum, date: ns.i8.tum
 \item DNS-Antwort: server.i8.tum is ...\\
   Identification: 0x0003, Flags: 1, Answer: name: server.i8.tum, data: <ip>
Authority: name: i8.tum, data: ns.i8.tum
 \item Client kennt nun die IP und kann mit dem Server kommunizieren.
\end{enumerate}

\end{document}
