Pourquoi y a-t-il un signe de pourcentage '%' dans l'adresse IPv6?

125

J'utilise les .NET Frameworkclasses pour obtenir les adresses IP de ma machine.

Dns.GetHostAddresses(Dns.GetHostName())

J'ai un adaptateur VirtualBox qui a une adresse IPv4 et une adresse IPv6. En utilisant le code .NET, je reçois l'adresse IPv6 en tant quefe80::71a3:2b00:ddd3:753f%16

Notez le% 16 à la fin?

Cependant, si je demande la même chose en utilisant WMI, je reçois l'adresse comme 'fe80 :: 71a3: 2b00: ddd3: 753f'

Alors, le% 16 a-t-il une signification particulière?

Modifier:

J'ai juste eu quelques autres observations à ce sujet. Et ils correspondent assez bien avec ce que Stephen Jennings a dit dans sa réponse.

J'ai installé VMware pour voir quelle adresse IPv6 il a publié. Les adresses étaient: fe80 :: 3dd0: 7f8e: 57b7: 34d5% 19

fe80 :: b059: 65f4: e877: c40% 20

Clairement, les nombres après% ne sont pas une représentation hexadécimale. J'ai vérifié toutes les propriétés disponibles pour une carte réseau à l'aide de Wmi et j'ai constaté que les numéros étaient exactement identiques à la propriété InterfaceIndex de chaque carte réseau. Selon MSDN , chaque carte réseau est identifiée de manière unique. Cette propriété a été introduite dans Vista.

Ce qui m'a encore troublé, c'est pourquoi la classe IPAddress vous permettrait-elle de créer une adresse IP dans ce format sauf si celle-ci était valide. La réponse a été fournie par Stephen. Le numéro est l'id de la portée. IPAddress a un constructeur qui accepte l'adresse ET un identifiant de portée.

Oh, et ces trois cartes réseau étaient des liaisons locales. Confirmé via ipconfig

Cool. C'était intéressant !!

Amith George
la source
2
Je n'avais aucune idée de ce que c'était avant que tu me demandes. J'ai aussi appris quelque chose d'intéressant à propos d'IPv6 (quels nerds nous sommes).
Stephen Jennings
@Stephen, avez-vous déjà travaillé avec ipv6? J'ai été surpris de constater que vous l'avez bien compris. J'avais cherché quelque temps sur Google avant de poser la question ici. Bon travail!
Amith George
En recherchant "adresse ipv6 pour cent", j'ai trouvé le nom dont j'avais besoin, et à partir de là, il a fallu beaucoup de temps pour chercher et comprendre le sens de la documentation technique déroutante. Je comprends ce que IPv6 essaie d'accomplir, mais il y a beaucoup de nouveaux concepts dont je n'ai pas encore parlé pour rechercher et comprendre. C’était un exemple et rien ne vous permet de mieux comprendre que d’essayer d’expliquer à quelqu'un d’autre.
Stephen Jennings
Une notation alternative pourrait être fe80:10( 0x0010être 16). J'utilise cela dans mon navigateur lorsque je travaille avec des adresses IPv6 avec des liens locaux, mais je ne suis pas sûr à 100% que cela soit conforme aux normes. (L'utilisation du pourcentage dans les URL est compliquée dans les navigateurs; en fait, je ne pouvais pas le faire fonctionner du tout.)
Arjan

Réponses:

134

Le nombre après le '%' est l'ID de la portée.

IPv6 définit au moins trois étendues d'accessibilité pour les adresses:

  1. Adressable globalement. Ceci est une adresse IPv6 qui vous a été fournie par votre fournisseur d'accès. Il est disponible pour être utilisé sur Internet.

  2. Lien local. Ceci est similaire à la gamme 169.254.XX. C'est une adresse qu'un ordinateur s'assigne pour faciliter les communications locales. Ces adresses ne sont pas acheminées sur Internet, car elles ne sont pas uniques au monde.

  3. Node-local. C'est une adresse qui identifie l'interface locale, similaire à 127.0.0.1. Fondamentalement, c'est l'adresse :: 1.

Microsoft a publié cet article décrivant l'adressage IPv6 , qui est l'article le moins déroutant que j'ai trouvé. L'article indique que la présence d'un ID d'étendue dans votre adresse signifie qu'il s'agit d'une adresse de lien local . Vous pouvez également dire qu'il s'agit d'un lien local parce que l'adresse commence par fe80.

Les informations claires et compréhensibles sur ce sujet semblent rares, alors je résume le reste en fonction de ma meilleure compréhension de la RFC 4007 et des autres informations disponibles.

