\chapter{Směrovací protokol RIPng} \label{chap:ripng}
V této kapitole je stručně popsána historie protokolu RIP, ze kterého protokol RIPng vychází. Dále jsou zde popsány vlastnosti a specifikace protokolu RIPng. Přestože zmíněné protokoly sdílejí většinu vlastností, budou tyto vlastnosti vztaženy přímo k protokolu RIPng.

\section{Historie}
První specifikace protokolu RIP je popsána v RFC 1058 \cite{RFC1058} z roku 1988. Samotný protokol RIP ale vznikl dříve (koncem 70. let) a je nejstarším používaným směrovacím protokolem. Rozšířil se díky své jednoduchosti, která předčila jeho nedostatky.
Jedním z velkých nedostatků první verze protokolu RIP bylo směrování podle tříd IPv4 adres A, B nebo C. To neumožňovalo existenci různě velkých podsítí uvnitř jedné třídy IP adres.

Proto byla v roce 1993 vyvinuta druhá verze tohoto protokolu - RIPv2 (naposledy upravena v roce 1998 a popsána v RFC 2453 \cite{RFC2453}). Ta odstraňuje třídnost tohoto protokolu -- díky uvedení masky sítě v zasílaných aktualizacích -- a navíc zavádí autentizaci.

Protokol RIPng je rozšířením protokolu RIPv2, jeho specifikaci lze nalézt v RFC 2080 \cite{RFC2080} z roku 1997, a přináší podporu pro IPv6 sítě.

\section{Vlastnosti}\label{sec:vlastnosti}
RIPng je vektorově orientovaný směrovací protokol,  jehož specifikaci lze nalézt v \cite{RFC2080}, jak bylo uvedeno v předchozím odstavci.

Jako metriku používá počet skoků k cíly (Hop Count) a nejkratší cestu určuje pomocí Ford-Fulkerson (nebo také Bellman-Ford) algoritmu \cite{FORD-FULKERSON}.

Tento protokol je určen pro jeden autonomní systém (AS)\footnote[1]{Autonomní systém - množina IP sítí a směrovačů pod jednou technickou správou} a pro sítě střední velikosti. Do rozsáhlých a komplexních sítí není, díky svým limitacím a principům, příliš vhodný.

