# Routing Information Protocol

Das Routing Information Protocol (RIP) ist ein Routing-Protokoll auf Basis des Distanzvektoralgorithmus, das innerhalb eines autonomen Systems (z. B. LAN) eingesetzt wird, um die Routingtabellen von Routern automatisch zu erstellen. Es gehört zur Klasse der Interior Gateway Protocols (IGP).
RIP wurde zuerst in RFC 1058 (1988) definiert. Das Protokoll wurde seitdem mehrfach erweitert und liegt nun als RIP Version 2 (RFC 2453) vor.
Beide Versionen werden noch heute eingesetzt, jedoch werden sie als technisch veraltet betrachtet und sind durch neuere Protokolle wie Open Shortest Path First (OSPF) oder das OSI Protokoll IS-IS abgelöst worden.
RIP wird in den Protokollen IP und IPX benutzt und wurde unter dem Namen RIPng (RIP next generation) im RFC 2080 (1997) erweitert, um auch IPv6 zu unterstützen.

## Überblick

Beim Starten eines Routers kennt dieser nur seine direkt angeschlossenen Netzwerke. Ein neuer Router sendet daher auf jedem RIP-konfigurierten Interface eine Aufforderung an alle seine Nachbarn mit der Bitte um Zusendung ihrer vollständigen Routingtabelle. Aus den erhaltenen Antworten errechnet der fragende Router die ersten Einträge seiner noch ungefüllten Routingtabelle. Im Anschluss daran schickt er ein triggered Update mit seiner neu erstellten Routingtabelle an alle RIP-Nachbarn, so dass diese ihrerseits über eventuelle neue Wege informiert werden.
RIPv1 kennt keine Subnetzinformationen. Ein Router kann daher Subnetze nur auf zwei Wegen berücksichtigen: entweder er nutzt die an seinem Interface speziell konfigurierte Subnetzmaske oder er zieht die Standardsubnetzmaske heran. Auf Grund dieser Einschränkung können über RIPv1 verwaltete Netze nicht VLSM oder verteilte Subnetze berücksichtigen.
Um Änderungen im Netzwerk (Ausfall oder Start eines Routers) zu erkennen, wird das Senden der Routingtabellen – das sogenannte Advertisement – regelmäßig (alle 30 Sekunden bei IP) wiederholt, dabei wird stets die gesamte Routingtabelle jedoch nur an alle direkten Nachbarn gesendet. Die Routinginformationen breiten sich damit relativ langsam im Netz aus, bei einer maximalen Ausdehnung des Netzes von 15 Routern ("Hops") beträgt die Zeitdauer bereits sieben Minuten. Zudem ist nicht garantiert, dass die Informationen bei den benachbarten Routern ankommen, da die Advertisements über UDP versendet werden, die Übertragung also nicht zuverlässig ist.
Die Kosten (auch Metrik) bezeichnen den Aufwand, um ein bestimmtes Netz zu erreichen. Beim Protokoll RIP wird zur Berechnung der Metrik allein der Hop Count verwendet; er bezeichnet die Anzahl der Router, die entlang eines Pfades bis zum Zielnetz durchlaufen werden müssen. Im Gegensatz zu anderen Routing-Protokollen lässt RIP damit die Bandbreite mehrerer zur Auswahl stehender Wege unberücksichtigt. Bei RIP für IPX wird zusätzlich noch der Tick-Count benutzt; er bezeichnet die Verzögerung eines Paketes durch alle Router bis zum Zielnetz.
Im Gegensatz zu OSPF und NLSP kennt ein RIP-Router immer nur seine direkten Nachbarn. Bei Änderungen im Netzwerk dauert es eine gewisse Zeit, bis alle Router wieder eine einheitliche Sicht auf das Netzwerk haben. Mit Erreichen dieses Zustandes spricht man von Konvergenz. Durch Nutzung des BFD-Protokolls durch RIP lassen sich Konvergenzzeiten im Millisekundenbereich erzielen.
Die nur direkte Bekanntschaft seiner Nachbarn ist auch das größte Problem von RIP. Zum einen ergeben sich hohe Konvergenzzeiten und das Count-to-Infinity-Problem. Infinität bezeichnet die Unerreichbarkeit eines Ziels und wird bei RIP mit dem Hop-Count 16 angegeben.

## Beispiel

Das Netz 1 wird somit erreicht von:
* Router A mit dem Hop 0
* Router B mit Hop 1 über Router A
* Router C mit Hop 2 über Router B und Router A.
Fällt Router A aus, teilt Router B beim nächsten periodischen Update an Router C den Hopcount 16 mit, was Nichterreichbarkeit oder "unendliche Route" bedeutet. Trifft nun bei Router B ein Paket eines anderen Routers ein, der Netz 1 noch erreichen kann, ist dessen Hopcount geringer und Router B wird seine Routingtabelle entsprechend aktualisieren.

### Problemfälle

