Qu’est-ce que le Neighbor Discovery Protocol (NDP) ?

Pour Internet et les réseaux locaux, le protocole Internet est un composant indispensable. En effet, pour garantir le transport des informations numériques et l’envoi des paquets de données appropriés à l’hôte cible conforme, un certain nombre de protocoles d’aide et de routage supplémentaires sont nécessaires. C’est pourquoi on parle de famille de protocoles Internet ou encore de pile de protocoles Internet. Tandis que le Dynamic Host Configuration Protocol (DHCP) par exemple, garantit que les clients reçoivent l’adresse réseau appropriée lors de la configuration de la connexion IP. Le protocole Neighbor Discovery Protocol (NDP) est utilisé, entre autres, pour faciliter la communication avec les hôtes voisins dans les réseaux locaux et pour déterminer le routeur de la passerelle.

Définition du Neighbor Discovery Protocol

Le Neighbor Discovery Protocol (en français : protocole de découverte des voisins) est utilisé conjointement avec la nouvelle version du protocole Internet IPv6. Sa fonction principale est la résolution des adresses IPv6 dans les adresses MAC valides : l’adresse physique sous-jacente des périphériques respectifs. Dans l’IPv4, c’est l’Address Resolution Protocol (ARP) qui exécute cette fonction. Toutes les adresses déterminées sont stockées en tant qu’informations dans le Neighbor cache (nommé aussi cache de Voisinage). Cette mémoire cache permet non seulement d’informer les participants du réseau sur les adresses locales des clients voisins, mais aussi de leur fournir des informations supplémentaires nécessaires à la vérification de l’accessibilité (disponibilité), par exemple.

De plus, comme nous l’avons déjà mentionné, le NPD est également très impliqué dans l’attribution de la passerelle standard (Standard Gateway). Avec l’ajout du Router Advertisement Protocol (RA), il est possible de déterminer à la fois le routeur par défaut et les préfixes réseau valides, qui sont deux paramètres de configuration de base du réseau. Enfin, le protocole réseau, qui échange des données uniquement au sein d’un réseau, fonctionne aussi comme protocole de support pour la configuration d’adresses dynamiques. Ce processus est également connu sous le nom de Stateless Automatic Address Configuration (SLAAC) ou configuration automatique des adresses sans état.

Comment fonctionne le NDP ?

Chaque périphérique, qui utilise le Neighbor Discovery Protocol pour les communications réseau réseau, gère son propre Neighbor Cache. Dans ce cas de figure, tous les périphériques du réseau connu sont répertoriés et peuvent être vérifiés à l’aide de leurs adresses uniques (MAC). Vous pouvez ainsi y voir si l’adresse mise en cache appartient à un simple client ou bien à un routeur, par exemple. Toutefois le Neighbor Cache n’est pas le seul, mais seulement l’un des quatre caches qui remplissent les fonctions du protocole NPD. Les trois autres composants, qui sont également traités séparément par chaque appareil ou périphérique, sont lui suivants :

  • Destination cache : le cache de « destination» contient les entrées pour tous les hôtes du réseau qui ont déjà reçu des paquets de données. Chacune de ces entrées, à son tour, renvoie un lien d’adresse dans le cache voisin qui devrait être utilisé comme « next hop » ou prochain saut (station intermédiaire) lors de l’envoi de paquets de données à l’hôte de destination désiré.

  • Prefix cache : le Prefix cache ou liste de préfixes est utilisé pour gérer tous les préfixes qui s’appliquent au réseau dans lequel le client se trouve. Ce référencement est nécessaire, d’une part car IPv6 prend en charge le multi-hébergement, c’est à dire l‘accessibilité du réseau via deux fournisseurs différents. D’autre part, il permet de diviser l’espace d’adressage en différents préfixes. En utilisant les entrées du cache préfixe, NDP s’assure que l’hôte cible se trouve bien sur le même sous-réseau. Chaque préfixe, à l’exception de l’adresse MAC (ainsi que l’adresse Link Layer), a une période de validité définie de sorte que le cache reste toujours à jour.

  • Default Router List : la liste des routeurs par défaut contient tous les routeurs connus qui entrent en contact régulièrement avec le périphérique. Chaque entrée de cette liste est liée à une entrée dans le Neighbor cache. Seuls les routeurs actifs sont répertoriés parce-que la date d’expiration est automatiquement définie pour tous les représentants. Le renouvellement ou le rafraichissement n’est possible que si le routeur est renvoyé.

