\documentclass{uebungsblatt}
\author{Marek Kubica kubica@in.tum.de, Michael Kerscher kerschem@in.tum.de}
\fach{Rechnernetze und Verteilte Systeme}
\blatt{10}
\gruppe{G}
% for ding
\usepackage{pifont}
\usepackage{url}
\usepackage{listings}
\lstset{
breaklines=true,
basicstyle=\ttfamily,
postbreak=\ding{229}
}
\begin{document}
\aufgabe[27]
\teilaufgabe
Anfrage
\begin{lstlisting}
GET / HTTP/1.0
\end{lstlisting}
Antwort
\begin{lstlisting}
HTTP/1.1 200 OK
Date: Wed, 07 Jul 2010 22:18:57 GMT
Server: Apache/2.2.9 (Debian) mod_auth_kerb/5.3 DAV/2 PHP/5.2.6-1+lenny8 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
X-Powered-By: PHP/5.2.6-1+lenny8
Set-Cookie: fe_typo_user=a895257f5b0fa3758bcb7d2165ffa26f
Cache-Control: no-cache
Connection: close
Content-Type: text/html; charset=iso-8859-1
TUM Info VIII: Startseite
\end{lstlisting}
\teilaufgabe
Die Source-IP ist unterschiedlich zwischen den Teilnehmern. Zusätzlich wird
jede Anfrage über einen ``Ephemeral port'' abgewickelt, d.h. einen hohen Port der
nur für diese Clientverbindung temporär genutzt wird.
\teilaufgabe
Um die Verbindung aufzubauen ist es erstmal nötig die IP-Adresse des Hosts zu
wissen. Dazu wird erst der DNS-Server befragt. Im Falle das der Server nicht im
lokalen Netzwerk liegt müssen die auf dem Weg befindlichen Router in Anspruch
genommen werden um die DNS-Abfrage weiterzuleiten. Sobald die IP-Adresse
bekannt ist, kann versucht werden eine TCP-Verbindung zum eigentlichen Server
aufzubauen, diese läuft analog zu DNS ab, nur dass die Verbindung nicht zum
DNS-Server (ggf. dem des Providers) sondern direkt zum Webserver aufgebaut
wird.
\teilaufgabe
Dadurch dass HTTP/1.1 optional Pipelining unterstützt spart man sich den
erneuten Verbindungsaufbau bei jedem Request an den gleichen Server. Dadurch
spart man den TCP-Verbindungsaufbau-Overhead und die Latenz sinkt. Bei vielen
kleinen Dateien von einem Server, wie sie bei HTML üblich sind (HTML, CSS, JS,
Bilder) kann dies einen großen Unterschied machen.
\teilaufgabe
Erste Anfrage:
\begin{lstlisting}
GET / HTTP/1.1
Host: www.diadem-firewall.org
\end{lstlisting}
Nun haben wir eine Seite die per HTTP-Equiv Refresh weiterleitet. Wirken wie
aus der Vergangenheit, diese ``klicken Sie hier um weitergeleitet zu
werden''-Links. Das führt uns dann zur zweiten Anfrage:
\begin{lstlisting}
GET /index.php HTTP/1.1
Host: www.diadem-firewall.org
\end{lstlisting}
Daraufhin bekommen wir die eigentliche Seite. ``The real WTF'' ist, warum der
Webserver nicht \texttt{DirectoryIndex index.php} oder vergleichbar gesetzt
hat.
\teilaufgabe
Der Anfang ist auch diesmal der gleiche, lediglich der übertragene Host-Header
ist natürlich anders.
\begin{lstlisting}
GET / HTTP/1.1
Host: ilab.net.in.tum.de
\end{lstlisting}
Wir bekommen ein ``302 Found'', was die Browser als Redirect interpretieren,
daher wird folgender Request abgeschickt, der den Pfad aus dem Location-Header
nutzt:
\begin{lstlisting}
GET /pages/view.php?address=p3&config=2010ss HTTP/1.1
Host: ilab.net.in.tum.de
\end{lstlisting}
\aufgabe
\teilaufgabe
\lstinputlisting[language=XML]{28.xsd}
Um gegen das XML Schema zu validieren wurde ein Validator geschrieben, der die
Python XML Library lxml nutzt. Sein Quellcode ist unter
\url{http://gist.github.com/467492} verfügbar.
\teilaufgabe
Damit man feststellen kann, ob die Eingabe die man bekommen hat auch eine
gültige Eingabe ist. So kann man auf eine standarisierte Weise auch die
gewünschten Eingabe spezifizieren gegen die der Programmautor prüfen kann.
\teilaufgabe
Der XSLT-Code:
\lstinputlisting[language=XML]{28.xsl}
Das Cascading Style Sheet für die generierte HTML-Seite.
\lstinputlisting[language=HTML]{28.css}
Der XSLT-Code wurde mit \texttt{xsltproc} zu HTML kompiliert und rendert
zusammen mit dem CSS eine HTML-Seite, die aussieht wie die Vorlage.
\teilaufgabe
Der Vorteil ist, dass die HTML-Seiten vom XSLT-Prozessor des Browsers generiert
werden können, somit reicht es, in der XML-Datei die ``Rohdaten'' zu ändern und
schon kann der Browser des Clients diese Rohdaten \emph{sofort} darstellen, da
nicht erst HTML als zusätzliche Zwischenschicht generiert werden muss.
\aufgabe
\teilaufgabe
Host A: 10.0.0.2. Die Adresse ist relativ beliebig, sie sollte aber im Subnetz
liegen. Da 10.1 eine logische Wahl für den Default-Router (NAT) ist, ist 10.2
gleich die nächste passende Möglichkeit.
\teilaufgabe
\begin{itemize}
\item Zwischen Host A und NAT
Ausgehend:
\begin{tabular}{r|l}
Source IP address & 10.0.0.2 \\
Source port & 33000 \\
Destination IP address & 80.80.80.80 \\
Destination port & 80 \\
Time-to-Live & 64
\end{tabular}
Es wird ein ``Ephemeral Port'' am Client verwendet, sprich der Quellport ist
ein hoher Port im Bereich von 32768 bis 61000 (es wird der Einfachkeit halber
ausgegangen dass alle Hosts im Beispiel Linux nutzen).
Eingehend:
\begin{tabular}{r|l}
Source IP address & 80.80.80.80 \\
Source port & 35000 \\
Destination IP address & 10.0.0.2 \\
Destination port & 33000 \\
Time-to-Live & 62
\end{tabular}
\item Zwischen NAT und Router A
Ausgehend:
\begin{tabular}{r|l}
Source IP address & 131.159.24.19 \\
Source port & 34000 \\
Destination IP address & 80.80.80.80 \\
Destination port & 80 \\
Time-to-Live & 63
\end{tabular}
NAT speichert sich die Zuordnung von Port 33000 von Host A zum Port 34000
seines öffentlichen Interfaces und übersetzt die übermittelten Pakete. Der Port
34000 wurde vom NAT frei gewählt.
Eingehend:
\begin{tabular}{r|l}
Source IP address & 80.80.80.80 \\
Source port & 35000 \\
Destination IP address & 131.159.24.19 \\
Destination port & 34000 \\
Time-to-Live & 63
\end{tabular}
\item Zwischen Router A und Server B
Eingehend:
\begin{tabular}{r|l}
Source IP address & 131.159.24.19 \\
Source port & 34000 \\
Destination IP address & 80.80.80.80 \\
Destination port & 80 \\
Time-to-Live & 62
\end{tabular}
Ausgehend:
\begin{tabular}{r|l}
Source IP address & 80.80.80.80 \\
Source port & 35000 \\
Destination IP address & 131.159.24.19 \\
Destination port & 34000 \\
Time-to-Live & 64
\end{tabular}
Auch hier wird vom Server ein ``Ephemeral Port'' gewählt um Port 80 für weitere
Clientverbindungen freizuhalten.
\end{itemize}
\teilaufgabe
Nein, wenn er versucht 10.0.0.10 zu erreichen stellt er fest das es eine für
lokale Netzwerke reservierte Netzwerkadresse ist. Eine Möglichkeit 10.10 zu
erreichen wäre ein Postforwarding am NAT, das externe Zugriffe auf einen
bestimmten Port von 131.159.24.19 auf einen bestimmten Port von 10.10
weiterleitet. In diesem Fall müsste 77.77.77.77 als Ziel-IP 131.158.24.19
verwenden und als Port den weitergeleiteten Port.
\end{document}