Ist Netz 1 ausgefallen und sendet Router C seine Routingtabelle an Router B, bevor die Nachricht von der Nicht-Erreichbarkeit des Netzes durch das Netz propagiert wurde, erhält Router B nach dem Update von Router A die Information, das Netz 1 noch über Router C mit Hopcount 3 erreichen zu können. Router C hat seine Routingtabelle ja noch nicht aktualisiert und sendet diese veraltete Information weiterhin an seine Nachbarn, bis er von dort den Hopcount 16 erfährt. Damit übernimmt Router B dann die Route in das Netz 1 mit Hopcount 4.
Router B würde beim nächsten Austausch Hop 4 an Router C senden, dieser übernimmt diese Information und trägt Hop 5 in seine Routingtabelle ein, da er bisher bereits Netz 1 über Router B erreicht. Somit schaukeln sich beide Router nur langsam nach und nach bis auf Hop 16 auf, bis von allen Beteiligten Nichterreichbarkeit festgestellt wird.
Mechanismen zur Vermeidung spezieller Fälle dieses Problems sind Split Horizon, Triggered Updates und (bei RIP mit IP) Split Horizon with Poisoned Reverse. Mit dem Erweiterungsalgorithmus RIP-MTI lassen sich Routing-Loops sogar vollständig erkennen und das Count-to-Infinity-Problem tritt überhaupt nicht mehr auf.
RIP erlaubt deshalb nur Netze mit einer maximalen Länge von 15 Routern (d. h. der längste Pfad darf maximal über 15 Router gehen). Daneben hat RIP je nach Version noch weitere Nachteile: Lange Konvergenzzeit, nur kleine bis mittlere Netze, Flutung des Netzes durch Austausch der Routingtabellen bei RIPv1 (alle 30 Sekunden bei IP, alle 60 Sekunden bei IPX) über Broadcast, keine Subnetz-Unterstützung und keine Authentifizierung. RIP wird daher mehr und mehr von OSPF abgelöst.

## Versionen

Es existieren drei Versionen von RIP: RIP(v1), RIPv2 und RIPng.
Der dem RIP-Protokoll zu Grunde liegende Bellman-Ford-Algorithmus wurde im Jahr 1967 das erste Mal in einem Computernetzwerk als erstes Routingprotokoll für das ARPANET verwendet.

### RIPv1

Die ursprüngliche Spezifikation von RIP in RFC 1058 benutzt noch kein CIDR. Die regelmäßig versendeten Routinginformationen enthalten keine Informationen über die verwendeten Subnetze, so dass alle Netze die Größe der zugehörigen Netzklasse haben müssen. Des Weiteren ist in RIPv1 keine Möglichkeit zur Authentifizierung vorgesehen, so dass verschiedene Angriffe auf das Routing eines Netzes erfolgen können. RIPv1 begrenzt zudem die Anzahl der möglichen HOPs zwischen Routern auf 15.

### RIPv2

Mit der Version RIPv2 wurden 1993 einige Einschränkungen beseitigt. RIPv2 stellt den nahtlosen Übergang auf eine neue Version des RIPv1 dar, mit dem Anspruch unter weitgehender Beibehaltung des Paketformates und seines Transportmechanismus die Begrenzung durch die Nichtweitergabe der Subnetzinformation aufzuheben. RIPv2 wandelt sich daher zu einem classless Protokoll CIDR als wichtigstem Unterschied zur Vorgängerversion, besitzt darüber hinaus aber noch weitere kleinere Anpassungen wie die Nutzung von Multicast-Adressen Multicast für Updates oder Authentifizierungsmöglichkeiten. Viele Merkmale, die RIPv1 prägen, bleiben bei RIPv2 jedoch erhalten. Dazu zählen die Erreichbarkeitsgrenze mit 15 „Hops“, die Verwendung der Mechanismen zur Schleifenunterdrückung und triggered Updates zur schnelleren Konvergenz.

### RIPng

RIPng ist in RFC 2080 definiert und enthält Erweiterungen zur Unterstützung von IPv6.

## Paketformate
### RIP v1

| command | version | must be zero | must be zero |
| address family identifier (of net 1) | address family identifier (of net 1) | must be zero | must be zero |
| IP address (of net 1) ||||
| must be zero ||||
| must be zero ||||
| metric (distance to net 1) ||||
| address family identifier (of net 2) | address family identifier (of net 2) | must be zero | must be zero |
| IP address (of net 2) ||||
| must be zero ||||
| must be zero ||||
| metric (distance to net 2) ||||
| address family identifier (of net 25) | address family identifier (of net 25) | must be zero | must be zero |
| IP address (of net 25) ||||
| must be zero ||||
| must be zero ||||
| metric (distance to net 25) ||||
Die Tabelle ist 4 Bytes breit, Blöcke über net2–net25 sind optional.

### RIP v2

| command | version | must be zero | must be zero |
| RIP-Eintrag (20 Bytes) ||||
Die Tabellen sind 4 Bytes breit.
Abhängig vom Eintrag im Feld version besteht ein RIP-Eintrag aus einem RIPv1-Eintrag (AFI etc.), einem RIPv2-Eintrag (s. u.) oder einem Authentifizierungs-Eintrag (s. u.). Mehr Details stehen in RFC 2453.

#### Beispiele eines RIP-Eintrags

1. RIP-Eintrag mit Subnet Mask (version muss auf 2 gesetzt sein)
* address family identifier
* IP Address |||
* Subnet Mask |||
* Next Hop |||
* Metric |||
2. RIP-Eintrag mit Authentifizierung (version muss auf 2 gesetzt sein)
| 0xFFFF | 0xFFFF | Authentication Type | Authentication Type |
| Authentication (16 Bytes) ||||

## Freie Software-Implementierungen

* Quagga (Weiterentwicklung von Zebra)