Afin de créer les différents caches pour le NDP, un autre protocole Internet est utilisé, connu sous le nom de ICMPv6 (« Internet Control Message Protocol for the Internet Protocol Version 6 »).

Le NPD est basé sur ces cinq types d’ICMPv6

Dans la version actuelle de la famille de protocoles Internet, ICMPv6 est généralement utilisé comme transmetteur pour les messages d’erreur et d’information, mais il est aussi utilisé par le Neighbor Discovery Protocol sous la forme de cinq différents types ICMPv6. Selon le type, certaines notifications sont utilisées pour constituer des listes ou un enregistrement temporaire (mise en cache).

Type 134 : Router Advertisement (RA)

Les routeurs envoient régulièrement des « Router Advertisement », ou messages ICMPv6 de type 134, pour informer les participants au réseau de leur présence. Ils distribuent notamment leurs informations de routage et les paramètres nécessaires à la configuration automatique des IP. La cible du message est généralement la plage d’adresse multicast par défaut « ff02::01 », qui est utilisée pour adresser tous les hôtes jugés valides. De cette manière, ils reçoivent aussi l’adresse du routeur (default gateway) et le préfixe sous-réseau à utiliser. Le schéma du Router Advertisement est le suivant :

Ce type de message a une longueur standard de 128 bits, ce qui permet d’ajouter des bits supplémentaires pour les options. Les options valides comprennent l’adresse MAC du routeur, la spécification de la taille maximale du paquet : MUT (Maximum Transmission Unit) et toutes les informations de préfixe pertinentes.

Le champ « Type » est défini sur la valeur 134 selon le message, le champ « code » est toujours défini sur 0. Il est suivit d’une somme de contrôle ICMP 16 bits et d’une spécification de longueur 8 bits Hop limit, qui peut contenir les stations recommandées par le routeur.

Après cela, les bits individuels fournissent des informations sur les points suivants :

  • Si les adresses IP peuvent être obtenues via DHCPv6 dynamique (M)
  • Et si des informations complémentaires d’adresse peuvent être obtenues via le DHCPv6 dynamique (O).

Le champ « Reservé » reste inutilisé et est ignoré par le destinataire. En outre, le Router Advertisement contient des données sur :

  • Le temps en secondes pendant lequel le routeur doit rester dans la liste des routeurs par défaut (durée de vie du routeur, 16 bits entiers, maximum 655353);
  • Le temps en millisecondes qu’une adresse dans le Neighbors cache doit encore être disponible après avoir atteint la disponibilité (Accessibility time out, 32 bits entiers, maximum environ 50 jours)
  • Ainsi que le temps en millisecondes après lequel un message Neighbor Solicitation (voir ci-dessous) doit à nouveau être envoyé (Resolution time out, 32 bits entiers).

Type 133 : Router Solicitation (RS)

Routeur Solicitation (RS) sont des messages qu’un hôte peut envoyer pour demander à tous les routeurs du réseau d’envoyer des Router Advertisement. Ceux-ci répondent alors avec un message de type 134, soit exclusivement à l’hôte demandeur (unicast), soit à tous les abonnés du réseau (multicast). Avec ce type de message, comme une connexion réseau, un hôte n’a pas besoin d’attendre que le routeur réseau se notifie automatiquement. Ce type de message ICMPv6 est structuré comme suit :

La structure standard d’un message NDP-ICMPv6 de type 133 nécessite donc une longueur minimale de 64 bits. Le champ « Type » reçoit la valeur 133 de Router Solicitation, tandis que « Code » est mis sur 0. Les deux autres champs obligatoires sont la somme de contrôle ICMP (16 bits) et un champ « Réservé » de 32 bits, ce dernier reste inutilisé.

La seule option possible qui peut être éventuellement attachée au message est l’adresse MAC de l’expéditeur.

Type 135 : Neighbor Solicitation (NS)

Les clients du réseau envoient des Neighbord Solicitation (NS) afin de connaitre l’adresse MAC de l’hôte cible, en envoyant éventuellement leur propre adresse en retour. Les messages ICMPv6 de ce type peuvent soit transmettre des dispositifs via multicast s’ils veulent déterminer une adresse, soit via unicast s’ils ne font que vérifier la disponibilité d’un voisin.