Un ordinateur peut avoir plusieurs adresses de liens locaux, chacune avec une étendue différente. L'ID d'étendue indique à quelle étendue l'adresse est destinée. Par exemple, imaginez le scénario d’un ordinateur avec deux cartes réseau, chacune avec une adresse lien-local sur des réseaux différents. Si vous essayez d'envoyer quelque chose à une autre adresse commençant par fe80, comment l'ordinateur saura-t-il sur quel NIC envoyer? L'ID d'étendue semble être la solution pour cela.

Stephen Jennings
la source
Merci! J'ai modifié ma question pour ajouter les éléments supplémentaires que j'avais à observer en attendant une réponse. Et quand je suis venu les poster, j'ai été surpris de voir votre réponse confirmant les observations :)
Amith George
Bonne réponse. Laissez-moi voir si j'ai bien compris cela. Ainsi, un périphérique avec deux cartes réseau peut se connecter à deux routeurs différents et se voir attribuer la même adresse DHCP fe80::42. De plus, les routeurs ont la même adresse fe80::1. Maintenant, le fe80::1%Xpeut être utilisé pour différencier les routeurs, mais fe80::42%Xest d'une utilité mineure pour le client, non?
user123444555621
2
@ Pumbaa80 Le client enverrait des messages pour fe80::1%1atteindre le routeur connecté au NIC # 1 et des messages fe80::1%2pour atteindre le routeur connecté au NIC # 2. De plus, les adresses locales aux liens sont configurées automatiquement par l'ordinateur hôte, et non par DHCP. Par conséquent, il n'affectera probablement pas la même adresse IP à ses deux cartes réseau. N'oubliez pas non plus que les adresses de liens locaux ne sont pas routables. Par conséquent, vous n'enverrez généralement pas de messages à un routeur, mais entre deux hôtes.
Stephen Jennings
par l' expérimentation, il semble que la fuite %nnpeut être omise pour au moins certaines commandes, par exemple ping, tracert.
matt wilkie
Très bonne réponse. Le simple fait de mentionner que l'ID de portée est égal à zéro est spécial et semble indiquer qu'un algorithme spécifique à l'implémentation permet de choisir un ID de portée dans la liste des interfaces avec cette portée de cette IP.
Arran Cudbard-Bell
21

Les adresses IPv6 avec le préfixe fe80 :: / 64 sont des adresses locales qui sont construites en combinant ce préfixe avec l'adresse matérielle du périphérique réseau, 71a3: 2b00: ddd3: 753f dans votre exemple. (L'analogique dans IPv4 est 169.254.0.0/16.) Le préfixe étant le même pour toutes les adresses lien-locales d'une machine, le routage peut parfois nécessiter de savoir à quelle interface vous vous référez. Et c’est ce que spécifie le nombre après le pourcentage, appelé index de zone. Les spécificités dépendent du système d'exploitation: Sous Windows, le %16numéro d'interface 16; sur Linux par exemple, vous pourriez voir quelque chose comme %eth0.

Certains outils ou API considèrent cet index de zone comme sans importance ou implicite pour leurs besoins. Par exemple, sous Linux, l' ifconfigoutil ne l'affiche pas car il est évident à quelle interface appartient une adresse. Mais en général, il faut en tenir compte.

Peter Eisentraut
la source
18

Les caractères après le% (qui se trouvent être des nombres dans votre exemple) sont l'identifiant d'interface. Ces caractères sont utilisés pour identifier une "interface réseau", que les gens appellent souvent une "carte réseau". Par exemple, il peut être utile de déterminer si un paquet utilisera une carte Ethernet câblée ou un adaptateur Wi-Fi sans fil.

Je suppose que vous utilisez Microsoft Windows. Il utilise des nombres comme identificateurs d'interface.

En comparaison, les systèmes de type Unix peuvent utiliser des lettres après le signe%. par exemple:fe80::71a3:2b00:ddd3:753f%eth0

Dans ce cas, l'identifiant d'interface eth0, correspond au nom de la carte réseau.

Dans Microsoft Windows, vous pouvez obtenir une liste des identificateurs d'interface (numériques) à l'aide de l'une des lignes de commande vérifiant la table de routage. Je préfère " netstat -nr" car cela fonctionne également sur d'autres systèmes d'exploitation, mais Microsoft Windows prend également en charge " route print". La sortie résultante, qui est rapportée, sera probablement sur un écran long, alors soyez prêt à revenir en arrière, sauf si vous passez à plus.

par exemple, sur mon système:

=========================================================================== Interface List 14...5c f9 dd 6d 98 b8 ......Realtek PCIe GBE Family Controller 12...e0 06 e6 7e fc 4e ......Bluetooth Device (Personal Area Network) 1...........................Software Loopback Interface 1 13...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter 15...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #2 ===========================================================================

Dans ce cas, une adresse comme fe80 :: 71a3: 2b00: ddd3: 753f% 14 ferait référence à mon contrôleur de famille Realtek PCIe GBE. Le "GBE" se réfère à Gigabit Ethernet.

