8. Fonction de redirection (Redirect Function)
Le message Redirect est utilisé par les routeurs pour informer les hôtes d'un meilleur premier saut vers une destination. Les routeurs envoient des messages Redirect uniquement pour les paquets transférés par le routeur. Les hôtes DOIVENT (MUST) silencieusement rejeter tous les messages Redirect reçus qui ne satisfont pas toutes les vérifications de validité spécifiées dans la Section 8.1.
8.1. Validation des messages Redirect (Validation of Redirect Messages)
Un hôte DOIT (MUST) silencieusement rejeter tout message Redirect reçu qui ne satisfait pas toutes les vérifications de validité suivantes :
-
L'adresse source IP du Redirect est la même que le routeur de premier saut actuel pour l'adresse de destination ICMP spécifiée.
-
Le champ IP Hop Limit a une valeur de 255, c'est-à-dire que le paquet n'aurait pas pu être transféré par un routeur.
-
Le checksum ICMP est valide.
-
Le code ICMP est 0.
-
La longueur ICMP (dérivée de la longueur IP) est de 40 octets ou plus.
-
L'adresse source IP du Redirect est une adresse link-local. Les routeurs doivent utiliser leur adresse link-local comme source pour les messages Redirect afin que les hôtes puissent identifier de manière unique les routeurs.
-
Le champ ICMP Destination Address dans le message de redirection ne contient pas d'adresse multicast.
-
L'adresse ICMP Target est soit une adresse link-local (lors d'une redirection vers un routeur) soit identique à l'adresse ICMP Destination (lors d'une redirection vers la destination on-link).
-
Toutes les options incluses ont une longueur supérieure à zéro.
Le contenu du champ Reserved et de toutes les options non reconnues DOIT (MUST) être ignoré. Les modifications futures et rétrocompatibles du protocole peuvent spécifier le contenu du champ Reserved ou ajouter de nouvelles options ; les modifications non rétrocompatibles peuvent utiliser des valeurs de code différentes.
Le contenu de toutes les options définies qui ne sont pas spécifiées pour être utilisées avec les messages Redirect DOIT (MUST) être ignoré et le paquet traité normalement. Les seules options définies qui peuvent apparaître sont les options Target Link-Layer Address et Redirected Header.
8.2. Spécification du routeur (Router Specification)
Un routeur DEVRAIT (SHOULD) envoyer un message Redirect, sous réserve de limitation de débit, chaque fois qu'il transfère un paquet qui n'est pas explicitement adressé à lui-même, dans lequel :
-
le champ Source Address du paquet identifie un voisin, et
-
le routeur détermine qu'un meilleur nœud de premier saut réside sur la même liaison que le nœud émetteur pour l'adresse de destination du paquet, et
-
l'adresse de destination du paquet n'est pas une adresse multicast.
Le message Redirect transmis contient :
-
Dans le champ Target Address : l'adresse à laquelle les paquets ultérieurs pour la destination doivent être envoyés. Si la cible est un routeur, l'adresse link-local de ce routeur DOIT (MUST) être utilisée. Si la cible est un hôte, le champ d'adresse cible DOIT (MUST) être défini à la même valeur que l'adresse de destination du paquet IP invoquant.
-
Dans le champ Destination Address : l'adresse de destination du paquet IP invoquant.
-
Dans les options :
-
Option Target Link-Layer Address : l'adresse de couche liaison de la cible. Elle DEVRAIT (SHOULD) être incluse (si connue). Notez que sur les liaisons NBMA, les hôtes peuvent ne pas avoir d'adresses de couche liaison, auquel cas l'option ne peut pas être incluse.
-
Redirected Header : autant du paquet transféré que possible sans que le paquet de redirection dépasse le MTU minimum requis pour prendre en charge IPv6 tel que spécifié dans [IPv6].
-
Un routeur DOIT (MUST) limiter le débit auquel les messages Redirect sont envoyés, afin de limiter la bande passante et les coûts de traitement encourus par les messages Redirect lorsque la source ne répond pas correctement aux Redirects. Plus de détails sur la limitation du débit des messages d'erreur ICMP peuvent être trouvés dans [ICMPv6].
8.3. Spécification de l'hôte (Host Specification)
Un hôte recevant un Redirect examine le paquet et effectue les vérifications de validité suivantes. Si l'une de ces vérifications échoue, l'hôte DOIT (MUST) silencieusement rejeter le message Redirect.
Après que l'hôte a vérifié que le message Redirect est valide, il traite le message comme suit :
-
Si l'adresse cible n'est pas la même que l'adresse de destination, l'hôte remplace l'entrée actuelle pour l'adresse de destination dans son cache de destination par une entrée pointant vers l'adresse cible. L'entrée devrait hériter de l'état de l'ancienne entrée en ce qui concerne les informations de MTU de chemin et l'état de détection d'inaccessibilité des voisins. Lorsque l'hôte crée une nouvelle entrée de cache de destination, l'entrée est initialisée comme décrit dans la Section 5.2.
-
Si l'adresse cible est la même que l'adresse de destination, l'hôte récepteur effectue les opérations suivantes sur son entrée de liste de préfixes pour la destination :
- Si aucune entrée n'existe, l'hôte ajoute la destination à sa liste de préfixes en tant que destination on-link.
- Si une entrée pour la destination existe déjà dans la liste de préfixes, l'hôte met à jour l'entrée pour indiquer que la destination est on-link.
Dans les deux cas, l'hôte met à jour l'entrée du cache de destination pour la destination afin de pointer vers l'adresse cible. Si l'entrée du cache de destination n'existe pas, l'hôte crée une nouvelle entrée. L'entrée DEVRAIT (SHOULD) être mise à jour même si l'hôte a déjà une entrée en cache qui spécifie un voisin de premier saut différent, car les routeurs sont dans une meilleure position pour déterminer le voisin de premier saut approprié.
Si la redirection contient une option Target Link-Layer Address, l'hôte crée ou met à jour l'entrée du cache de voisins pour la cible. Dans les deux cas, l'adresse de couche liaison dans l'option est utilisée. L'entrée du cache de voisins pour la cible est définie à l'état STALE. Si une entrée de cache de voisins est créée pour la cible, son état d'accessibilité DOIT (MUST) être défini à STALE tel que spécifié dans la Section 7.3.3. Si une entrée de cache existait déjà et est mise à jour avec une adresse de couche liaison différente, son état d'accessibilité DOIT (MUST) également être défini à STALE.
L'hôte DOIT (MUST) ajouter l'adresse cible au cache de destination. L'adresse de prochain saut de l'entrée est définie à l'adresse cible du Redirect. Si une entrée de cache de destination pour la destination existait déjà, elle est mise à jour pour utiliser l'adresse cible comme prochain saut. Notez que l'hôte ne vérifie pas que la cible est accessible ; la validité du message Redirect est la responsabilité du routeur.
Un message Redirect DEVRAIT (SHOULD) être envoyé par un routeur en réponse à un paquet transféré par le routeur dans lequel le champ Source Address identifie un voisin et le routeur détermine un meilleur nœud de premier saut pour la destination. Le débit auquel un routeur peut envoyer des Redirects doit être limité pour empêcher les tempêtes de diffusion ou les attaques par déni de service sur les hôtes.
8.4. Exemple (Example)
Considérons le cas où un hôte envoie un paquet à une destination via un routeur par défaut R1, mais un autre routeur R2 sur la même liaison serait un meilleur premier saut vers la destination. Lors du transfert du paquet, R1 envoie un Redirect à l'hôte l'informant que R2 est un meilleur choix. Le Redirect inclut l'adresse link-local de R2.
+------+
| Host |
+------+
|
| (1) Paquet vers Dest
|
v
+----+ +----+
| R1 | ---------> | R2 |
+----+ Redirect +----+
| |
| |
+------------------+
Link
- L'hôte envoie un paquet à la destination via R1 (son routeur par défaut)
- R1 transfère le paquet et envoie un Redirect à l'hôte, indiquant que R2 est meilleur
- L'hôte met à jour son cache de destination pour utiliser R2 pour cette destination
- Les paquets ultérieurs vers la destination sont envoyés directement à R2
8.5. Prévention des boucles de redirection (Redirect Loop Prevention)
Le mécanisme de redirection est susceptible aux boucles de redirection si plusieurs routeurs sur une liaison ne sont pas d'accord sur le meilleur premier saut pour une destination. Cependant, ces boucles sont généralement de courte durée pour les raisons suivantes :
-
Les routeurs envoient uniquement des Redirects pour les paquets qu'ils transfèrent. Si un routeur reçoit un paquet pour lequel il est le meilleur premier saut, il n'enverra pas de Redirect.
-
Les hôtes qui reçoivent plusieurs Redirects pointant vers différents routeurs pour la même destination utiliseront le Redirect le plus récemment reçu. Au fil du temps, le système devrait converger vers un état stable.
-
L'algorithme de détection d'inaccessibilité des voisins finira par détecter si un routeur est inaccessible, entraînant l'hôte à revenir à un autre routeur.
Malgré ces atténuations, les implémentations doivent être conscientes de la possibilité de boucles de redirection et peuvent implémenter des protections supplémentaires, telles que la limitation du débit auquel les entrées du cache de destination sont mises à jour en réponse aux Redirects.