(104 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1:
Zeile 1:
== Neighbor Cache ==
'''IPv6 Neighbor Cache'''
Am internen Link sind nun drei Nodes vorhanden. Der Router fuzzball sowie die Hosts lynx und felis. Sind alle Maschinen hochgefahren, sieht der interne Link wie in Abbildung 4.5 dargestellt aus.
Neighbor Discovery Protocol
Dank der Link-local Addresses waren die Nodes in der Lage miteinander auf dem internen Link zu kommunizieren. Wir haben dies mit diversen Echo Requests bereits ausprobiert.
== Beschreibung ==
[[File:ipv6Abbildung4.5.png|mini|Nodes am internen Link]]
* [[Router]]
* [[Linux]]
* [[Windows]]
4.3 Neighbor Cache fuzzball
; Neighbor Discovery Protocol (NDP)
* Über die Link-local Addresses können Nodes auf dem internen Link kommunizieren
* Dies kann mit [[Echo Requests]] getestet werden
lynx internal eth1
; Link-local Addresses zu Link-layer Addresses auflösen
Nodes waren in der Lage die Link-local Addresses ihrer Nachbarn zu gültigen Link-layer Addresses aufzulösen
* Unser Link internal ist ein virtuelles Ethernet, die Link-layer Addresses entsprechen in unserem Netz deshalb den bei Ethernet gebräuchlichen MAC-Adressen
* Zuständig für die Auflösung von IPv6-Adressen zu Link-layer Addresses ist das Neighbor Discovery Protocol (NDP), spezifiziert in [[RFC/4861|RFC 4861]]
eth0
; [[NDP]] wird über [[ICMPv6]] transportiert
* Damit ist es von IPv6 abhängig, wenn es IPv6-Adressen auflösen soll
* Wie und warum das dennoch funktioniert, werden wir uns gleich anschauen
* Vorher machen wir uns aber noch mit den Neighbor Caches vertraut
* Jeder Node betreibt einen Neighbor Cache in dem er die Ergebnisse der Link-layerAdressauflösungen zwischenspeichert
Unter IPv4 haben wir für die Auflösung noch ARP benutzt, dessen Ergebnisse in der ARP-Tabelle zwischengespeichert wurden
Abbildung 4.5
; Gültigkeit des Neighbor Caches
Link internal mit fuzzball, lynx und felis
Einträge im Neighbor Caches sind je nach Betriebssystem und Zustand unterschiedlich lange gültig
* Im Normalfall sind sie recht kurzlebig
* Daher sind für die folgenden Experimente mitunter mehrere Anläufe notwendig
felis
Für das Einfangen eines ganz bestimmten Zustands müssen wir zum richtigen Zeitpunkt den Neighbor Cache auslesen
* Manchmal ist es daher vorteilhaft, das nächste Kommando schon in der Zwischenablage bereitzuhalten, um schneller reagieren zu können
LAN1
== Windows ==
[[IPv6/Host/Neighbor Cache/Windows]]
Das heißt, die Nodes waren in der Lage die Link-local Addresses ihrer Nachbarn zu gültigen Link-layer Addresses aufzulösen. Unser Link internal ist ein virtuelles Ethernet, die Link-layer Addresses entsprechen in unserem Netz deshalb den bei Ethernet gebräuchlichen MAC-Adressen. Zuständig für die Auflösung von IPv6-Adressen zu Link-layer Addresses ist das Neighbor Discovery Protocol (NDP), spezifiziert in RFC 4861 [NNSS07]. NDP wird über ICMPv6 transportiert. Damit ist es von IPv6 abhängig, wenn es IPv6-Adressen auflösen soll. Wie und warum das dennoch funktioniert, werden wir uns gleich anschauen. Vorher machen wir uns aber noch mit den Neighbor Caches vertraut. Jeder Node betreibt einen Neighbor Cache in dem er die Ergebnisse der Link-layerAdressauflösungen zwischenspeichert.
== Linux ==
Übrigens: Unter IPv4 haben wir für die Auflösung noch ARP benutzt, dessen Ergebnisse in der ARP-Tabelle zwischengespeichert wurden.
[[IPv6/Host/Neighbor Cache/Linux]]
Die Einträge in den Neighbor Caches sind je nach Betriebssystem und Zustand unterschiedlich lange gültig. Im Normalfall sind sie sehr kurzlebig. Wir brauchen für die folgenden Experimente deshalb mitunter mehrere Anläufe. Für das Einfangen eines ganz bestimmten Zustands müssen wir zum richtigen Zeitpunkt den Neighbor Cache auslesen. Manchmal ist es daher vorteilhaft, das nächste Kommando schon in der Zwischenablage bereit zu halten, um schneller reagieren zu können.
Hinweis
== Zustände der Einträge ==
{| class="wikitable big options"
|+ Bedeutungen der Zustände
|-
! Zustand !! Beschreibung
|-
| Incomplete || Es findet gerade eine Adressauflösung statt
* Diese konnte aber noch nicht erfolgreich beendet werden
|-
| Reachable || Der zugehörige Nachbar gilt als erreichbar
* Entweder findet gerade eine Kommunikation mit ihm statt oder eine solche ist erst wenige Sekunden her
|-
| Stale || Die Erreichbarkeit des zugehörigen Nachbarn ist unbekannt
* Es fand kürzlich eine Kommunikation mit ihm statt
* Solange keine weitere Kommunikation beabsichtigt ist, sollte auf eine erneute Adressauflösung verzichtet werden
|-
| Delay || Der zugehörige Nachbar gilt nicht als erreichbar
* Es wurde aber wieder eine Kommunikation mit ihm gestartet
* Bleibt eine Bestätigung der Erreichbarkeit durch die kommunizierende Schicht aus, wird auf IP-Schicht die Erreichbarkeit aktiv überprüft werden
|-
| Probe || Der zugehörige Nachbar gilt nicht als erreichbar
* Seine Erreichbarkeit wird gerade aktiv geprüft
* Sollte die Prüfung fehlschlagen, wird der Eintrag entfernt
|}
Wir wechseln zur Maschine felis und öffnen ein Terminal, zum Beispiel mit der bereits bekannten Methode Windows-Taste+R und cmd. Um sicher zu gehen, dass sich Einträge im Neighbor
== Adressauflösung mitschneiden ==
; Dass die Neighbor Caches funktionieren haben wir gerade gesehen
* Auch wissen wir dank der erfolgreichen Echo Requests, dass die Auflösung von IPv6-Adressen und Link-layer Addresses funktioniert
* Es ist nun an der Zeit, die Frage nach dem Wie zu beantworten
Neighbor Cache
; Dazu suchen wir uns einen Node aus, der gerade einen leeren Neighbor Cache hat, zum Beispiel ''router''
(Windows 8)
* Das Kommando zum Anzeigen des Neighbor Caches ist uns aus den vorherigen Experimenten noch bekannt
* Sollten sich noch gültige Einträge im Neighbor Cache befinden, warten wir noch etwas ab
4 Die Hosts Cache befinden werden, kommunizieren wir mit einem anderen Node auf dem Link. Ein Echo Request an die Link-local Address von lynx bietet sich da an.
Wenn der Node seine IPv6-Nachbarn schließlich vergessen hat, starten wir Wireshark auf dem entsprechenden Interface, hier eth1
Q
Um eine Adressauflösung zu erzwingen versenden wir wieder Echo Requests
PING fe80::200:ff:fe60:d1e%eth1 (fe80::200:ff:fe60:d1e) 56 data bytes
64 bytes from fe80::200:ff:fe60:d1e: icmp_seq=1 ttl=64 time=3.75 ms
3 packets transmitted, 3 received, 0% packet loss, time 2005 ms
C :\ Users \ user > ping -n 3 fe8 ::2 : ff : fe6 : d1e %12
=== Neighbor Solicitation ===
Pinging fe8 ::2 : ff : fe6 : d1e %12 with 32 bytes of data :
[[Router Solicitation]]
Reply from fe8 ::2 : ff : fe6 : d1e %12: time <1 ms
Packets : Sent = 3 , Received = 3, Lost =
( % loss ) ,
Sobald eine Antwort eintrifft, können wir den Vorgang abbrechen und uns den Neighbor Cache ausgeben lassen. Das Kommando dazu geben wir unmittelbar nach dem letzten Echo Request ein:
Die IPv6-Adresse fe8 ::2 :ff:fe6 :d1e wurde korrekt zur Link-layer Address - - -6 - d-1e aufgelöst. Der Zustand des Eintrages ist Reachable, das heißt, der zugehörige Node gilt auf dem Link als erreichbar. Nach circa 20 Sekunden lassen wir uns den Neighbor Cache ein weiteres Mal ausgeben:
Der Eintrag für die Adresse fe8 ::2 :ff:fe6 :d1e hat seinen Zustand zwischenzeitlich auf Stale gewechselt. Die Nachbarn am Link können offensichtlich verschiedene Zustände haben.
Neighbor Cache
(Debian GNU/Linux 6)
Die Zustände werden wir in einem weiteren Experiment, diesmal von lynx aus, untersuchen. Wir verschicken Echo Requests an fuzzball, werden uns aber bei Eingabe der Adresse im letzten Zeichen vertippen. Die Echo Requests gehen an die
4.3 Neighbor Cache Adresse fe8 ::219:83ff:fe 9:17db. Den Vorgang brechen wir vorerst nicht ab.
Q
user@lynx :~ $ ping6 fe8 ::219:83 ff : fe 9 :17 db % eth
Während lynx weiter fleißig Echo Requests versendet, öffnen wir ein zweites Terminal und schauen in diesem auf den Neighbor Cache. Unter Linux steht uns dafür das Kommando ip neighbor show zur Verfügung.
user@lynx :~ $ ip neighbor show
fe8 ::219:83 ff : fe 9 :17 db dev eth
INCOMPLETE
Wir lernen mit Incomplete einen weiteren Zustand kennen.
Nun brechen wir das Senden der Echo Requests im ersten Terminal ab, wechseln zügig in das zweite Terminal und lassen uns erneut den Neighbor Cache ausgeben.
user@lynx :~ $ ip neighbor show fe8 ::219:83 ff : fe 9 :17 db dev eth
FAILED
Sofern wir uns nicht zu viel Zeit gelassen haben, sehen wir noch den Zustand Failed bevor der Eintrag aus dem Neighbor Cache verschwindet. Failed ist allerdings kein Zustand den man in RFC 4861 [NNSS07] findet, sondern soll verdeutlichen, dass die Auflösung der Adresse nicht erfolgreich beendet werden konnte.
Den anderen Zuständen hingegen sind klare Bedeutungen zugeordnet:
Zustände der Einträge
Incomplete Es findet gerade eine Adressauflösung statt. Diese konnte aber noch nicht erfolgreich beendet werden.
Reachable Der zugehörige Nachbar gilt als erreichbar. Entweder findet gerade eine Kommunikation mit ihm statt oder eine solche ist erst wenige Sekunden her.
4 Die Hosts Stale Die Erreichbarkeit des zugehörigen Nachbarn ist unbekannt. Es fand kürzlich eine Kommunikation mit ihm statt. Solange keine weitere Kommunikation beabsichtigt ist, sollte auf eine erneute Adressauflösung verzichtet werden.
Delay Der zugehörige Nachbar gilt nicht als erreichbar. Es wurde aber wieder eine Kommunikation mit ihm gestartet. Bleibt eine Bestätigung der Erreichbarkeit durch die kommunizierende Schicht aus, wird auf IP-Schicht die Erreichbarkeit aktiv überprüft werden.
Probe Der zugehörige Nachbar gilt nicht als erreichbar. Seine Erreichbarkeit wird gerade aktiv geprüft. Sollte die Prüfung fehlschlagen, wird der Eintrag entfernt.
Adressauflösung mitschneiden
Dass die Neighbor Caches funktionieren haben wir gerade gesehen. Auch wissen wir dank der erfolgreichen Echo Requests, dass die Auflösung von IPv6-Adressen und Link-layer Addresses funktioniert. Es ist nun an der Zeit, die Frage nach dem Wie zu beantworten.
Dazu suchen wir uns einen Node aus, der gerade einen leeren Neighbor Cache hat, zum Beispiel fuzzball. Das Kommando zum Anzeigen des Neighbor Caches ist uns aus den vorherigen Experimenten noch bekannt. Sollten sich noch gültige Einträge im Neighbor Cache befinden, warten wir noch etwas ab.
Wenn der Node seine IPv6-Nachbarn schließlich vergessen hat, starten wir Wireshark auf dem entsprechenden Interface, hier eth1. Um eine Adressauflösung zu erzwingen versenden wir wieder Echo Requests:
3 packets transmitted , 3 received , % packet loss , time '
2 5 ms
4.3 Neighbor Cache Abbildung 4.6
Neighbor Solicitation
Hat der betroffene Node wie gewünscht geantwortet stoppen wir die Aufzeichnung und schauen uns die Ergebnisse in Wireshark an.
Das erste Paket von Interesse ist eine Neighbor Solicitation genannte Nachricht (siehe Abbildung 4.6).
Neighbor Solicitation
Da das Neighbor Discovery Protocol ein in ICMPv6 eingebettetes Protokoll ist, fängt der spannende Teil mit einem ICMPv6-Header an. Der Nachrichtentyp hat die Nummer 135
und den Code 0. Neben der Checksum und reservierten Bytes existiert ein weiteres Feld, die Target Address. Sie enthält die aufzulösende IPv6-Adresse und gehört zum Ziel unseres Echo Requests. Danach folgt eine ICMPv6-Option namens Source Link-layer Address. Dabei handelt es sich um zusätzliche Informationen, die der Absender im Paket unterbringen kann. Hier hat fuzzball die Link-layer Address seines Interfaces freundlicherweise im Paket vermerkt. Der Gegenseite liefert er damit wertvolle Informationen für ihren eigenen Neighbor Cache. Ganz nebenbei ersparen solche Zusatzinformationen dem Link das ein oder andere Paket.
Aber wie konnte das Paket überhaupt beim richtigen Node am Link landen, wo wir doch seine Link-layer Address noch nicht kennen? Die Lösung ist im IPv6-Header des Paketes versteckt und lautet Solicited Node Multicast Address. Sie wird wie in Abbildung 4.7 dargestellt berechnet.
Solicited Node Multicast Address
Pakete an die Solicited Node Multicast Address eines Nodes können auch bei unbekannter Link-layer Address an diesen
4 Die Hosts Abbildung 4.7
Solicited Node Multicast Address
00:00:00:60:0d:1e
Link-Layer Address (MAC)
ff02::1:ff60:0d1e
Solicited Node Multicast Address
Abbildung 4.8
Neighbor Advertisement
zugestellt werden. Wie genau das funktioniert werden wir in Abschnitt 4.5 Multicast lernen. Vorerst werden wir uns damit begnügen, dass es irgendwie funktioniert.
Neighbor Advertisement
Natürlich antwortet der angesprochene Node kurz darauf.
Er tut dies mit einem sogenannten Neighbor Advertisement.
Wieder schauen wir in das Paket, ähnlich Abbildung 4.8, hinein.
Die Typnummer lautet nun 136, der Code bleibt unverändert und hat den Wert 0. Die Target Address gibt weiterhin an, für welche IPv6-Adresse eine Auflösung stattfindet. Neu ist das Feld Flags, das wir neugierig aufklappen. Wireshark erläutert die Flags eher sparsam, darum hier ihre Bedeutung:
Router Ein gesetztes Flag zeigt an, das es sich bei der Quelle um einen Router handelt. Das ist wichtig zu wissen, da ein Router an einem Link seine Rolle aufgeben kann.
Er wird dann zu einem normalen Host. Diese Änderung zeigt er durch das Nichtsetzen des Flags an.
Solicited Mit diesem Flag wird darauf hingewiesen, dass das Neighbor Advertisement die Folge einer vorhergehen Neighbor Solicitation ist. Der Empfänger bekommt damit die Erreichbarkeit eines Nodes bestätigt. Mit der
4.4 Interface Identifier
Information kann er seinen Neighbor Cache aktualisieren und Einträge im Zustand Stale oder Probe zurück auf Reachable setzen.
Override Mit dem Override-Flag kann die Quelle festlegen, was das Ziel des Neighbor Advertisements in den Neighbor Cache eintragen soll. Ist es gesetzt, werden existierende Einträge zu der angegeben Adresse überschrieben.
Ist es nicht gesetzt, darf es lediglich einen unvollständigen Eintrag ergänzen. Adressen, deren Einträge man nicht mit jedem Neighbor Advertisement überschreiben will, sind zum Beispiel Anycast Addresses. Wenn mehrere Anycast Hosts am Link vorhanden sind, laufen die anderen Hosts sonst Gefahr, ständig ihre Neighbor Caches zu überschreiben, ohne einen Nutzen daraus zu ziehen.
Die letzte Information im Paket ist die Source Link-layer Address, der eigentliche Grund der Anfrage.
Übrigens: An diesem Beispiel zeigt sich die Flexibilität von IPv6. Die ICMPv6-Optionen werden stets zusammen mit einer Längenangabe versendet. Sollte sich irgendwann eine LinkTechnologie durchsetzen die mehr als 6 Bytes für eine Linklayer Address benötigt, steht einer Vergrößerung der entsprechenden ICMPv6-Option nichts im Wege.
Der gesamte Prozess der Adressauflösung zwischen zwei Nodes auf dem Link besteht aus nur zwei Paketen. Von den Paketen musste keines an alle Nodes gesendet werden (siehe Abbildung 4.9). Gegenüber Broadcast stellt das eine deutliche Einsparung dar, gerade an Links mit vielen Nodes.
Link-local Addresses zu Link-layer Addresses auflösen
Nodes waren in der Lage die Link-local Addresses ihrer Nachbarn zu gültigen Link-layer Addresses aufzulösen
Unser Link internal ist ein virtuelles Ethernet, die Link-layer Addresses entsprechen in unserem Netz deshalb den bei Ethernet gebräuchlichen MAC-Adressen
Zuständig für die Auflösung von IPv6-Adressen zu Link-layer Addresses ist das Neighbor Discovery Protocol (NDP), spezifiziert in RFC 4861