Comme avec tous les types de requêtes ICMPv6, les Neighbor Solicitation commencent avec une identification de type 8 bits. Dans ce cas, le champ « Type » obtient la valeur 135. Ceci est suivi par le « Code » long de 8 bit, qui est mis sur 0, et la somme de contrôle de 16 bits. Le champ « réservé » reste inutilisé, comme pour les messages présentés précédemment.  

Avec 128 bits, l’adresse IP ciblée, qui ne peut pas être une adresse multicast, constitue la majeure partie du message, avec une longueur totale d’au moins 192 bits. Ce type de message, qui est décisif pour le Neighbor Discovery Protocol, permet aussi de spécifier l’adresse MAC de l’expéditeur comme spécification supplémentaire optionnelle.

Type 136 : Neighbor Advertisement (NA)

Les périphériques réseau envoient des Neighbor Advertisement à la fois en réponse à des Neighbord Solicitation, mais aussi de manière non sollicité pour informer d’autres participants sur les changements dans la configuration de l’adresse. La structure de ces messages est la suivante :

Les 32 premiers bits du standard 192 Neighbord Advertisement sont basés sur le schéma de message classique ICMPv6 : 8 bits sont réservés pour « Type » (136) et « Code » (0), suivis par la somme de contrôle de 16 bits. Trois bits individuels complètent  alors le code de message pour lequel les conditions suivantes s’appliquent :

  • R : le bit R est défini lorsque le message est envoyé par un routeur. 
  • S : si le message contient le bit « S », c’est une réponse à un Unicast Neighbor Solicitation, qui confirme l‘accessibilité du participant au réseau demandeur. Ce bit ne doit pas être défini dans les réponses aux demandes multicast ou dans les Neighbhor Advertisement initiés.
  • O : le flag « O » indique au destinataire du message d’écraser l’entrée de cache existante.

Les 29 bits suivants sont réservés selon le modèle connu, ils restent donc inutilisés et sont initialisés sur 0 et ignorés par le récepteur. L’adresse de destination 128 bits est maintenant suivie de la partie principale du message : il s’agit soit de l’adresse IP à partir de laquelle le Neighbor Advertisement a été demandée, soit de l’adresse pour laquelle une nouvelle adresse MAC doit être divulguée. En option, le routeur peut spécifier sa propre adresse, ce qui est obligatoire pour répondre à une requête multicast.

Type 137 : Redirect

Les routeurs ont la capacité d’informer les hôtes du réseau sur un meilleur « hop » (saut) vers des adresses de destination spécifiques. A cette fin, Ils envoient des NDP ICMPv6 Redirect, qui se distinguent par le schéma suivant :

Avec une longueur minimale de 320 bits, les « Redirect » sont les plus grands messages ICMPv6 pertinents pour le fonctionnement du Neighbor Discovery Protocol. La structure typique avec des séquences de bits pour l’identification de type (127), le code (0), la somme de contrôle et un champ « réservé » non utilisé (32 bits) est suivie de l’adresse de saut (hop) recommandé puis de l’adresse pour laquelle ces deux redirections sont recommandées (128 bits pour les deux). En option, le paquet de message peut contenir l’adresse MAC de la destination et l’en-tête du paquet redirigé.

Aperçu des tâches et des possibilités du NDP

