Zum Hauptinhalt springen

7. Adressauflösung und Neighbor Unreachability Detection (Address Resolution and Neighbor Unreachability Detection)

Dieser Abschnitt beschreibt Adressauflösung und Neighbor Unreachability Detection. Adressauflösung ist der Prozess, durch den ein Knoten die Link-Layer-Adresse eines Nachbarn bestimmt, wenn nur dessen IP-Adresse bekannt ist. Neighbor Unreachability Detection (NUD) ist der Prozess der Verfolgung des Erreichbarkeitszustands des Pfads zu einem Nachbarn.

7.1. Adressauflösung (Address Resolution)

Adressauflösung wird nur für Adressen durchgeführt, die als on-link bestimmt wurden. Sie wird niemals für Multicast-Adressen durchgeführt.

Wenn ein Knoten ein IPv6-Paket zu senden hat, untersucht er zunächst den Destination Cache, um die Next-Hop-Adresse für das Ziel zu bestimmen. Wenn der Destination Cache keinen Eintrag für das Ziel enthält, verwendet der Knoten den Next-Hop-Bestimmungsalgorithmus (siehe Abschnitt 5.2), um die Next-Hop-Adresse zu bestimmen.

Sobald die Next-Hop-IP-Adresse bekannt ist, untersucht der Sender den Neighbor Cache nach Link-Layer-Informationen über den Next-Hop. Wenn kein Eintrag existiert, erstellt der Sender einen, setzt seinen Zustand auf INCOMPLETE, initiiert die Adressauflösung und stellt das Datenpaket in die Warteschlange, bis die Adressauflösung abgeschlossen ist.

Für Multicast-Pakete ist der Next-Hop immer die (Multicast-)Zieladresse und wird als on-link betrachtet. Die Prozedur zur Bestimmung der Link-Layer-Adresse, die einer Multicast-IP-Adresse entspricht, wird in einem separaten Dokument beschrieben, das den Betrieb von IP über einen bestimmten Link-Typ abdeckt (z. B. [IPv6-ETHER]).

Für Unicast-Pakete wird die Adressauflösung wie folgt durchgeführt. Der Sender erstellt einen Neighbor Cache-Eintrag für die Next-Hop-Adresse (falls nicht bereits vorhanden), setzt seinen Zustand auf INCOMPLETE und initiiert die Adressauflösung durch Senden einer Neighbor Solicitation-Nachricht an die Solicited-Node-Multicast-Adresse, die der Zieladresse entspricht. Die Solicitation wird von einer Adresse gesendet, die der Schnittstelle zugewiesen ist, von der die Solicitation gesendet wird.

Die Target Address der Neighbor Solicitation wird auf die Next-Hop-Adresse gesetzt. Wenn der Sender eine Adresse hat, die der Schnittstelle zugewiesen ist, von der die Neighbor Solicitation gesendet wird, SOLLTE (SHOULD) die Source Link-Layer Address-Option enthalten sein. Wenn der Sender keine Adresse hat, die der Schnittstelle zugewiesen ist, von der die Solicitation gesendet wird (z. B. während der Initialisierung), DARF (MUST NOT) der Sender die Source Link-Layer Address-Option NICHT enthalten.

Während auf den Abschluss der Adressauflösung gewartet wird, MUSS (MUST) der Sender für jeden Nachbarn eine kleine Warteschlange von Paketen aufbewahren, die auf den Abschluss der Adressauflösung warten. Die Warteschlange MUSS (MUST) mindestens ein Paket enthalten und KANN (MAY) mehr enthalten. Die Anzahl der gepufferten Pakete pro Nachbar SOLLTE (SHOULD) jedoch auf eine kleine Zahl begrenzt sein. Sobald die Adressauflösung abgeschlossen ist, überträgt der Knoten alle gepufferten Pakete.

Während auf den Abschluss der Adressauflösung gewartet wird, sendet der Sender weiterhin Neighbor Solicitations. Neighbor Solicitations für die Adressauflösung werden alle RetransTimer Millisekunden gesendet, bis ein Neighbor Advertisement empfangen wird oder bis die maximale Anzahl von Neighbor Solicitations (MAX_MULTICAST_SOLICIT) gesendet wurde. Wenn nach MAX_MULTICAST_SOLICIT Solicitations kein Neighbor Advertisement empfangen wird, ist die Adressauflösung fehlgeschlagen. Der Sender MUSS (MUST) jede zwischengespeicherte Kopie des Pakets freigeben und SOLLTE (SHOULD) ICMP Destination Unreachable-Anzeigen mit Code 3 (Address Unreachable) für jedes Paket zurückgeben, das auf die Adressauflösung wartet.