Maintenant, voici la partie la plus délicate: Si vous souhaitez envoyer une requête ping à une adresse distante, vous devrez peut-être utiliser l'adresse IPv6 du système distant, mais l'identificateur d'interface du système local. Ainsi, par exemple, si j'utilise l'ordinateur A et que l'adresse IPv6 locale fe80 :: 1 est associée à l'interface numéro 14 et que je souhaite envoyer une requête ping à l'ordinateur B, l'adresse IPv6 locale fe80 :: 2 est associée à l'adresse correspondante. son numéro d’interface 16, c’est ce que j’aimerais utiliser:

ping fe80::2%14

La pingcommande enverra donc le paquet ICMPv6 à l'adresse IPv6 distante (fd80 :: 2), qui appartient à l'ordinateur distant, et utilisera l'interface avec l'identificateur 14 pour le faire. L'identificateur d'interface 14 est un numéro du système que j'utilise, pas du système distant.

Voyons maintenant pourquoi cela pourrait être nécessaire.

Si je souhaite envoyer une requête ping à l'adresse IPv6 de Google (2607: f8b0: 400a: 802 :: 200e au moment où j'ai écrit cette réponse), la table de routage vérifie quelle carte réseau gère les adresses commençant par 2607: f8b0: 400a: 802. La table de routage indiquera qu'aucune de mes cartes réseau n'est connectée directement à un réseau utilisant des adresses commençant par 2607: f8b0: 400a: 802, mon ordinateur finira donc par utiliser une adresse de "passerelle". Si je me connectais à un autre réseau appartenant à l'organisation pour laquelle je travaille, j'aurais peut-être une adresse spéciale de "passerelle" qui achemine le trafic vers un réseau privé. Dans ce cas, je n'ai pas de passerelle plus spécifique, je vais donc utiliser la "passerelle par défaut" IPv6. C'est ainsi que fonctionne IPv6 la plupart du temps, à l'exception des adresses de liens locaux. C'est également comme cela que IPv4 fonctionnait la plupart du temps.

Conformément à la section 2.8 de la norme RFC 4291 , chaque ordinateur utilisant IPv6 doit attribuer une adresse de liaison locale à chaque interface réseau. La section 2.5.6 de la RFC 4291 indique les bits par lesquels les adresses de liens locaux doivent commencer, ce qui entraîne le début des adresses de liens locaux avec "fe80: 0000: 0000: 0000:" (bien que beaucoup de ces zéros soient réduits à un double-point) ). Le fait que ces adresses commencent par "fe80:" est également décrit par la RFC 4291, section 2.4 .

Si vous essayez d'envoyer une commande ping à un système distant (par exemple, "2607: f8b0: 400a: 802"), le processus général consiste généralement à identifier un réseau ou un sous-réseau dont l'adresse est une partie, en examinant les bits. au début de l'adresse. Ensuite, ces bits sont utilisés pour déterminer comment acheminer le trafic.

Cependant, ce processus ne fonctionne pas pour une adresse lien local IPv6 car chaque interface réseau (opérationnelle, active) possède une adresse lien local commençant par "fe80:" sur un sous-réseau utilisant le préfixe de sous-réseau / taille de "/ 64 ". Si vous utilisez un ordinateur portable, vous constaterez probablement que votre carte Ethernet et votre adaptateur Wi-Fi doivent avoir une telle adresse IPv6.

Maintenant, lorsque vous envoyez votre ping à fe80 :: 2, vous voulez que votre ordinateur envoie ce paquet sur la bonne carte réseau. Si vous avez une imprimante connectée à un réseau câblé, vous ne souhaitez pas envoyer le trafic de votre carte Wi-Fi, en utilisant un chemin / itinéraire réseau qui n'entraînera pas le trafic acheminé vers l'imprimante. Et si vous essayez de communiquer avec un périphérique sans fil à l'aide de votre carte Wi-Fi, vous ne voulez pas que votre trafic sorte de la carte Ethernet.

La solution consiste à spécifier le périphérique réseau que le trafic doit utiliser. Donc, c’est l’objet de l’identificateur de réseau.

TOOGAM
la source
2
D'accord, en relisant la réponse de Peter Eisentraut , il semble que sa réponse soit techniquement correcte. Espérons que mes détails apportent plus de clarté. Je ne suis pas d'accord avec la réponse de Stephen Jennings , car cette réponse donne l'impression que "l'ID de la portée" identifie le "lien local" comme étant la portée. Cependant, deux interfaces réseau différentes peuvent être "lien local" mais elles n'utiliseront pas le même "périmètre" (selon les exemples présentés dans sa liste numérotée). Au lieu de cela, je dis que ces chiffres identifient "l'interface" du réseau.
TOOGAM