Il y a beaucoup à dire sur les mécanismes de mise en cache et les communications du Neighbor Discovery Protocol en combinaison avec l’Internet Control Message Protocol. Les scénarios NDP suivants illustrent l’interaction et la fonctionnalité des deux protocoles :

  • Détecter le routeur et le préfixe réseau : tous les routeurs d’un réseau diffusent régulièrement des Router Advertisement via multicast à tous les participants du réseau. Il s’agit notamment des informations comme l’adresse, le préfixe réseau et le routage, qui sont utilisés pour créer la liste de routeurs par défaut et la liste de préfixes. Les clients utilisent ensuite ces entrées pour déterminer la passerelle et le masque de sous réseau par défaut. Comme toutes les entrées n’ont qu’une période de validité limitée, il ne reste plus que les routeurs actifs. Les messages Router Advertisement peuvent aussi être appliqués à l’aide des Router Solicitation.
  • Déterminer les paramètres importants pour la transmission des paquets : les messages Router Advertisement peuvent aussi inclure en option des informations sur les paramètres que les clients participants doivent utiliser lors de l’envoi de paquets. Il peut s’agir d’informations très spécifiques comme la taille maximale des paquets, mais aussi des paramètres Internet importants comme la limite fixe de stations intermédiaires pour les paquets sortants.
  • Déterminer le prochain saut (hop) : si un paquet doit être envoyé, le protocole NDP s’assure que le cache de destination (Destination cache) contient déjà une entrée correspondante pour l’hôte cible. Si ce n’est pas le cas, le protocole détermine la station intermédiaire suivante à l’aide des informations de la liste des préfixes et de la liste des routeurs pas défaut. Les nouvelles connaissances sont alors stockées dans le cache de destination, ce qui signifie qu’elles sont immédiatement disponibles lorsqu’une nouvelle requête est réalisée. Si il n y a pas d’équivalent dans le cache de Voisinage (Neighbor cache) pour l’entrée nouvellement créée, elle est générée automatiquement et la résolution de l’adresse est lancée.  
  • Résolution de l’adresse IP dans l’adresse MAC : pour déterminer l’adresse MAC d’un hôte spécifique sur le réseau, il reçoit un Neighbor Solicitation par multicast IPv6 à sa propre adresse multicast spécifique. Seul l’hôte peut répondre à cette combinaison unique d’adresses. En réponse, Il envoie un message Neighbor Advertisement avec l’adresse MAC qui est stocké dans le cache de Voisinage (Neighbor cache) par le client de sortie. Le Neighbor Discovery Protocol est utilisé de cette façon à la fois pour identifier les voisins et les routeurs.
  • Détecter l’inaccessibilité d’un voisin : toutes les adresses MAC stockées dans le Neighbor cache doivent être vérifiées régulièrement pour s’assurer qu’elles sont bien à jour. Tant que les données TCP/IP ou les accusés de réception sont envoyés à partir d’une adresse enregistrée, on considère logiquement cela comme actif, ainsi l’hôte qui se cache derrière est joignable, accessible. S’il n y a pas eu d’échange de données avec l’appareil concerné depuis longtemps et que la période de validité de l’entrée a expiré, il est alors marqué comme étant obsolète. Afin de vérifier si l’hôte respectif n’est plus accessible, un paquet de données ordinaire est d’abord envoyé à l’adresse enregistrée. S’il n’y a pas de réponse, un dernier test est lancé via un Neighbor Solicitation unicast. Si cela confirme l’inaccessibilité, l’entrée disparait alors du cache de Voisinage (Neighbor cache).
  • Détecter les adresses dupliquées : si un périphérique obtient une adresse via l’auto-configuration, le NDP la classe comme « tentative » (provisoire). Pour que l’adresse devienne définitivement active, elle doit d’abord être marquée comme unique. Pour ce faire, le client réseau nouvellement connecté envoie un Neighbor Solicitation à l’adresse temporaire qu’il souhaite utiliser lui-même, avec une adresse d’expéditeur temporaire non spécifique. Si un autre hôte utilise déjà l’adresse, il répond avec un message Neihbhord Advertisement à l’adresse générale multicast. De cette manière, le client vérificateur reçoit aussi ce message qui suggère alors une nouvelle adresse.
  • Informer sur les options Redirect : le Neighbor Discovery Protocol avec le message Redirect fournit aux routeurs la possibilité d’optimiser le chemin entre les paquets de données vers les hôtes cibles. Comme nous l’avons mentionné plus haut, ils peuvent utiliser un ICMPv6 type 137 pour recommander des stations intermédiaires plus appropriées à inclure dans le cache de destination.

Comment inspecter le Neighbor cache de votre système

Que ce soit Windows, MacOs, Linux, iOS ou Android, les systèmes d’exploitation modernes prennent en charge IPv6 et sont donc aussi en mesure d’accéder aux possibilités du NDP dans les réseaux Ethernet. En utilisant l’instruction appropriée, vous pouvez accéder à tout moment au Neighbor cache qui a été créé pour votre appareil via la ligne de commande.

Par exemple, sous Windows, vous pouvez lister vos voisins du réseau à l’aide du programme netsh (network shell) et de la commande suivante :

netsh interface ipv6 show neighbors

Avec la plupart des distributions Linux, il est possible d’accéder au cache de Voisinage (Neighbor cache) en utilisant iproute2 et la commande suivante :

ip -6 neigh

Sous MacOS et autres distributions basées sur BSD, vous pouvez appeler les entrées avec la commande suivante :

ndp -a