7.2. Neighbor Unreachability Detection

7.2.1. Erreichbarkeitsbestätigung (Reachability Confirmation)

Ein Nachbar wird als erreichbar betrachtet, wenn der Knoten kürzlich eine Bestätigung erhalten hat, dass kürzlich an den Nachbarn gesendete Pakete von dessen IP-Schicht empfangen wurden. Eine positive Bestätigung kann auf zwei Arten gesammelt werden: Hinweise von Protokollen der oberen Schicht, die anzeigen, dass eine Verbindung "vorwärts fortschreitet", oder Empfang einer Neighbor Advertisement-Nachricht, die eine Antwort auf eine Neighbor Solicitation-Nachricht ist.

Eine Verbindung macht "vorwärts Fortschritte", wenn die von einem entfernten Peer empfangenen Pakete nur ankommen können, wenn kürzlich an diesen Peer gesendete Pakete ihn tatsächlich erreichen. In TCP zeigt beispielsweise der Empfang einer (neuen) Bestätigung an, dass zuvor gesendete Daten den Peer erreicht haben. Ebenso zeigt die Ankunft neuer (nicht duplizierter) Daten an, dass frühere Bestätigungen den entfernten Peer erreichen. Wenn Pakete den Peer erreichen, müssen sie auch die IP-Schicht des Peers erreichen, was die Anforderung für Neighbor Unreachability Detection ist.

Für Off-Link-Ziele implizieren Forward-Fortschritte, dass der First-Hop-Router erreichbar ist. Wenn eine solche Bestätigung existiert, KANN (MAY) eine Implementierung den Neighbor Cache-Eintrag für den First-Hop-Router aktualisieren und seinen Erreichbarkeitszustand auf REACHABLE setzen. Wenn eine Implementierung Forward-Fortschritte nicht verfolgt, SOLLTE (SHOULD) sie annehmen, dass Forward-Fortschritte gemacht werden, wenn weiterhin Pakete von einem entfernten Peer empfangen werden.

Neighbor Unreachability Detection arbeitet parallel zu Anwendungen, die Pakete senden. Das Senden eines Pakets an einen Nachbarn bestätigt nicht dessen Erreichbarkeit; der Empfang der entsprechenden Bestätigung tut dies. Eine Implementierung DARF NICHT (MUST NOT) schließen, dass ein Nachbar erreichbar ist, nur weil er aktiv verwendet wird.

Wenn ein Knoten eine Adressauflösung für eine Nachbaradresse durchführen muss, aber bereits einen Neighbor Cache-Eintrag für die Adresse im STALE-Zustand hat, aktualisiert der Knoten den Zustand auf DELAY statt INCOMPLETE und sendet eine Neighbor Solicitation zur Bestätigung der Erreichbarkeit. Der Knoten wartet dann DELAY_FIRST_PROBE_TIME Sekunden. Wenn innerhalb dieser Zeit keine Erreichbarkeitsbestätigung empfangen wird, wird der Zustand des Eintrags auf PROBE geändert und Neighbor Unreachability Detection beginnt.

7.2.2. Neighbor Cache-Eintragszustände (Neighbor Cache Entry States)

Ein Neighbor Cache-Eintrag für einen Nachbarn, an den Verkehr gesendet wird, kann sich in einem von fünf möglichen Zuständen befinden:

INCOMPLETE (unvollständig) - Adressauflösung wird derzeit für den Eintrag durchgeführt. Insbesondere wurde eine Neighbor Solicitation an die Solicited-Node-Multicast-Adresse des Ziels gesendet, aber das entsprechende Neighbor Advertisement wurde noch nicht empfangen.

REACHABLE (erreichbar) - Innerhalb der letzten ReachableTime Millisekunden wurde eine positive Bestätigung empfangen, dass der Vorwärtspfad zum Nachbarn ordnungsgemäß funktioniert. Während REACHABLE wird keine besondere Aktion durchgeführt, wenn Pakete gesendet werden.

