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


J'utilise le .NET Framework classes pour obtenir les adresses IP de ma machine.

Dns.GetHostAddresses(Dns.GetHostName())

J'ai un adaptateur VirtualBox qui possède à la fois une adresse IPv4 et une adresse IPv6. En utilisant le code .NET, je reçois l'adresse IPv6 comme fe80::71a3:2b00:ddd3:753f%16 

Remarquez le% 16 à la fin? 

Cependant, si j'interroge le même en utilisant WMI, Je reçois l'adresse comme 'fe80 :: 71a3: 2b00: ddd3: 753f'

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

Modifier: 

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

J'ai installé Vmware pour voir quelle adresse IPv6 il a émise. 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 utilisant Wmi et j'ai constaté que les numéros étaient exactement les mêmes que la propriété InterfaceIndex de chaque carte réseau. Selon MSDN, il identifie de manière unique chaque carte réseau et cette propriété a été introduite dans Vista.

Ce qui me rend encore perplexe, c'est pourquoi la classe IPAddress vous permettrait de créer une adresse IP dans ce format à moins qu'elle ne soit valide. La réponse a été fournie par Stephen. Le numéro est l'ID de portée. IPAddress a un constructeur qui accepte l'adresse ET un ID de portée.

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

Cool. C'était intéressant !!


109
2018-01-23 21:42


origine


Je n'avais aucune idée de ce que c'était soit avant de demander. J'ai aussi appris quelque chose de net sur IPv6 aujourd'hui (ce que nous sommes). - Stephen Jennings
@ Stephen, avez-vous déjà travaillé avec ipv6 auparavant? J'ai été rapidement surpris que vous ayez réussi. J'avais googlé pendant un certain temps avant de poster la question ici. Bon travail! - Amith George
La recherche de «pourcentage d'adresse IPv6» m'a donné le nom dont j'avais besoin, et de là, chercher le plus de choses et essayer de comprendre la documentation technique confuse a pris le plus de temps. J'obtiens ce que IPv6 essaie d'accomplir, mais il y a beaucoup de nouveaux concepts que je n'ai pas réussi à explorer et à comprendre. C'était un, et rien ne vous permet de mieux comprendre qu'essayer d'expliquer à quelqu'un d'autre. - Stephen Jennings
Une autre notation pourrait être fe80:10 (la 0x0010 être 16). Je l'utilise dans mon navigateur lorsque vous travaillez avec des adresses IPv6 de liaison locale, 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:


Le numéro après le '%' est l'ID de portée.

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

  1. Globalement adressable. Ceci est une adresse IPv6 qui vous a été donnée par votre FAI. Il est disponible sur Internet.

  2. Link-local. Ceci est similaire à la gamme 169.254.X.X. C'est une adresse qu'un ordinateur assigne lui-même afin de 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'un Adresse locale du lien. Vous pouvez également dire qu'il s'agit d'un lien local car l'adresse commence par fe80.

Les informations claires et simples à comprendre sur ce sujet semblent être rares. Je rassemble le reste en me basant sur ma meilleure compréhension de RFC 4007 et les autres informations disponibles.

Un ordinateur peut avoir plusieurs adresses link-local, chacune ayant une portée différente. L'ID de portée indique la portée de l'adresse. Par exemple, imaginez le scénario d'un ordinateur avec deux cartes réseau, chacune avec une adresse de liaison locale sur différents réseaux. Si vous essayez d'envoyer quelque chose à une autre adresse commençant par fe80, comment l'ordinateur va-t-il savoir sur quelle carte réseau envoyer? L'ID de portée semble être la solution pour cela.


117
2018-01-23 22:26



Merci! Edité ma question pour ajouter les choses supplémentaires que j'ai pu 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 appareil doté de deux cartes réseau peut se connecter à deux routeurs différents et se voir attribuer la même adresse DHCP. fe80::42. En outre, les routeurs ont la même adresse fe80::1. Maintenant le fe80::1%X peut être utilisé pour différencier les routeurs, mais fe80::42%X est d'une utilité mineure pour le client, non? - user123444555621
@ Pumbaa80 Le client enverrait des messages à fe80::1%1 pour atteindre le routeur connecté à la carte réseau n ° 1, et il enverrait des messages à fe80::1%2 pour atteindre le routeur connecté à la carte réseau n ° 2. En passant, les adresses Link-Local sont configurées automatiquement par l'ordinateur hôte, pas via DHCP, de sorte qu'il ne sera probablement pas assigné la même IP à ses deux cartes réseau. Gardez également à l'esprit que les adresses link-local ne sont pas routables, de sorte que vous n'envoyez généralement pas de messages à un routeur, vous enverrez des messages entre deux hôtes. - Stephen Jennings
par expérimentation, il semble que le trailing %nn peut être omis pour au moins certaines commandes, par ex. ping, tracert. - matt wilkie
Très bonne réponse. Le simple fait de mentionner que l'ID de la portée est 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 ayant cette portée. - Arran Cudbard-Bell


