\documentclass[12pt,a4paper]{article}

\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{geometry}
\usepackage{graphicx} 
\usepackage{caption}
\usepackage{setspace}
\usepackage{float}
\usepackage{hyperref}
\usepackage{enumitem}
\usepackage{listings}
\lstset{
	basicstyle=\ttfamily\fontsize{10}{10}\selectfont,
	tabsize=1,
	frame=single,
}

\onehalfspacing

\geometry{a4paper, top=20mm, left=30mm, right=20mm, bottom=20mm, headsep=10mm, footskip=12mm}

\hypersetup{
	unicode=true,
	pdftitle={ACN-LAB4},
	pdfsubject={ACN-LAB4},
	pdfauthor={Sebastian~Rieger,Christoph~Hardegen},
	pdfkeywords={}, 
	colorlinks=true,
	urlcolor=black,
	linkcolor=black,
	breaklinks=true,
	citecolor=black, 
	filecolor=black}

\begin{document}

\begin{figure}
	\begin{center}
		\includegraphics[scale=0.5]{figures/logo.pdf}
	\end{center}
\end{figure}

\begin{center}
	\begin{Huge}
		\textsc{Advanced Computer Networks} \\
	\end{Huge}
	\vspace{.5cm}
	\begin{large}
		\textsc{Lab 4: Mininet \& SDN Introduction}
	\end{large}
\end{center}

\section{Mininet}