STALE (veraltet) - Mehr als ReachableTime Millisekunden sind seit der letzten positiven Bestätigung vergangen, dass der Vorwärtspfad ordnungsgemäß funktioniert. Während stale wird keine Aktion durchgeführt, bis ein Paket gesendet wird.

Der STALE-Zustand wird beim Empfang einer unaufgeforderten Neighbor Discovery-Nachricht betreten, die die zwischengespeicherte Link-Layer-Adresse aktualisiert. Der Empfang einer solchen Nachricht bestätigt nicht die Erreichbarkeit, und das Betreten des STALE-Zustands stellt sicher, dass Pfadfehler schnell erkannt werden. Die Erreichbarkeit wird jedoch erst tatsächlich überprüft, wenn der Eintrag verwendet wird.

DELAY (verzögert) - Mehr als ReachableTime Millisekunden sind seit der letzten positiven Bestätigung vergangen, dass der Vorwärtspfad ordnungsgemäß funktioniert, und ein Paket wurde innerhalb der letzten DELAY_FIRST_PROBE_TIME Sekunden gesendet. Wenn innerhalb von DELAY_FIRST_PROBE_TIME Sekunden nach Eintritt in den DELAY-Zustand keine Erreichbarkeitsbestätigung empfangen wird, sende eine Unicast-Neighbor Solicitation und ändere den Zustand zu PROBE.

Der DELAY-Zustand ist eine Optimierung, die Protokollen der oberen Schicht zusätzliche Zeit gibt, um eine Erreichbarkeitsbestätigung in den Fällen bereitzustellen, in denen ReachableTime Millisekunden seit der letzten Bestätigung aufgrund fehlenden aktuellen Verkehrs vergangen sind. Ohne diese Optimierung würde das Öffnen einer TCP-Verbindung nach einer Verkehrspause Probes initiieren, obwohl der nachfolgende Three-Way-Handshake fast sofort eine Erreichbarkeitsbestätigung liefern würde.

PROBE (Probe) - Eine Erreichbarkeitsbestätigung wird aktiv gesucht, indem Unicast-Neighbor Solicitations alle RetransTimer Millisekunden erneut übertragen werden, bis eine Erreichbarkeitsbestätigung empfangen wird oder bis die maximale Anzahl von Probes (MAX_UNICAST_SOLICIT) gesendet wurde. Wenn nach dem Senden von MAX_UNICAST_SOLICIT Solicitations keine Antwort empfangen wird, werden die Neuübertragungen eingestellt und der Eintrag SOLLTE (SHOULD) gelöscht werden. Nachfolgender Verkehr zu diesem Nachbarn wird den Eintrag neu erstellen und die Adressauflösung erneut durchführen.

Beachten Sie, dass alle Neighbor Solicitations auf Nachbar-Basis ratenbegrenzt sind. Ein Knoten DARF (MUST NOT) Neighbor Solicitations an dasselbe Ziel häufiger als einmal alle RetransTimer Millisekunden senden.

7.2.3. Knotenverhalten (Node Behavior)

Der Neighbor Unreachability Detection-Algorithmus arbeitet unterschiedlich, abhängig davon, ob der Eintrag zum Weiterleiten von Paketen verwendet wird.

Wenn eine Erreichbarkeitsbestätigung empfangen wird (entweder durch Ratschlag der oberen Schicht oder ein angefordertes Neighbor Advertisement), ändert sich der Zustand eines Eintrags zu REACHABLE. Die eine Ausnahme ist, dass Ratschläge der oberen Schicht keine Auswirkung auf Einträge im INCOMPLETE-Zustand haben (z. B. für die keine Link-Layer-Adresse zwischengespeichert ist).

Wenn ein Knoten ein Paket an einen Nachbarn sendet, dessen Eintrag STALE ist, aktualisiert der Knoten den Zustand des Eintrags auf DELAY und setzt einen Timer, der in DELAY_FIRST_PROBE_TIME Sekunden abläuft. Wenn der Eintrag noch im DELAY-Zustand ist, wenn der Timer abläuft, ändert sich der Zustand des Eintrags zu PROBE und eine Unicast-Neighbor Solicitation wird gesendet. Die Neighbor Solicitation wird unter Verwendung der zwischengespeicherten Link-Layer-Adresse gesendet. Nachfolgende Solicitations (falls vorhanden) werden unter Verwendung derselben zwischengespeicherten Link-Layer-Adresse gesendet. Neighbor Solicitations werden alle RetransTimer Millisekunden erneut übertragen, bis eine Erreichbarkeitsbestätigung empfangen wird oder bis MAX_UNICAST_SOLICIT Solicitations gesendet wurden.