Les adresses IPv6 avec le préfixe fe80 :: / 64 sont des adresses link-local 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.) Comme le préfixe est le même pour toutes les adresses link-local sur une machine, le routage peut parfois nécessiter de savoir à quelle interface vous faites référence. Et c'est ce que le nombre après le pourcentage, appelé l'index de zone, spécifie. Les spécificités dépendent du système d'exploitation: Sous Windows, %16 est le numéro d'interface 16; sous Linux par exemple, vous pourriez voir quelque chose comme %eth0.

Certains outils ou API considèrent cet index de zone sans importance ou implicite pour leurs objectifs. Par exemple, sur Linux le ifconfig L'outil ne le montre pas car il est évident quelle interface appartient à une adresse. Mais en général, il faut en tenir compte.


17
2018-01-23 23:30





Les caractères après le% (qui sont des nombres dans votre exemple) sont l'identificateur 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 une carte 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érique) en utilisant l'une des lignes de commande qui vérifient 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 préparez-vous à faire défiler l'écran, à moins que vous n'optiez pour plus de détails.

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 telle que fe80 :: 71a3: 2b00: ddd3: 753f% 14 ferait référence à mon contrôleur de famille Realtek PCIe GBE. Le "GBE" fait référence à Ethernet Gigabit.

Maintenant, voici la partie délicate: Si vous voulez 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. Donc, par exemple, si j'utilise l'ordinateur A et que j'ai une adresse IPv6 locale de fe80 :: 1 attachée à l'interface numéro 14 et que je veux envoyer une requête ping à l'ordinateur B avec une adresse IPv6 locale de fe80 :: 2 attachée à son interface numéro 16, alors c'est ce que j'utiliserais:

ping fe80::2%14

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

Maintenant, regardons pourquoi cela pourrait être nécessaire.

Si je veux cingler l'adresse IPv6 de Google (qui est 2607: f8b0: 400a: 802 :: 200e au moment où j'ai écrit cette réponse), la table de routage vérifiera 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 en utilisant des adresses commençant par 2607: f8b0: 400a: 802, mon ordinateur utilisera donc une adresse "passerelle". Si je me connectais à un autre réseau faisant partie de l'organisation pour laquelle je travaille, je pourrais avoir une adresse spéciale «passerelle» qui achemine le trafic vers un réseau privé. Dans ce cas, je n'ai pas de passerelle plus spécifique, alors je vais utiliser la "passerelle par défaut" IPv6. C'est ainsi que IPv6 fonctionne la plupart du temps, à l'exception des adresses de lien local. C'est aussi comme ça que IPv4 a fonctionné la plupart du temps. (J'ai simplifié cet exemple en supposant une taille de sous-réseau IPv6 de / 64, car décrire l'ensemble du processus aurait rendu cette description encore plus longue.)

Selon RFC 4291 section 2.8, chaque ordinateur utilisant IPv6 doit attribuer une adresse link-local à chaque interface réseau. RFC 4291 section 2.5.6 montre les bits avec lesquels les adresses link-local doivent commencer, ce qui fait que les adresses link-local commencent par "fe80: 0000: 0000: 0000:" (bien que beaucoup de ces zéros soient réduits à un double deux-points). Le fait que ces adresses commencent par "fe80:" est également décrit par RFC 4291 section 2.4.

Si vous essayez de faire un ping sur un système distant (par exemple, "2607: f8b0: 400a: 802"), le processus général consiste généralement à trouver un réseau ou un sous-réseau dont l'adresse fait 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 de lien IPv6 car chaque interface réseau (opérationnelle, active) a une adresse de liaison locale commençant par "fe80:" sur un sous-réseau utilisant le préfixe / taille de sous-réseau "/ 64 ". Si vous êtes sur 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 voulez pas envoyer le trafic de votre carte Wi-Fi, en utilisant un chemin / itinéraire réseau qui ne provoquera pas le trafic 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 souhaitez pas que votre trafic quitte la carte Ethernet.

La solution consiste à vous demander de spécifier quel périphérique réseau vous souhaitez que le trafic utilise. Donc, c'est l'objet de l'identifiant de réseau.


12
2018-04-24 04:22



Ok, lors de la relecture La réponse de Peter Eisentraut, il semble que le sien est techniquement correct. J'espère que mes détails apporteront plus de clarté. je suis en désaccord avec La réponse de Stephen Jennings, parce que cette réponse donne l'impression que "l'ID de portée" identifie le "lien local" comme portée. Cependant, deux interfaces réseau différentes peuvent toutes deux être "locales" mais elles n'utiliseront pas la même "portée" (selon les exemples présentés dans sa liste numérotée). Au lieu de cela, je dis que ces numéros identifient le réseau "interface". - TOOGAM