\subsection{Wie funktioniert das Internet?}

Wir stellen uns das Internet als abstrakte Wolke vor, bei dem
jeder Nutzer eine Adresse hat, und über diese mit anderen kommunizieren kann.
Also Analogie dient der Briefversand, der grundsätzlich ähnlich funktioniert.

Ein Teilnehmer am Internet zeichnet sich aus durch
\begin{itemize}
  \item Seine konkrete \vocab{IP-Adresse}.
  \item Den \vocab{Port}, den er verwendet.
  \item Das Protokoll, über das er kommuniziert (üblicherweise TCP oder UDP)
\end{itemize}

\todoimg{3-1 11}


\subsection{Das \acf{ip}}

Zur Zeit wird \vocab{IPv4}, d.h.~die vierte Version des \acl{ip}, verwendet.

\Ac{ip} ist ein \vocab{Netzwerkprotokoll}, d.h.~es dient zur Kommunikation von
\begin{itemize}
  \item Rechner-Router
  \item Router-Router
\end{itemize}
im Netzwerk.

Das \acf{ip} sendet hierzu immer sogenannte \vocab{IP-Datagramme} auf einmal, deren Länge durch $64 \unit{KByte}$ begrenzt ist. In der Praxis kann diese jedoch kleiner sein, und ist durch die Netzwerke beschränkt. Das Ziel des Datagrammes wird durch die IP-Adresse angegeben, die $32$ Bit lang ist.

\begin{warning}
  Datagramme können \alert{verloren} gehen sowie \alert{verdoppelt}, \alert{verfälscht} oder in \alert{falscher Reihenfolge} ausgeliefert werden. IP hat hierzu keinerlei Garantien.
\end{warning}

Das neuere Protokoll \vocab{IPv6} funktioniert ähnlich wie IPv4. Es vergrößert den Adressraum auf 128 Bit und ermöglicht es so, jedem Gerät im Internet eine eigene Adresse zuzuweisen.

\subsection{Das \acf{udp}}

Das \ac{udp} ist ein minimales \vocab{Transportprotokoll}. Es arbeitet nur in Endgeräten und nutzt den Dienst von IP um mit anderen Zielrechnern zu kommunizieren.
\ac{udp} nutzt Ports, um mehrerer Prozesse gleichzeitig zu unterstützen.

\begin{warning}
  Da \ac{udp} auf \ac{ip} aufsetzt und keine zusätzlichen Garantien bietet, ist \ac{udp} ebenfalls unzuverlässig.
\end{warning}

Ein \ac{udp} Datagramm besteht aus
\begin{itemize}
  \item Source Port
  \item Länge der übermittelten Daten
  \item Destination Port
  \item Checksum
  \item übertragene Daten
\end{itemize}

Die Checksumme ist hierbei tatsächlich der einzige (optionale!) Schutz vor Datenkorruption.

Im Gegensatz zum \ac{tcp} ist \ac{udp} verbindungslos.

\subsection{Das \acf{tcp}}

Das \ac{tcp} ist wesentlich aufwendiger als \ac{udp},
löst aber die Unzuverlässigkeiten des IP.
Auch hier werden source und destination port angegeben, jedoch auch weitaus mehr Metainformationen,
die Folgendes sicherstellen:
\begin{itemize}
  \item Verlorene Datagramme werden wiederholt.
  \item Verdoppelte Datagramme werden verworfen.
  \item Datagramme werden potenziell umsortiert, um die Reihenfolge sicherzustellen.
  \item Verfälschte Datagramme werden erkannt (Checksumme) und ggf.~wiederholt.
\end{itemize}

Der größte Unterschied hierbei ist jedoch vor allem, dass \alert{eine feste Verbindung}
zwischen Sender und Empfänger aufgebaut werden muss, um \ac{tcp} zu nutzen.
Hierzu \vocab[Verbindungsaufbau!initiieren]{initiiert} ein Anwenderprogramm einen Verbindungsaufbau. Akzeptiert die gegenüberliegende Seite diesen Verbindungsaufbau, können Daten in beide Richtungen versendet werden.

\begin{table}[htpb]
  \centering
  \begin{minipage}{0.45\textwidth}
  \begin{tabular}{l | l}
    Decimal &  Description \\
    \hline
    $0$ &  Reserved \\
    $1$ &  TCP Multiplexer \\
    $5$ &  Remote Job Entry \\
    $7$ &  Echo \\
    $9$ &  Discard \\
    $11$ &  Active Users \\
    $13$ &  Daytime \\
    $15$ &  Network status program \\
    $17$ &  Quote of the Day \\
    $19$ &  Character Generator \\
    $20$ &  File Transfer Protocol (data) \\
    $21$ &  File Transfer Protocol \\
    $22$ &  ssh (secure shell) \\
    $23$ &  Telnet \\
    $25$ &  SMTP (Mail Transfer) \\
    $37$ &  Time \\
    $42$ &  Host Name Server \\
    $43$ &  Who is \\
  \end{tabular}
  \end{minipage}
  \begin{minipage}{0.45\textwidth}
    \begin{tabular}{l | l}
   Decimal & Description \\
   \hline
   $53$ &  Domain Name Server \\
   $77$ &  Any private RJE service \\
   $79$ &  Finger \\
   $80$ &  World Wide Web HTTP \\
   $93$ &  Device Control Protocol \\
   $95$ &  SUPDUP Protocol \\
   $101$ &  NIC Host Name Server \\
   $102$ &  ISO-TSAP \\
   $103$ &  X.400 Mail Service \\
   $104$ &  X.400 Mail Sending \\
   $111$ &  Sun Microsystems RPC \\
   $113$ &  Authentication Service \\
   $117$ &  UUCP Path Service \\
   $119$ &  USENET News Transfer Protocol \\
   $129$ &  Password Generator Protocol \\
   $139$ &  NETBIOS Session Service \\
   $160-223$ &  Reserved   \\
    \end{tabular}
  \end{minipage}