Wenn ein Neighbor Advertisement als Antwort auf eine Unicast-Neighbor Solicitation empfangen wird und das Solicited-Flag des Neighbor Advertisements gesetzt ist, ändert sich der Zustand des Eintrags zu REACHABLE. Wenn das Solicited-Flag nicht gesetzt ist, bleibt der Eintrag im PROBE-Zustand.

Wenn eine Erreichbarkeitsbestätigung im PROBE-Zustand empfangen wird, ändert sich der Zustand des Eintrags zu REACHABLE. Wenn die maximale Anzahl von Probes gesendet wurde, ohne eine Erreichbarkeitsbestätigung zu erhalten, SOLLTE (SHOULD) der Eintrag gelöscht werden, und zukünftiger Verkehr zu diesem Nachbarn wird die erneute Durchführung der Adressauflösung erfordern. Eine Implementierung KANN (MAY) veraltete Einträge jederzeit durch Garbage Collection entfernen. Einträge im INCOMPLETE-Zustand SOLLTEN (SHOULD) jedoch NICHT gelöscht werden, bis die Adressauflösung fehlgeschlagen ist (d. h. MAX_MULTICAST_SOLICIT Neighbor Solicitations wurden gesendet und keine Antwort wurde empfangen).

7.3. Neighbor Unreachability Detection-Protokoll (Neighbor Unreachability Detection Protocol)

Dieser Abschnitt bietet einen Überblick darüber, wie der Neighbor Unreachability Detection-Algorithmus funktioniert.

7.3.1. Erreichbarkeitsbestätigungsereignisse (Reachability Confirmation Events)

Die folgenden Ereignisse führen dazu, dass eine zwischengespeicherte Link-Layer-Adresse als REACHABLE bestätigt wird:

  1. Empfang eines angeforderten Neighbor Advertisements für einen Eintrag in jedem Zustand außer INCOMPLETE.

  2. Empfang einer Erreichbarkeitsbestätigung der oberen Schicht (z. B. positive TCP-Bestätigung) für einen Eintrag in jedem Zustand außer INCOMPLETE.

  3. Für einen Eintrag im STALE-, DELAY- oder PROBE-Zustand, Senden einer Neighbor Solicitation und Empfangen eines angeforderten Neighbor Advertisements.

7.3.2. Zustandsübergänge (State Transitions)

Zustandsübergänge erfolgen wie folgt:

INCOMPLETE -> REACHABLE: Wenn ein gültiges Neighbor Advertisement empfangen wird, das die Target Link-Layer Address-Option enthält.

INCOMPLETE -> (gelöscht): Wenn die Adressauflösung fehlschlägt (d. h. MAX_MULTICAST_SOLICIT Neighbor Solicitations ohne Antwort gesendet).

REACHABLE -> STALE: Wenn ReachableTime Millisekunden vergehen, ohne eine Erreichbarkeitsbestätigung zu erhalten.

STALE -> DELAY: Wenn ein Paket an einen Nachbarn im STALE-Zustand gesendet wird.

STALE -> REACHABLE: Wenn eine Erreichbarkeitsbestätigung empfangen wird.

DELAY -> PROBE: Wenn DELAY_FIRST_PROBE_TIME Sekunden vergehen, ohne eine Erreichbarkeitsbestätigung zu erhalten.

DELAY -> REACHABLE: Wenn eine Erreichbarkeitsbestätigung empfangen wird.

PROBE -> REACHABLE: Wenn eine Erreichbarkeitsbestätigung empfangen wird.

PROBE -> (gelöscht): Wenn MAX_UNICAST_SOLICIT Probes gesendet werden, ohne eine Erreichbarkeitsbestätigung zu erhalten.

7.3.3. Senden von Neighbor Solicitations (Sending Neighbor Solicitations)

