4.4 Routing-Header
Der Routing Header wird von einer IPv6-Quelle verwendet, um einen oder mehrere Zwischenknoten aufzulisten, die auf dem Weg zum Ziel des Pakets „besucht (visited)" werden sollen. Diese Funktion ist der Loose Source and Record Route-Option (Lose-Quell-und-Aufzeichnungs-Route-Option) von IPv4 sehr ähnlich. Der Routing Header wird durch den Next Header-Wert 43 im vorherigen Header identifiziert und hat folgendes Format:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | Routing Type | Segments Left |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. type-specific data .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Next Header (Nächster Header) – 8-Bit-Selektor. Identifiziert den Typ des Headers, der unmittelbar auf den Routing Header folgt. Verwendet dieselben Werte wie das Protocol-Feld in IPv4 [RFC-1700 et seq.].
Hdr Ext Len (Header-Erweiterungslänge) – 8-Bit-Ganzzahl ohne Vorzeichen. Die Länge des Routing Headers in 8-Oktett-Einheiten, ohne die ersten 8 Oktette.
Routing Type (Routing-Typ) – 8-Bit-Bezeichner der jeweiligen Routing-Header-Variante.
Segments Left (Verbleibende Segmente) – 8-Bit-Ganzzahl ohne Vorzeichen. Anzahl der verbleibenden Routing-Segmente, d. h. die Anzahl der explizit aufgeführten Zwischenknoten, die noch besucht werden müssen, bevor das endgültige Ziel erreicht wird.
type-specific data (typspezifische Daten) – Feld variabler Länge, dessen Format durch den Routing Type bestimmt wird und dessen Länge so gewählt ist, dass die Gesamtlänge des Routing Headers ein Vielfaches von 8 Oktetten beträgt.
Wenn ein Knoten bei der Verarbeitung eines empfangenen Pakets auf einen Routing Header mit einem nicht erkannten Routing Type-Wert stößt, hängt das erforderliche Verhalten des Knotens vom Wert des Segments Left-Feldes ab:
Wenn Segments Left null ist, MUSS der Knoten den Routing Header ignorieren und mit der Verarbeitung des nächsten Headers im Paket fortfahren, dessen Typ durch das Next Header-Feld im Routing Header identifiziert wird.
Wenn Segments Left nicht null ist, MUSS der Knoten das Paket verwerfen und eine ICMP-Parameter-Problem-Nachricht (Code 0) an die Source Address des Pakets senden, die auf den nicht erkannten Routing Type zeigt.
Wenn ein Zwischenknoten nach der Verarbeitung des Routing Headers eines empfangenen Pakets feststellt, dass das Paket auf eine Verbindung weitergeleitet werden soll, deren MTU kleiner als die Paketgröße ist, MUSS dieser Knoten das Paket verwerfen und eine ICMP-Packet-Too-Big-Nachricht an die Source Address des Pakets senden.
Type-0-Routing-Header
Der Type-0-Routing-Header hat folgendes Format:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | Routing Type=0| Segments Left |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Address[1] +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Address[2] +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. . .
. . .
. . .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Address[n] +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Next Header (Nächster Header) – 8-Bit-Selektor. Identifiziert den Typ des Headers, der unmittelbar auf den Routing Header folgt. Verwendet dieselben Werte wie das Protocol-Feld in IPv4 [RFC-1700 et seq.].
Hdr Ext Len (Header-Erweiterungslänge) – 8-Bit-Ganzzahl ohne Vorzeichen. Die Länge des Routing Headers in 8-Oktett-Einheiten, ohne die ersten 8 Oktette. Für den Type-0-Routing-Header ist Hdr Ext Len gleich dem Doppelten der Anzahl der Adressen im Header.
Routing Type (Routing-Typ) – 0.
Segments Left (Verbleibende Segmente) – 8-Bit-Ganzzahl ohne Vorzeichen. Anzahl der verbleibenden Routing-Segmente, d. h. die Anzahl der explizit aufgeführten Zwischenknoten, die noch besucht werden müssen, bevor das endgültige Ziel erreicht wird.
Reserved (Reserviert) – 32-Bit-Reservierungsfeld. Beim Senden auf null initialisiert; beim Empfangen ignoriert.
Address[1..n] (Adresse[1..n]) – Vektor von 128-Bit-Adressen, nummeriert von 1 bis n.
Multicast-Adressen DÜRFEN NICHT in einem Type-0-Routing-Header erscheinen und DÜRFEN NICHT im Destination Address-Feld des IPv6-Headers eines Pakets erscheinen, das einen Type-0-Routing-Header trägt.
Der Routing Header wird nicht untersucht oder verarbeitet, bis das Paket den Knoten erreicht, der im Destination Address-Feld des IPv6-Headers identifiziert ist. In diesem Knoten ruft die Weiterleitung des Next Header-Feldes des vorherigen Headers das Routing-Header-Modul auf, das im Fall von Routing Type 0 den folgenden Algorithmus ausführt:
if Segments Left = 0 {
proceed to process the next header in the packet, whose type is
identified by the Next Header field in the Routing header
}
else if Hdr Ext Len is odd {
send an ICMP Parameter Problem, Code 0, message to the Source
Address, pointing to the Hdr Ext Len field, and discard the
packet
}
else {
compute n, the number of addresses in the Routing header, by
dividing Hdr Ext Len by 2
if Segments Left is greater than n {
send an ICMP Parameter Problem, Code 0, message to the Source
Address, pointing to the Segments Left field, and discard the
packet
}
else {
decrement Segments Left by 1;
compute i, the index of the next address to be visited in
the address vector, by subtracting Segments Left from n
if Address [i] or the IPv6 Destination Address is multicast {
discard the packet
}
else {
swap the IPv6 Destination Address and Address[i]
if the IPv6 Hop Limit is less than or equal to 1 {
send an ICMP Time Exceeded -- Hop Limit Exceeded in
Transit message to the Source Address and discard the
packet
}
else {
decrement the Hop Limit by 1
resubmit the packet to the IPv6 module for transmission
to the new destination
}
}
}
}
Routing-Beispiel
Als Beispiel für die Wirkung des obigen Algorithmus betrachten wir den Fall, dass ein Quellknoten S ein Paket an einen Zielknoten D sendet und dabei einen Routing Header verwendet, um das Paket über die Zwischenknoten I1, I2 und I3 zu leiten. Die Werte der relevanten IPv6-Header- und Routing-Header-Felder auf jedem Abschnitt des Übertragungswegs lauten wie folgt:
Wenn das Paket von S nach I1 übertragen wird:
Source Address = S Hdr Ext Len = 6
Destination Address = I1 Segments Left = 3
Address[1] = I2
Address[2] = I3
Address[3] = D
Wenn das Paket von I1 nach I2 übertragen wird:
Source Address = S Hdr Ext Len = 6
Destination Address = I2 Segments Left = 2
Address[1] = I1
Address[2] = I3
Address[3] = D
Wenn das Paket von I2 nach I3 übertragen wird:
Source Address = S Hdr Ext Len = 6
Destination Address = I3 Segments Left = 1
Address[1] = I1
Address[2] = I2
Address[3] = D
Wenn das Paket von I3 nach D übertragen wird:
Source Address = S Hdr Ext Len = 6
Destination Address = D Segments Left = 0
Address[1] = I1
Address[2] = I2
Address[3] = I3