\caption{Well-Known Ports bei der Verwendung von \ac{tcp}}
  \label{tab:well-known-tcp-ports}
\end{table}

\begin{table}[htpb]
  \centering
  \begin{minipage}{0.45\textwidth}
  \begin{tabular}{l | l}
    Decimal & Description \\
    \hline
    $0$ &  Reserved \\
    $7$ &  Echo \\
    $9$ &  Discard \\
    $11$ &  Active Users \\
    $13$ &  Daytime \\
    $15$ &  Who is up or NETSTAT \\
    $17$ &  Quote of the Day \\
    $19$ &  Character Generator \\
    $22$ &  ssh (secure shell) \\
    $37$ &  Time \\
    $42$ &  Host Name Server \\
    $43$ &  Who is \\
    $53$ &  Domain Name Server \\
  \end{tabular}
  \end{minipage}
  \begin{minipage}{0.45\textwidth}
    \begin{tabular}{l | l}
    Decimal & Description \\
    \hline 
    $67$ &  Bootstrap Protocol Server \\
    $68$ &  Bootstrap Protocol Client \\
    $69$ &  Trivial File Transfer \\
    $80$ &  World Wide Web HTTP \\
    $111$ &  Sun Microsystems RPC \\
    $123$ &  Network Time Protocol \\
    $161$ &  SNMP net monitor \\
    $162$ &  SNMP traps \\
    $512$ &  UNIX comsat \\
    $513$ &  UNIX rwho daemon \\
    $514$ &  system log \\
    $525$ &  Time daemon \\
  \end{tabular}
  \end{minipage}
  \caption{Well-Known Ports bei der Verwendung von \ac{udp}}
  \label{tab:well-known-udp-ports}
\end{table}


\autoref{tab:well-known-tcp-ports} und \autoref{tab:well-known-udp-ports} zeigen Ports von \ac{tcp} und \ac{udp}, die standardmäßig für die Server-Prozesse der
beschriebenen Dienste vorhergesehen sind.
Prinzipiell spricht nichts dagegen, über einen dieser Ports andere Verbindungen zu realisieren,
allerdings erfordert das Verwenden eines Ports $< 1024$ in den meisten UNIX-Umgebungen Administrator-Rechte.

Client-Anwendungen verwenden üblicherweise einen beliebigen Port.
Betriebssysteme vergeben hierfür \vocab{Dynamic Ports} (zwischen \code{49152 = 0xC000} und \code{65535 = 0xFFFF}).\footnote{Unter Linux teilweise auch $32768$ bis $61000$. Ursprünglich waren alle Ports $\ge 1024$ für Client-Anwendungen vorgesehen.}

\todoimg{3-1 21}

\subsection{\ac{tcp} und \ac{udp} über \ac{ip}}
Wir fassen also zusammen, dass \ac{tcp} und \ac{udp} über \ac{ip} kommunizieren.
Die (potenziell vielen) Router, die zwischen den beiden Endgeräten sitzen, müssen jedoch
nichts von \ac{udp} oder \ac{tcp} wissen, sie kommunizieren nur über \ac{ip}.

\subsection{Das Format eines \ac{ip}-Datagrammes}
Ein \ac{ip}-Datagramm umfasst insbesondere
\begin{itemize}
  \item Quelle und Ziel als IP-Adressen: 32 Bit (IPv4) oder 128 Bit (IPv6)
  \item Das Protokoll der höheren Schicht (nur als Spezifikation, z.B.~\ac{tcp} oder \ac{udp}).
  \item Einige Kontrollfunktionen.
\end{itemize}

\subsection{Vergleich von \ac{tcp} und \ac{udp} über \ac{ip}}
Bei der Abwägung, welches der beiden Protokolle man verwenden sollte,
sollte Folgendes beachtet werden:

\begin{itemize}
  \item \ac{tcp} ist zuverlässig, verbindungsorientiert und eignet sich für Byte-Streams. Es entsteht allerdings ein erheblicher Overhead.
  \item \ac{udp} ist ein minimaler Dienst, der möglichst wenig Overhead erzeugt.
\end{itemize}

\subsection{IPC}
Die Netzwerkkommunikation ist insbesondere ein Fall von IPC, die jedoch auch Kommunikation zwischen Prozessen auf verschieden Rechnern ermöglicht.
Diese Prozesse können u.U.~auf verschiedenen Betriebssystemen laufen.
Netzwerkkommunikation ermöglicht auch IPC auf dem gleichen System, hierzu wird die Loopback-Adresse \code{127.0.0.1} bzw. \code{::1} verwendet.
Außerdem stehen \vocab{Unix Domain Sockets} zur Verfügung, die das selbe API verwenden, aber nur für die Kommunikation innerhalb eines Systems verwendet werden. 