Beim Senden einer Neighbor Solicitation-Nachricht zum Zweck der Neighbor Unreachability Detection gelten die folgenden Regeln:

  • Die Target Address der Neighbor Solicitation MUSS (MUST) auf die IP-Adresse des Nachbarn gesetzt werden, dessen Erreichbarkeit bestätigt wird.

  • Die Neighbor Solicitation MUSS (MUST) als Unicast-Paket unter Verwendung der zwischengespeicherten Link-Layer-Adresse gesendet werden.

  • Die Source Address der Neighbor Solicitation MUSS (MUST) eine Adresse sein, die der Schnittstelle zugewiesen ist, von der die Neighbor Solicitation gesendet wird.

  • Die Neighbor Solicitation SOLLTE (SHOULD) die Source Link-Layer Address-Option enthalten.

7.3.4. Empfangen von Neighbor Solicitations (Receiving Neighbor Solicitations)

Wenn eine Neighbor Solicitation empfangen wird, prüft der Empfänger, ob er das Ziel der Solicitation ist. Wenn ja, SOLLTE (SHOULD) der Empfänger den Neighbor Cache-Eintrag für den Sender erstellen oder aktualisieren. Wenn bereits ein Neighbor Cache-Eintrag für den Sender existiert, aktualisiert der Empfänger die Link-Layer-Adresse des Eintrags (falls unterschiedlich) und setzt den Zustand des Eintrags wie folgt:

  • Wenn der Eintrag in einem beliebigen Zustand ist und das Override-Flag in einem empfangenen Neighbor Advertisement gesetzt ist, wird die Link-Layer-Adresse des Eintrags aktualisiert.

  • Wenn der Eintrag im INCOMPLETE-Zustand ist, wird die Link-Layer-Adresse des Eintrags auf den Wert in der Source Link-Layer Address-Option (falls vorhanden) gesetzt und der Zustand wird auf STALE gesetzt.

  • Wenn der Eintrag in einem anderen Zustand als INCOMPLETE ist und die empfangene Source Link-Layer Address von der zwischengespeicherten Link-Layer-Adresse abweicht und das Override-Flag gesetzt ist, wird die zwischengespeicherte Link-Layer-Adresse durch die empfangene Adresse ersetzt und der Zustand des Eintrags bleibt unverändert.

7.4. Senden von Neighbor Advertisements (Sending Neighbor Advertisements)

Ein Knoten sendet Neighbor Advertisements als Antwort auf Neighbor Solicitations und sendet auch unaufgeforderte Neighbor Advertisements, wenn sich seine Link-Layer-Adresse ändert.

7.4.1. Antworten auf Neighbor Solicitations (Responding to Neighbor Solicitations)

Wenn eine Neighbor Solicitation empfangen wird, SOLLTE (SHOULD) der Zielknoten mit einem Neighbor Advertisement antworten. Das Neighbor Advertisement wird an die Quelladresse der Neighbor Solicitation gesendet, wenn diese nicht die unspezifizierte Adresse ist; andernfalls wird das Neighbor Advertisement an die All-Nodes-Multicast-Adresse gesendet.

Die Target Address des Neighbor Advertisements wird von der Target Address der Neighbor Solicitation kopiert. Das Solicited-Flag wird auf eins gesetzt, wenn das Neighbor Advertisement als Antwort auf eine Neighbor Solicitation gesendet wird; andernfalls wird es auf Null gesetzt.

Wenn die Target Link-Layer Address-Option in der Neighbor Solicitation enthalten ist und die Link-Layer-Adresse von der Link-Layer-Adresse des empfangenden Knotens abweicht, wird das Override-Flag auf eins gesetzt; andernfalls wird es je nach Umständen gesetzt.

7.4.2. Unaufgeforderte Neighbor Advertisements (Unsolicited Neighbor Advertisements)

Ein Knoten kann unaufgeforderte Neighbor Advertisements senden, um Änderungen an seiner Link-Layer-Adresse anzukündigen. Wenn ein Knoten erkennt, dass sich seine Link-Layer-Adresse geändert hat (z. B. nach dem Hot-Swap einer Ethernet-Schnittstelle), SOLLTE (SHOULD) er einige Neighbor Advertisements an die All-Nodes-Multicast-Adresse multicasten, um die Neighbor Cache-Einträge der Nachbarn schnell zu aktualisieren.

Für unaufgeforderte Neighbor Advertisements SOLLTE (SHOULD) das Override-Flag auf eins gesetzt werden, um sicherzustellen, dass Nachbarn ihre zwischengespeicherten Link-Layer-Adressen aktualisieren. Das Solicited-Flag MUSS (MUST) in unaufgeforderten Neighbor Advertisements auf Null gesetzt werden.