Aller au contenu principal

4.4 En-tête de routage (Routing Header)

Le Routing header est utilisé par une source IPv6 pour lister un ou plusieurs nœuds intermédiaires à « visiter (visited) » sur le chemin vers la destination du paquet. Cette fonction est très similaire à l'option Loose Source and Record Route (source libre et enregistrement de route) d'IPv4. Le Routing header est identifié par la valeur Next Header 43 dans l'en-tête précédent, et a le format suivant :

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | Routing Type | Segments Left |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. type-specific data .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Next Header (en-tête suivant) — Sélecteur sur 8 bits. Identifie le type de l'en-tête qui suit immédiatement le Routing header. Utilise les mêmes valeurs que le champ Protocol d'IPv4 [RFC-1700 et seq.].

Hdr Ext Len (longueur d'extension d'en-tête) — Entier non signé sur 8 bits. Longueur du Routing header en unités de 8 octets, sans compter les 8 premiers octets.

Routing Type (type de routage) — Identifiant sur 8 bits d'une variante particulière du Routing header.

Segments Left (segments restants) — Entier non signé sur 8 bits. Nombre de segments de route restants, c'est-à-dire le nombre de nœuds intermédiaires explicitement listés qui restent à visiter avant d'atteindre la destination finale.

type-specific data (données spécifiques au type) — Champ de longueur variable, dont le format est déterminé par le Routing Type, et de longueur telle que la longueur totale du Routing header soit un multiple entier de 8 octets.

Si, lors du traitement d'un paquet reçu, un nœud rencontre un Routing header avec un Routing Type non reconnu, le comportement requis du nœud dépend de la valeur du champ Segments Left, comme suit :

Si Segments Left vaut zéro, le nœud DOIT ignorer le Routing header et continuer le traitement de l'en-tête suivant dans le paquet, dont le type est identifié par le champ Next Header du Routing header.

Si Segments Left est non nul, le nœud DOIT rejeter le paquet et envoyer un message ICMP Parameter Problem, Code 0, à l'adresse Source Address du paquet, pointant vers le Routing Type non reconnu.

Si, après avoir traité le Routing header d'un paquet reçu, un nœud intermédiaire détermine que le paquet doit être transféré sur un lien dont le MTU est inférieur à la taille du paquet, ce nœud DOIT rejeter le paquet et envoyer un message ICMP Packet Too Big à l'adresse Source Address du paquet.

En-tête de routage de type 0 (Type 0 Routing Header)

Le Type 0 Routing header a le format suivant :

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | Routing Type=0| Segments Left |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Address[1] +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Address[2] +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. . .
. . .
. . .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Address[n] +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Next Header (en-tête suivant) — Sélecteur sur 8 bits. Identifie le type de l'en-tête qui suit immédiatement le Routing header. Utilise les mêmes valeurs que le champ Protocol d'IPv4 [RFC-1700 et seq.].

Hdr Ext Len (longueur d'extension d'en-tête) — Entier non signé sur 8 bits. Longueur du Routing header en unités de 8 octets, sans compter les 8 premiers octets. Pour le Type 0 Routing header, Hdr Ext Len est égal au double du nombre d'adresses dans l'en-tête.

Routing Type (type de routage) — 0.

Segments Left (segments restants) — Entier non signé sur 8 bits. Nombre de segments de route restants, c'est-à-dire le nombre de nœuds intermédiaires explicitement listés qui restent à visiter avant d'atteindre la destination finale.

Reserved (réservé) — Champ réservé sur 32 bits. Initialisé à zéro à l'émission ; ignoré à la réception.

Address[1..n] (adresse[1..n]) — Vecteur d'adresses sur 128 bits, numérotées de 1 à n.

Les adresses multicast NE DOIVENT PAS apparaître dans un Type 0 Routing header, ni dans le champ Destination Address de l'en-tête IPv6 d'un paquet portant un Type 0 Routing header.

Le Routing header n'est pas examiné ni traité avant que le paquet n'atteigne le nœud identifié dans le champ Destination Address de l'en-tête IPv6. Dans ce nœud, le dispatch du champ Next Header de l'en-tête précédent invoque le module Routing header, qui, dans le cas du Routing Type 0, exécute l'algorithme suivant :

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
}
}
}
}

Exemple de routage

À titre d'illustration de l'effet de l'algorithme ci-dessus, considérons le cas d'un nœud source S envoyant un paquet à un nœud destination D, en utilisant un Routing header pour acheminer le paquet via les nœuds intermédiaires I1, I2 et I3. Les valeurs des champs pertinents de l'en-tête IPv6 et du Routing header à chaque segment du chemin de livraison seront les suivantes :

Lors de la transmission du paquet de S à I1 :

Source Address = S                  Hdr Ext Len = 6
Destination Address = I1 Segments Left = 3
Address[1] = I2
Address[2] = I3
Address[3] = D

Lors de la transmission du paquet de I1 à I2 :

Source Address = S                  Hdr Ext Len = 6
Destination Address = I2 Segments Left = 2
Address[1] = I1
Address[2] = I3
Address[3] = D

Lors de la transmission du paquet de I2 à I3 :

Source Address = S                  Hdr Ext Len = 6
Destination Address = I3 Segments Left = 1
Address[1] = I1
Address[2] = I2
Address[3] = D

Lors de la transmission du paquet de I3 à D :

Source Address = S                  Hdr Ext Len = 6
Destination Address = D Segments Left = 0
Address[1] = I1
Address[2] = I2
Address[3] = I3