web-dev-qa-db-fra.com

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

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

Dns.GetHostAddresses(Dns.GetHostName())

J'ai un adaptateur VirtualBox qui a une adresse IPv4 et IPv6. En utilisant le code .NET, l'adresse IPv6 sous la forme fe80::71a3:2b00:ddd3:753f%16

Notez le% 16 à la fin?

Cependant, si j'interroge la même chose avec WMI, l'adresse devient '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 sont exactement identiques à 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 m'a encore troublé, c'est pourquoi la classe IPAddress vous permettrait-elle de créer une adresse IP dans ce format, à moins que ce ne soit valide. La réponse a été fournie par Stephen. Le nombre est l'identifiant 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 !!

119
Amith George

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 sur Internet.

  2. Lien local. Ceci est similaire à la gamme 169.254.X.X. 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 identifiant d'étendue dans votre adresse signifie qu'il s'agit d'une adresse link-local address . Vous pouvez également savoir qu'il s'agit d'un lien local, car 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 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.

128
Stephen Jennings

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.) Comme le préfixe est 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, %16 correspond au numé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'outil ifconfig ne l'affiche pas car il est évident à quelle interface appartient une adresse. Mais en général, il faut en tenir compte.

20
Peter Eisentraut

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 préparez-vous à 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 14, je souhaite envoyer une requête ping à l'ordinateur B et qu'il possède une adresse IPv6 locale fe80 :: 2 attachée à son numéro d’interface 16, c’est ce que j’aimerais utiliser:

ping fe80::2%14

Donc, la commande ping enverra 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'identifiant 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 aussi la façon dont IPv4 a fonctionné la plupart du temps. (J'ai simplifié cet exemple en supposant une taille de sous-réseau IPv6 de/64, car la description de l'ensemble du processus aurait rallongé cette description.)

Conformément à RFC 4291 section 2.8 , tout ordinateur utilisant IPv6 doit attribuer une adresse de liaison locale à chaque interface réseau. La section 2.5.6 de la RFC 4291 -/montre les bits avec lesquels doivent commencer les adresses de lien local, ce qui entraîne le début de l'adresse de lien local avec "fe80: 0000: 0000: 0000:" (bien que beaucoup de ces zéros soient réduits deux points). Le fait que ces adresses commencent par "fe80:" est également décrit par 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.

Toutefois, 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 le but de l’identificateur de réseau.

15
TOOGAM