\begin{itemize}[leftmargin=*]
	\setlength\itemsep{.1em}
	\item Verschaffen Sie sich einen Überblick zu Mininet und
	klären Sie folgende Fragestellungen:
	\begin{itemize}[leftmargin=*]
		\setlength\itemsep{.1em}
		\item Was ist Mininet und wo hat es seinen Ursprung?
		\item Wie ist Mininet (grob) aufgebaut bzw. wie funktioniert es?
		\item Was sind Einsatzszenarien für Mininet?
	\end{itemize}
	Relevante Informationen finden Sie z.B. unter \url{http://mininet.org/overview/}. \\
	----------------------------------------------------------------------------------------------------------------- 
	\item[] Die folgenden Aufgabenstellungen/Inhalte orientieren sich am Mininet Walkthrough (\url{http://mininet.org/walkthrough/}).
	Für deren Bearbeitung erhalten Sie Zugriff auf eine vorbereitete virtuelle Maschine.
	%\item Bilden Sie Gruppen von 2 bis max. 4 Personen und erfragen Sie einen Gruppenzugang zu einer benötigten VM.
	%Melden Sie sich mit den Zugangsdaten auf Ihrer VM an.
	\item Unter \url{http://192.168.76.212:17000} haben Sie aus dem VPN Zugriff auf eine Ubuntu 18.04 VM in der mininet bereits installiert ist. Melden Sie sich dafür ihren Gruppen-Accounts an (User: acn-groupXY, Passwort: netlab). Starten Sie die Standard-Topologie von Mininet:
	\begin{lstlisting}
	sudo mn
	\end{lstlisting}	
	Welche Komponenten können Sie anhand der Ausgabe des Skripts identifizieren?
	Wie sind diese miteinander verbunden?
	Welche Rolle nehmen die einzelnen Komponenten innerhalb der Mininet-Topologie ein?
	\item Rufen Sie die Hilfe der Mininet-CLI auf.
	Verschaffen Sie sich einen Überblick über die verfügbaren Kommandos. 
	Testen Sie diese und interpretieren Sie die Ausgaben.
	\begin{lstlisting}
	mininet> help
	
	mininet> (dump | net | nodes | links | ports)
	mininet> h1 (ifconfig | arp | route | tcpdump | ...)
	mininet> pingall
	mininet> h1 ping h2
	mininet> iperf h1 h2
	mininet> link s1 h1 (down | up)
	mininet> xterm h1
	\end{lstlisting}
	\item Stoppen Sie die Standard-Topologie:
	\begin{lstlisting}
	mininet> exit	
	\end{lstlisting}
	Erzeugte Ressourcen werden normalerweise beim Stoppen gelöscht. 
	Ressourcen können auch manuell beseitigt werden (Cleanup, z.B. im Fehlerfall):
	\begin{lstlisting}
	sudo mn -c
	\end{lstlisting}
	\item Machen Sie sich mit den Optionen des Mininet-Kommandos vertraut:
	\begin{lstlisting}
	sudo mn --help
	\end{lstlisting}
	%\item Führen Sie Ihre Experimente mit weiteren Beispiel-Topologien durch:
	\item Starten Sie folgende in Mininet enthaltene Beispiel-Topologien:
	\begin{lstlisting}
	sudo mn --topo single,4
	sudo mn --topo linear,4
	sudo mn --topo tree,depth=2,fanout=4
	\end{lstlisting}
	Nutzen Sie die Ausgaben von Mininet-CLI-Kommandos, um die Topologien zu skizzieren.
	Variieren Sie die Parameter und vollziehen Sie die Topologie-Änderungen nach.\\
	----------------------------------------------------------------------------------------------------------------- \\
%	Im Folgenden werden Sie eine eigene Topologie betrachten/entwickeln und dabei weitere Konzepte von bzw. die Programmierung mit Mininet kennenlernen.
%	Die Implementierung der Custom-Topologie finden Sie in \texttt{customTopo.py}.
%	\item Schauen Sie sich den Programmcode an und versuchen Sie diesen schrittweise nachzuvollziehen.
%	Die folgenden Anmerkungen unterstützen Sie hierbei:
%	\begin{itemize}[leftmargin=*]
%		\setlength\itemsep{.1em}
%		\item Der Import relevanter Mininet-Klassen erfolgt in den Zeilen 1 bis 5.
%		\item Die Enumeration \texttt{NodeRoles} dient der Abbildung der Rollen verschiedener Komponenten in der Mininet-Topologie (Zeilen 9 bis 12).
%		\item Die Klasse \texttt{Router} erweitert die Mininet-Klasse \texttt{Node} und bildet einen einfachen Router ab (Zeilen 15 bis 29).
%		Die Methoden \texttt{config} und \texttt{terminate} werden implizit beim Erstellen/Starten bzw. dem Löschen/Stoppen aufgerufen.
%		\item Die Klasse \texttt{CustomTopo} erweitert die Mininet-Klasse \texttt{Topo} und implementiert eine eigene Mininet-Topologie. 
%		\item In der \texttt{build}-Methode wird die Topologie konstruiert (Zeilen 39 bis 82).
%		Die addNode-API wird für die Konstruktion des Routers (Zeilen 41 und 42), die addSwitch- bzw. addHost-API für die der Switches (Zeilen 44 und 45) bzw. Hosts (z.B. Zeilen 47 bis 50) verwendet, wobei die Erstellung durch die Übergabe einzelner Parameter bestimmt wird. 
%		Neben Standard-Parametern (siehe Mininet Python API Reference Manual) können weitere, eigene Parameter genutzt werden.
%		In der Custom-Topologie wird dies anhand des Parameters \texttt{role} verdeutlicht (z.B. Zeile 42).
%		Standardmäßig werden Mininet-Nodes in eigenen Linux Namespaces realisiert.
%		Ein Mininet-Node kann jedoch auch im Standard-Namespace abgebildet werden (Zeile 48).
%		Über die addLink-API werden die Links zwischen den einzelnen Komponenten der Mininet-Topologie erstellt (z.B. Zeilen 70 bis 75).
%		\item Die \texttt{run}-Funktion definiert die Ausführung (Zeilen 85 bis 95).
%		Hierbei wird zuerst eine Mininet-Topologie (Zeile 86) und basierend auf dieser im zweiten Schritt ein Mininet-Netz (Zeile 87) konstruiert. 
%		Daraufhin werden das Netzwerk und die Mininet-CLI gestartet (Zeilen 88 und 94).
%		Der Zugriff auf erstellte Komponenten des Mininet-Netzes ist exemplarisch in den Zeilen 90 bis 92 gezeigt.
%		Wird die Mininet-CLI verlassen, so werden alle Ressourcen der Topologie bzw. des Mininet-Netzes gelöscht (Zeile 95).
%	\end{itemize}
%	\item Starten Sie die Custom-Topologie und nutzen Sie die Mininet-CLI-Kommandos für verschiedene Experimente in dieser.
%	Versuchen Sie die Konzepte, die in der Custom-Topologie angewandt werden, nachzuvollziehen.
%	Verwenden Sie dabei z.B. die Kommandos \texttt{ping}, \texttt{tracepath}, \texttt{iperf}, \texttt{tcpdump}.
%	\begin{lstlisting}
%	sudo python customTopo.py
%	\end{lstlisting}
%	\item[] \textit{ANMERKUNG}: Die Custom-Topologie dient als einfaches Beispiel zur Einführung.
%	In Ihren Topologien, die Sie im Rahmen der Programming Assignments implementieren, sollten Sie im Allgemeinen ähnliche Argumente parametrisieren (Konstanten) sowie zusammenhängende Elemente in Listen, Dictionaries oder ähnlichem organisieren.
%	\item Stoppen und ergänzen Sie die Custom-Topologie um ein weiteres Netzwerk, bestehend aus einem Switch sowie zwei Hosts, und binden Sie dieses an den Router an. 
%	Starten Sie die Custom-Topologie und testen Sie Ihre Erweiterungen. \\

\section{Software-Defined Networking und OpenFlow}

\begin{itemize}[leftmargin=*]
	\setlength\itemsep{.1em}
	\item Was verstehen Sie unter Software-Defined Networking?
	\item Welche wesentlichen Komponenten existieren in einer SDN-Architektur? Skizzieren Sie eine beispielhafte SDN-Infrastruktur.
	\item Was ist OpenFlow? Beschreiben Sie den Standard kurz. Gibt es Alternativen?
\end{itemize}

\section{OpenFlow Switch}

\begin{itemize}[leftmargin=*]
	\setlength\itemsep{.1em}
	\item Recherchieren Sie, was \texttt{Open vSwitch} ist und welche Features unterstützt werden:
	\begin{itemize}[leftmargin=*]
		\setlength\itemsep{.1em}
		\item \url{http://www.openvswitch.org/}
		\item \url{http://www.openvswitch.org/features/}
	\end{itemize}
	\item Vollziehen Sie die Implementierung der Mininet-Topologie:
	
	\url{https://mmnet.informatik.hs-fulda.de/OpenFlowTopo.py}
	
	nach.
	Starten Sie die Topologie und beschreiben Sie deren Architektur nach der Ausführung:
	\begin{lstlisting}
	sudo python OpenFlowTopo.py
	\end{lstlisting}
	\item Testen Sie die Kommunikation zwischen den Hosts in der Topologie, z.B. über das Kommando \texttt{ping}. 
	Beobachten Sie zudem mit dem Kommando \texttt{tcpdump} oder mit \texttt{sudo wireshark-gtk}, welche Nachrichten von einem Host gesendet (und empfangen) werden. 
	Ist eine Kommunikation möglich? Was vermuten Sie als Ursache und wie lässt sich das Problem lösen?
	\item Nutzen Sie die Kommandos \texttt{ovs-vsctl} und \texttt{ovs-ofctl} (weiteres Terminal), um relevante Informationen zum Switch in der Topologie zu erhalten (Ports, Tabellen, Flows, etc.):
	\begin{lstlisting}
		sudo ovs-vsctl show
		
		sudo ovs-ofctl [show | dump-ports | dump-flows] -O OpenFlow10 ofp-sw1
		mininet> dpctl [show | dump-ports | dump-flows]
		
		(ovs-vsctl | ovs-ofctl) --help
		mininet> dpctl --help
	\end{lstlisting} 
\end{itemize}

%\newpage
\section{OpenFlow Controller}

\begin{itemize}[leftmargin=*]
	\setlength\itemsep{.1em}
	\item Recherchieren Sie, worum es sich bei \texttt{Ryu} handelt:
	\begin{itemize}[leftmargin=*]
		\setlength\itemsep{.1em}
		\item \url{https://github.com/osrg/ryu#whats-ryu}
		\item \url{https://ryu.readthedocs.io/en/latest/getting_started.html#what-s-ryu}
	\end{itemize}
	%\item Installieren Sie \texttt{Ryu} auf Ihrer virtuellen Maschine:
	%\begin{lstlisting}
	%pip install ryu
	%\end{lstlisting}
	\item Prüfen Sie den festgelegten Manager (Controller) für den Switch (weiteres Terminal):
	\begin{lstlisting}
		sudo ovs-vsctl get-manager
		sudo netstat -tulpn | grep 6633
	\end{lstlisting}
	Läuft der Controller? Wie hängt dies mit der Kommunikation der Hosts zusammen?
	\item Überlegen Sie sich, welche Flows auf dem Switch installiert werden müssen, damit eine ICMP-Kommunikation zwischen den Hosts möglich wird. 
	Welche Matching-Felder und Actions benötigen Sie? (Tipp: \texttt{Ethertype IPv4} = \texttt{0x0800} und \texttt{ARP} = \texttt{0x0806})  
	\item Ergänzen Sie die Ryu-Applikation: 
	
	\url{https://mmnet.informatik.hs-fulda.de/OpenFlowApp.py}

	um die fehlenden Flows. 
	Mit Hilfe des Kommandos \texttt{ifconfig} können Sie die MAC- und IP-Adressen der Hosts ermitteln.
	\item[] ANMERKUNG: Für das Löschen aller Flows auf dem Switch können Sie eines der folgenden Kommandos benutzen:
	\begin{lstlisting}
		sudo ovs-ofctl del-flows ofp-sw1
		mininet> dpctl del-flows
	\end{lstlisting}
	\item Starten Sie den OpenFlow Controller (weiteres Terminal):
	\begin{lstlisting}
		sudo ryu-manager OpenFlowApp.py
	\end{lstlisting}	
	\item Überprüfen Sie die korrekte Installation der Flows auf dem Switch.
	\item Testen Sie die Kommunikation zwischen den Hosts in der Topologie.
\end{itemize}

\section{Wozu SDN?}

\begin{itemize}[leftmargin=*]
	\setlength\itemsep{.1em}
	\item Welche Vorteile bietet Software-Defined Networking?
	\item Welche Nachteile (Herausforderungen) ergeben sich durch SDN?
	\item Was sind mögliche Einsatzszenarien von SDN?
	%\item Gibt es mögliche Alternativen zu SDN?
\end{itemize}

	-----------------------------------------------------------------------------------------------------------------
	\item Eine Vielzahl an Programmierbeispielen finden Sie im offiziellen GitHub-Repository von Mininet (\url{https://github.com/mininet/mininet/tree/master/examples}).
	\item Die Dokumentation der Mininet Python API finden Sie im offiziellen Reference Manual (\url{http://mininet.org/api/index.html}).
\end{itemize}
\end{document}