J'utilise les .NET Framework
classes 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 !!
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.)Réponses:
Le nombre après le '%' est l'ID de la portée.
IPv6 définit au moins trois étendues d'accessibilité pour les adresses:
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.
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.
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.
la source
fe80::42
. De plus, les routeurs ont la même adressefe80::1
. Maintenant, lefe80::1%X
peut être utilisé pour différencier les routeurs, maisfe80::42%X
est d'une utilité mineure pour le client, non?fe80::1%1
atteindre le routeur connecté au NIC # 1 et des messagesfe80::1%2
pour 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.%nn
peut être omise pour au moins certaines commandes, par exempleping
,tracert
.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
%16
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'
ifconfig
outil ne l'affiche pas car il est évident à quelle interface appartient une adresse. Mais en général, il faut en tenir compte.la source
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:
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
ping
commande 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.
la source