V samotném protokolu RIPng není specifikována autentizace, u které se předpokládá, že bude zajištěna jiným způsobem, např. pomocí IPsec\footnote[2]{IPsec - Internet Protocol Security, http://en.wikipedia.org/wiki/IPsec.}.

\newpage
\section{Komunikace}
RIPng komunikuje pomocí transportního protokolu UDP\footnote[1]{UDP - User Datagram Protocol \cite{UDP}} na portu 521 (dále také jako RIPng port). Aktualizace jsou zasílány na multicastovou skupinu \texttt{FF02::9} (dále také jako multicastová adresa RIPng).
Existují 2 základní typy zpráv:
\begin{itemize}
\item \texttt{Request} (požadavek) - kap. \ref{sec:request} a
\item \texttt{Response} (odpověď) - kap. \ref{sec:response}.
\end{itemize}

\subsection{Formát zprávy protokolu RIPng}
Zprávy zasílané protokolem RIPng mají strukturu, která je zobrazena na obrázku \ref{fig:ripngmessage}.

\begin{figure}[hbtp]
  \centering
  \includegraphics[width=17cm]{fig/ripngmessage.png}
  \caption{Formát zprávy protokolu RIPng}
  \label{fig:ripngmessage}
\end{figure}

Pole \texttt{Command} obsahuje:
\begin{itemize}
\item \textbf{1}, pokud se jedná o zprávu typu \texttt{Response} nebo
\item \textbf{2}, pokud jde o zprávu typu \texttt{Request}.
\end{itemize}

Pole \texttt{Version} obsahuje verzi protokolu (v současné době vždy \textbf{1}).

Poslední pole v hlavičce -- \texttt{Must Be Zero} -- musí být při odesílání zprávy nastaveno na \textbf{0} a ignorováno při přijmutí.

Záznamy o dostupných sítích jsou přenášeny v polích \texttt{Routing Table Entry} (dále také RTE). Formát pole RTE je na obrázku \ref{fig:rte}.

\begin{figure}[hbtp]
  \centering
  \includegraphics[width=17cm]{fig/rte.png}
  \caption{Formát pole RTE}
  \label{fig:rte}
\end{figure}

Pole \texttt{IPv6 Prefix} obsahuje adresu sítě (prefix). \texttt{Route Tag} by měl obsahovat označení sítě - např. zda se jedná o síť distribuovanou z jiného protokolu. \texttt{Prefix Len} určuje délku prefixu. Pole \texttt{Metric} udává vzdálenost sítě (viz kap. \ref{sec:vlastnosti}), při ukládání RTE se tato vzdálenost většinou zvětší o jedna.

Maximální počet polí v jedné zpráve RIPng je omezen velikostí MTU\footnote[2]{MTU - Maximum Transmission Unit, maximální velikost jednotky dat, která může být po médiu přenesena.} média, po kterém se přenáší RIPng zpráva, viz \cite{RFC2080}.

\subsection{Speciální typ RTE}\label{sec:specRTE}
Protokol RIPng umožňuje určit další skok (\textsl{Next Nop}) pro RTE (jinak je určen ze zdrojové adresy zprávy). \textsl{Next Hop} se specifikuje jako RTE záznam, kde pole \texttt{IPv6 Prefix} určuje \textsl{Next Hop} adresu, pole \texttt{Route Tag} a \texttt{Prefix Len} je nastaveno na 0 a pole \texttt{Metric} má hodnotu 0xFF. Všechny RTE pod takovým záznamem mají potom \textsl{Next Hop} určen z tohoto záznamu.
Jako \textsl{Next Hop} adresa musí být adresa typu link-local, jinak je ignorována a \textsl{Next Hop} se opět určí ze zdrojové adresy zprávy (totéž v případě, kdy \textsl{Next Hop} = 0:0:0:0:0:0:0:0).

\section{Zprávy typu \texttt{Response}}\label{sec:response}
Zprávy typu \texttt{Response} obsahují dostupné sítě (připojené přímo nebo naučené pomocí protokolu RIPng) a jsou vytvořeny a odeslány pokud:
\begin{itemize}
\item je nutné vygenerovat pravidelnou aktualizaci (tzv. \textsl{Regular Update Message}) - generuje se každých 30 sekund viz kap. \ref{sec:timers},
\item se změnila metrika cesty (tzv. \textsl{Triggered Update Message}),
\item je přijata zpráva typu \texttt{Request},
\end{itemize}

\subsection{Vytvoření zprávy typu \texttt{Response}}
\texttt{Response} zpráva se vytváří pro každou připojenou síť (každé rozhraní), pokud se jedná o \textsl{Regular Update Message} nebo \textsl{Triggered Update Message}. Rozdíl mezi těmito zprávami je v jejich obsahu. \textsl{Regular Update Message} musí obsahovat všechny dostupné sítě, zatímco \textsl{Triggered Update Message} může obsahovat pouze RTE ze směrovací tabulky u nichž se změnila metrika (např. síť se stala nedostupnou, tyto RTE mají nastaven \textsl{Route Change Flag}, viz kap. \ref{sec:mazani}). Pro tyto typy zpráv je použita jako zdrojová adresa adresa příslušného rozhraní typu \texttt{link-local} (pokud má rozhraní více \texttt{link-local} adres, potom musí vybranou adresu používat po celou dobu, po které je dostupná), jako cílová adresa je nastavena multicastová skupina RIPng protokolu (\texttt{FF02::9}) a cílový port je RIPng port \texttt{521}. Na každý RTE v těchto zprávách je aplikován \textsl{Split Horizon} -- síť se neodešle na rozhraní, skrze které byla naučena, viz \cite{RFC2080} -- pro zamezení vytváření směrovacích smyček.

Pokud se vytváří \texttt{Response} zpráva, protože na ni byl přijat požadavek, odesílá se tato zpráva se zdrojem a cílem dle tabulky \ref{tab:tab1}. Jestliže navíc požadavek obsahoval žádost na konkrétní RTE záznam (více o požadavcích v kapitole \ref{sec:request}), v případě nalezení tohoto RTE záznamu, ve směrovací tabulce, se na něj neaplikuje \textsl{Split Horizon}.

\begin{table}[htbp]
\centering
\begin{tabular}{|cc||cccc|}
\hline
    \multicolumn{2}{|>{\columncolor[gray]{.8}}c||}{\texttt{Request Message}} & \multicolumn{4}{>{\columncolor[gray]{.8}}c|}{\texttt{Response Message}} \\
    \rowcolor[gray]{.8}
    Zd. adr. & Zd. port &
    Zd. adr. & Zd. port & Cíl. adr. & Cíl. port\\
\hline
    \multicolumn{1}{|c}{FF02::9} & 521 & link-local & 521 & link-local & 521 \\
    \hline
    \multicolumn{1}{|c}{unicast} & libovolný & global-unicast & 521 & \texttt{Request} zd. adr. & \texttt{Request} zd. port \\
\hline
\end{tabular}
\caption{Zdroj a cíl odpovědi na základě zdroje požadavku}
\label{tab:tab1}
\end{table}

V \texttt{Response} zprávě se nesmí objevit RTE s \texttt{link-local} adresou.

Po odeslání \textsl{Regular Update Message} nebo \textsl{Triggered Update Message} jsou všechny \textsl{Route Change Flag} resetovány.

\subsection{Zpracování zprávy typu \texttt{Response}}
Při přijmutí odpovědi se kontroluje zda:
\begin{itemize}
\item je z RIPng portu,
\item je zdrojová adresa typu link-local,
\item není zdrojová adresa vlastní,
\item je u zpráv \textsl{Regular Update Message} nebo \textsl{Triggered Update Message} nastaven hop-count na 255 - zpráva přišla od souseda.
\end{itemize}
Pokud některá podmínka nevyhoví kontrole, je odpověď zahozena.

Po kontrole hlavičky zprávy se prochází všechny RTE. Každý záznam se zkontroluje zda obsahuje validní IPv6 prefix (nesmí být multicast, či link-local adresa), délku prefixu (0-128) a metriku (0-16).

Každý RTE se zpracuje způsobem, který je znázorněn na obrázku \ref{fig:rteprocess}.

\begin{figure}[hbtp]
  \centering
  \includegraphics[trim = 20mm 150mm 20mm 10mm, clip, width=15cm]{fig/rteprocess.pdf}
  \caption{Zpracování RTE ze zprávy typu \texttt{Response}}
  \label{fig:rteprocess}
\end{figure}

\section{Zprávy typu \texttt{Request}}\label{sec:request}
Zprávy typu \texttt{Request} obsahují požadavek na dostupné sítě a jsou většinou posílány, pokud:
\begin{itemize}
\item se spustil RIPng proces, který potřebuje zjistit všechny dostupné sítě,
\item je potřeba diagnostikovat síť.
\end{itemize}
V prvním případě se požadavky odesílají jako multicast zpráva z RIPng portu. V případě druhém by měl být požadavek určen přímo -- unicastovou adresou směrovače -- a měl by být odeslán z jiného portu než je RIPng port.

\subsection{Zpracování zprávy typu \texttt{Request}}
Zpráva typu \texttt{Request}, stejně jako zpráva typu \texttt{Response}, obsahuje RTE.

RTE v tomto případě znamená požadavek, zda je síť určená tímto RTE dostupná pro daný směrovač. Pro každou takovou síť se k RTE nastaví příslušná metrika. Pokud požadovaná síť není dostupná je metrika nastavena na 16. Typ zprávy se změní na \texttt{Response} a zpráva je odeslána zpět.

Pokud požadavek obsahuje pouze jediný záznam RTE, který má všechna pole, mimo pole metriky, nastavena na \textbf{0} a metriku nastavenu na \textbf{16}, znamená to požadavek na zaslání všech dostupných sítí (v odpovědi se aplikuje \textsl{Split Horizon}).

\section{Časovače}\label{sec:timers}
RIPng používá následující časovače:
\begin{itemize}
\item Každých 30 sekund se generuje \textsl{Regular Update Message}, viz kap. \ref{sec:response}.
\item Každý RTE má vlastní \textsl{Timeout} časovač o délce 180 sekund. Po vypršení tohoto časovače se spustí proces mazání cesty - viz kap. \ref{sec:mazani}.
\item Každý RTE má navíc \textsl{Garbage-Collection Time} časovač, který se spouští při procesu mazání cesty. Tento časovač má délku 120 sekund a po jeho vypršení se RTE odstraní ze směrovací tabulky.
\item \textsl{Triggered Update} časovač, jehož délka je určena náhodně od 1 do 5 sekund. Tento časovač se spouští před odesláním \textsl{Triggered Update Message} a pokud se má odeslat další \textsl{Triggered Update Message}, odešle se až po uplynutí tohoto časovače.
\end{itemize}

\section{Proces smazání cesty}\label{sec:mazani}
Tento proces je spuštěn pro RTE ve směrovací tabulce, pokud:
\begin{itemize}
\item mu vypršel \textsl{Timeout} časovač nebo
\item se mu nastavila metrika o délce 16.
\end{itemize}
Proces smazání cesty zahrnuje následující akce:
\begin{itemize}
\item spuštění \textsl{Garbage-Collection Time} časovače pro daný RTE,
\item nastavení metriky na 16,
\item nastavení \textsl{Route Change Flag},
\item indikace, že se má vytvořit \textsl{Triggered Update Message} zpráva, viz kap. \ref{sec:response}.
\end{itemize}


