IP Routing, Traceroute Willem Bleymüller, Alexander Kaiser Direktes und Indirektes Routing Hierzu betrachten wir zwei einfache Beispiele: 1. Zwei Rechner (Hosts) H1 und H2 befinden sich im gleichen Subnetz. In diesem Fall können die Rechner direkt miteinander kommunizieren, also Datagrams untereinander austauschen. Der sendende Rechner (H1) kapselt das Datagram in einen sog. Hardwareframe ein. In diesem Hardwareframe befindet sich die Hardwareadresse des empfangenden Rechners (H2), die via ARP ermittelt wurde. Nun sendet H1 das Hardwareframe über sein Netzwerkinterface direkt an H2. In diesem Fall sprechen wir von direktem Routing. Dasselbe gilt auch für den Fall wenn ein Router das Datagram direkt an einen Host weiterleiten kann. 2. Zwei Rechner (Hosts) H1 und H2 befinden sich in zwei unterschiedlichen, durch Router verbundenen Subnetzten. Bei einem Router handelt es sich genaugenommen um einen Rechner, der allerdings mindestens zwei Netzwerkinterfaces besitzt. Jedes Interfaces befindet sich in einem anderen Subnetz. Im einfachsten Fall sind zwei Rechner direkt mit einem Router verbunden. Die gesendeten Datagrams werden jetzt nichtmehr direkt von H1 an H2 versandt, sondern werden zunächst von H1 zum Router gesendet. Der Router versucht nun die Hardwareadresse des Zielhosts aufzulösen um das Datagram zuzustellen. Es bestehen also 2 direkte Verbindungen; die eine von H1 zum Router, die andere vom Router zu H2. Die Verbindung von H1 zu H2 ist somit indirekt, man spricht auch von "indirektem Routing". Was ist ein Router? Sowohl ein Host wie auch ein Router ist ein vollwertige Rechner. Alle Rechner in einem Netzwerk enthalten eine Tabelle, in der Routen zu anderen Rechnern und Netzen festgelegt sind. Ein Router hat allerdings eine andere Funktion wie ein normaler Host. Während auf einem Host Endanwendungen laufen, die Daten versenden oder empfangen um sie weiterzuverarbeiten, soll ein Router diese Datagrams nur weiterleiten. Die einzige Ausnahme stellen Daten für routerinterne Dienste wie z.B. dynamische Routingprotokolle dar. Ausserdem muss ein Router im Gegensatz zu einem Host immer mindestens zwei Netzwerkschnitstellen besitzen, mit denen er Teile des gesamten Netzwerk verbindet. Allgemein ist ein Host also ein Endpunkt eines Netzes und ein Router ein Knotenpunkt. Man unterscheidet Router zusätzlich in zwei Typen. Von einem Gateway spricht man, wenn es sich um einen Router mit Netzwerkschnitstellen des gleichen Hardwaretypen (z.B. ethernet-ethernet) handelt. Alles Andere wird einfach nur "Router" genannt. Ein Router funktioniert ähnlich wie ein "Switch", es gibt jedoch grundsätzliche Unterschiede zwischen Router und Switch: 1. Während ein Switch auf Layer 2 des OSI 7 Schichtenmodell arbeitet, ist ein Router auf Layer 3 einzuordnen. Das bedeutet, dass ein Router den Weg für ein Datagram nicht anhand der Hardwareadresse bestimmt, sonder anhand der IP-Adresse im Header. Deshalb können Router auch Netze mit Verschiedenen Hardwaretypen verbinden. (z.B. lokales ethernet und internet via ISDN). 2. Ein Router besitzt wie ein Switch eine Tabelle in der die Adressen für die Weiterleitung von Datagrams festgehalten werden. Der Router kann die Adressen der Subnetze allerdings nicht selber herausfinden, er muss über Routingtabellen manuell konfiguriert werden, damit eine sinvolle Route für die Datagrams gewährleistet wird. Auswahl der Route für ein Datagram Die Wahl des Weges, den ein Datagram in einem Router nimmt, kann auf verschiedene Arten geschehen: 1. Setzen eines einzigen Tabelleneintrag (Default Routing). 2. Setzen von Einträgen für alle Subnetze (Statisches Routing) 3. Automatisches setzen der Einträge durch ein spezielle Routingmechanismen (Dynamisches Routing) Default Routing Bei dieser Methode des Routings werden alle Pakete, die nicht lokal versendet werden können, an einen Router weitergeleitet. Dieser Router entscheidet dann, wie die Pakete weitergeleitet werden. Sinnvoll ist diese Methode für Netze, an denen nur ein Router angeschlossen ist. Der einzige Weg zu anderen Netzen führt dann sowieso über diesen einzelnen Router. Statisches Routing Diese Methode des Routings impliziert eine Routingtabelle in die verschiedene Einträge für verschiedene Netze oder einzelne Hosts geschrieben werden. Jeder Eintrag muss eindeutig sein, da sonst Datagrams dupliziert werden könnten, was auf jeden Fall vermieden werden muss. Da die Einträge immer gleich sind, bedeutete der Ausfall eines Routers, dass das Netz hinter ihm nicht mehr erreichbar wäre. Mann müsste die Routingtabellen aller verbliebenen Hosts/Router manuell umschreiben und einen Ersatzrouter angeben, damit das Netz wieder erreichbar wird. Der damit verbundene Aufwand wäre sehr hoch. Dynamisches Routing Dynamisches Routing gibt es sowohl bei Routern als auch bei Hosts. Diese Funktion vermeidet auf die in der Sektion "Statisches Routing" angegebenen Probleme der Erreichbarkeit beim Ausfall eines Routers. Die Routingtabellen weerden hierbei automatisch aktualisiert. Da Router eine anderer Funktion haben als Hosts, muss man hier eine Fallunterscheidung machen. Hosts können vom Router sog. "Router Advertising Mitteilungen" erhalten. Diese Mitteilungen enthalten Informationen, welche Netze oder Hosts über den jeweiligen Router erreichbar sind. Die Router senden diese Informationen periodisch nach einer festgelegten Zeit. Wenn ein Router über eine längere Zeit keine "Router Advertising Mitteilung" sendet, weil er z.B. ausgefallen ist, wird dieser Router aus der Routingtabelle des Hosts gelöscht und der Host benutzt einen anderen Router der zum gleichen Ziel führt. Da die Routingalgorithmen der Hosts so ausgelegt sind, dass sie immer den Router wählen, der für ein Ziel zuerst in der Tabelle eingetragen ist, kann es vorkommen, dass der Host einen ungünstigen Weg ermittelt. In diesem Fall kann der zu benutzende Router eine ICMP Redirect Message verschicken, der den Host anweist für sein Ziel demnächst einen anderen Router zu verwenden. Bsp: Wir haben zwei Router R1 (124.44.55.1) und R2 (124.44.55.2) die ein Advertising für das gleiche Zielnetz (123.33.44.0/255.255.255.0) schicken. Der Eintrag in der Routingtabelle des Host dürfte dann so aussehen: Destination Gateway Genmask Iface 123.33.44.0 124.44.55.1 255.255.255.0 eth0 123.33.44.0 124.44.55.2 255.255.255.0 eth0 R2 kennt nun aber den schnelleren Weg zu diesem Ziel, trotzdem würde der Host alle Pakete an sein Ziel über R1 senden, da dieser zuerst in der Routingtabelle steht. Wenn R1 aber ein Datagram für das Netz empfängt und "weiss", dass R2 einen schnelleren Weg findet, so wird er an den Host eine Redirect Message schicken und seine Routingtabelle ändern. Für Router sind solche einfachen Mechanismen nicht ausreichend, da sie z.B. keine Informationen über Qualitätsfaktoren wie z.B. Geschwindigkeit oder Anzahl der zwischen diesem und dem entfernten Netz liegenden Routern beinhalten. Deshalb benutzen Router spezielle Routingprotokolle mit denen sie untereinander Informationen über eben solche Qualitätsfaktoren austauschen. Eine wichtige Information für solche Routingprotokolle ist das sog. "Metric Feld". Je höher die "Metric" eines Netzes, desto schlechter ist die Verbindung zu diesem Netz. Router, die ein solches Routingprotokoll benutzt, wählen auf jeden Fall immer den Weg, der den niedrigeren Metric-Wert besitzt. Destination Gateway Genmask Metric Iface 123.33.44.0 124.54.5.2 255.255.255.0 3 ppp0 123.33.44.0 153.64.6.6 255.255.255.0 6 arc0 123.33.44.0 163.32.79.8 255.255.255.0 2 eth1 Der Router würde auf jeden Fall das Ethernet-Interface eth1 benutzen, da dieses den geringsten Metric-Wert hat. In diesem Beispiel sehen wir auch, dass ein Router mehrere Interfaces verschiedener Hardwaretypen besitzen kann (z.B. arc0 für arcnet und ppp0 für eine Point-to-Point Verbindung). Auch bei Routing-Protokollen ist ein periodischer Datenaustausch zwischen den Routern dringend erforderlich. Auf den Routern laufen Programme, die diese Informationen auswerten und die Routingtabelle dementsprechend ändern. Diese Programme benutzen teilweise sehr aufwendige Algorithmen zur Bestimmung optimaler Routen (z.B. um zu vermeiden, dass es zu "Routing Loops", also Endlos-Schleifen kommt) . Funktion der Routingalgorithmen Da ein Router mehrere Einträge in seinen Routingtabellen hat, muss er bei einem ankommenden Datagram erstmal ermitteln, auf welchem Interface es weiterlgeleitet werden soll. Das geschieht vereinfacht nach folgendem Algorithmus: - - - Ein Paket kommt an Erst wird die Zieladresse D des Datagrams extrahiert und das Netzwerk-Fräfix N durch logische AND-Verknüpfung ermittelt. z.B. D={IP=192.168.100.100 Netmask=255.255.255.0} bedeutet N=192.168.100.0 Wenn N einem direkt angeschlossenen Netzwerk entspricht, schicken wir das Paket direkt auf dem entsprechenden Interface raus . z.B. Ethernet-Interface eth0 mit der IP 192.168.100.1 und der Netmask 255.255.255.0. Durch logische ANDVerknüpfung erhalten wir auch hier ein Netzwerkprefix von 192.168.100.0. Wir sind also direkt verbunden. Das Paket wird dann in einen Ethernet-Hardwareframe verpackt und mit der Hardwareadresse des Ziels versehen. Jetzt schicken wir es auf eth0 raus. Ansonsten schauen wir in der Routingtabelle, ob es einen direkten Eintrag für den Host D gibt; ist das der Fall, ermitteln wir das Interface auf dem wir das Paket weitersenden müssen. Danach ermitteln wir die Hardwareadresse des nächsten Knotenpunkts (HOP), packen das Datagram in einem Hardwareframe und schicken es auf dem Interface zum nächsten HOP raus. Ansonsten schauen wir, ob es einen Eintrag in der Routingtabelle für das Netzprefix N gibt und schicken es gegebenenfalls nach der gleichen Prozedur wie oben raus. Wenn wir bis jetzt das Paket nicht versenden konnten, schauen wir, ob es in der Routingtabelle einen Defaultgateway gibt. Wenn wir einen finden, ermitteln wir die Hardwareadresse des Defaultgateways und schicken das Paket dementsprechen raus. Wir sind am Ende angelangt und konnten kein Ziel für das Paket finden. Das bedeuted, dass wir einen Routing-Error produzieren müssen, und das Paket nicht weiterleiten können. Das obere Schema zeigt eine weitere Funktion von Routern. Da Router in verschiedenen Netzen arbeiten und das Ziel in einem Netz anhand der Hardwareadresse bestimmt wird, ändert der sog. "Routing-Code" während das Datagram den Router durchläuft dessen Hardwareadresse. Er packt das Datagram aus seinem bisherigen Hardwareframe aus und verpasst ihm einen Neuen. Ausserdem verringert jeder Router die TTL des Pakets um 1 (wenn die TTL=0 ist, wird ein ICMP-Fehler an den sendenden Host zurückgegeben und das Paket gelöscht). Heutzutage würde es aber mehrere Probleme geben, wenn man den Routing-Code nur nach obigen Schema implementieren würde. Zum einen sind sehr viele Router direkt durch "Leased Lines" (z.B. T1) verbunden. Diese Netzwerkschnitstellen besitzen kein eigenes IP-Subnetz, da es für zwei Netzwerkschnitstellen in einem Netzwerk eine reine Verschwendung wäre. Die Lösung für dieses Problem ist prinzipiell einfach, man benötigt für so eine "Leased Line" eigentlich weder IP- noch Hardwareadresse des entfernten Routers, da man ja sowieso nur einen Rechner ansprechen will. Es wird aber trotzdem eine IP-Adresse (z.B. die IP einer anderen Netzwerkschnitstelle des entfernten Rechners) angegeben, weil die Routingtabelle für Menschen somit leichter verständlich ist. Ein viel komplexeres Problem ist das "Classless Networking" (CIDR) oder auch "Superneting-Prinzip". Hierbei werden z.B. Firmen einfach Teilen einer Netzwerkklasse zugeteilt. So beschreibt beispielsweise das Netzwerk 192.168.1.0/3 die drei Klass-C-Netzwerke 192.168.1.0, 192.168.2.0 und 192.168.3.0. Wenn sich diese drei Netzwerke alle hinter einem Router befinden, kann man mit dem oben genannten Algorithmus nicht mehr das Netzprefix N bestimmen. Der einfachste Weg, trotzdem Netzwerkprefixe zu verwenden greift auf sog. "unique Prefixes", Anfänge der Netzadresse in binärschreibweise, die der Routingtabelle zugefügt werden. Die obige Routingtabelle sähe dann in etwa so aus: 110 010 011 eth0 eth1 eth2 Wenn wir ein Paket erhalten, setzen wir die IP-Adresse einfach in binärschreibweise um. Die IP-Adresse 192.168.0.20 wird dann beispielsweise zu 11000000 01101000 00000000 00010100. Die einfachste Möglichkeit jetzt das Ziel zu bestimmen, wäre die gesamten 32 Bit einer Adresse mit der Routingtabelle zu vergleichen. Wenn wir keinen Eintrag fänden müssten wir 31 Bit der Adresse vergleichen, usw. bis 0 Bit. Wenn wir dann immer noch nichts gefunden haben müssten wir einen "Routing Error" melden. Im Beispiel finden wir eine Route wenn wir die letzten 3 Bit vergleichen. Da das Verfahren aber sehr ineffizient ist, hat man andere Verfahren entwickelt. Eine bessere Lösung ist ein Binärbaum: Man beginnt mit der Suche bei der Wurzel und hätte in unserem Fall nach drei Zweigen einen möglichen Eintrag. Die äusseren Einträge des Binärbaums müssten aber jeweils die 32Bit für die IP A und die 32 Bit für die Netzmaske M enthalten. Wenn wir am Ende eines Zweiges sind, verknüpfen wir die Netzmaske M mit der IP des Pakets durch ein logische AND und schauen, ob sie der IP A entspricht. Ist das der Fall, haben wir eine Route gefunden, ansonsten melden wir einen "Routing Error". Das Verfahren ist also nicht geeignet, um exakte Routen, sondern nur um möglich Routen zu finden. Anzeigen von Routen Da kein Router im Internet über genügend Netzwerkschnitstellen verfügt, dass er mit jedem anderen Subnetz auf der Welt direkt verbunden ist, kommt es vor, dass ein Datagram bei der Übertragung zwischen zwei Hosts mehrere Router passiert. In der Routingtabelle des mit dem sendenden Host verbundenen Router ist dann ein anderer Router eingetragen, der weiss, wo das Datagram weitergeleitet werden muss. Bis das Datagram den zum Empfang bestimmte Host erreicht, kann es so durch viele Subnetze verschickt worden sein. Man kann den Weg von einem Host zu einem Anderen mit Hilfe des Traceroute-Programms (bzw. tracert unter Windows) zurückverfolgen. Das Programm arbeitet auf folgende Weise: Der sendende Host schickt jeweils drei UDP Pakete mit gleicher TTL und einem Port > 30000 an das Ziel. Die TTL enthält zu Beginn den Wert 1 und wird nach jedem dritten Paket um 1 inkrementiert bis das Paket alle HOPs durchläuft und das Ziel erreicht. Wenn ein Router das Paket erhält und die TTL von 1 auf 0 setzt, sendet er die ICMP-Meldung 11 zurück. Bei jeder empfangenen ICMP Meldung wird die "Round Trip Time" (RTT, siehe Ping) berechnet. Ist sie grösser als 5 Sekunden wird ein "*" für "Time Out" ausgegeben. Falls die TTL am ende groß genug ist um den Zielhost zu erreichen, wird die ICMP-Meldung 3 zurückgesendet, da ein port > 30000 nicht exestiert. So weiss der sendende Computer, wann das Paket sein Ziel erreicht hat. Traceroute Bsp: willem@penguin $ traceroute www.techfak.uni-bielefeld.de traceroute to www.techfak.uni-bielefeld.de (129.70.136.200), 30 hops max, 40 byte Pakets 1 www (192.168.100.100) 0.523 ms 0.581 ms 0.135 ms 2 217.5.98.88 (217.5.98.88) 65.602 ms 60.748 ms 60.913 ms 3 217.237.152.226 (217.237.152.226) 62.266 ms 59.568 ms 60.924 ms 4 H-EB1.H.DE.net.dtag.de (62.154.49.134) 62.733 ms 62.386 ms 60.652 ms 5 ir-hannover2-po1-0.g-win.dfn.de (188.1.62.1) 60.954 ms 61.567 ms 63.238 ms 6 cr-hannover1-ge5-0.g-win.dfn.de (188.1.88.61) 60.900 ms 60.934 ms 63.157 ms 7 cr-hamburg1-po3-2.g-win.dfn.de (188.1.18.177) 76.176 ms 73.206 ms 84.751 ms 8 cr-essen1-po3-3.g-win.dfn.de (188.1.18.229) 75.204 ms 73.269 ms 71.890 ms 9 ar-bielefeld1-po5-0.g-win.dfn.de (188.1.86.78) 76.175 ms 78.358 ms 76.878 ms 10 v01-cat6500-2-msfc.hrz.uni-bielefeld.de (129.70.189.4) 75.863 ms 75.994 ms 77.002 ms 11 * 12 www.TechFak.Uni-Bielefeld.DE (129.70.136.200) 79.622 ms 76.219 ms 77.248 ms