Ich benutze die .NET Framework
Klassen, um die IP-Adressen für meinen Computer zu erhalten.
Dns.GetHostAddresses(Dns.GetHostName())
Ich habe einen VirtualBox-Adapter, der sowohl eine IPv4- als auch eine IPv6-Adresse hat. Unter Verwendung des .NET-Codes erhalte ich die IPv6-Adresse alsfe80::71a3:2b00:ddd3:753f%16
Beachten Sie die% 16 am Ende?
Wenn ich jedoch dasselbe mit WMI
abfrage, erhalte ich die Adresse 'fe80 :: 71a3: 2b00: ddd3: 753f'.
Hat% 16 eine besondere Bedeutung?
Bearbeiten:
Ich habe nur noch ein paar Bemerkungen dazu gemacht. Und sie stimmen ziemlich gut mit dem überein, was Stephen Jennings in seiner Antwort gesagt hat.
Ich habe VMware installiert, um zu sehen, welche IPv6-Adresse es ausgegeben hat. Die Adressen lauteten: fe80 :: 3dd0: 7f8e: 57b7: 34d5% 19
fe80 :: b059: 65f4: e877: c40% 20
Es ist klar, dass die Zahlen nach% keine hexadezimale Darstellung sind. Ich habe alle für einen Netzwerkadapter verfügbaren Eigenschaften mit Wmi überprüft und festgestellt, dass die Zahlen genau mit der InterfaceIndex-Eigenschaft jedes Netzwerkadapters übereinstimmen. Wie pro MSDN , identifiziert sie eindeutig jeden Netzwerkadapter und diese Eigenschaft wurde in Vista eingeführt.
Was mich immer noch verwirrte, war, warum die IPAddress-Klasse es Ihnen ermöglichte, eine IP-Adresse in diesem Format zu erstellen, es sei denn, sie war gültig. Die Antwort wurde von Stephen geliefert. Die Nummer ist die Scope-ID. IPAddress verfügt über einen Konstruktor, der die Adresse UND eine Bereichs-ID akzeptiert.
Oh, und all diese drei Netzwerkadapter waren Link Local. Bestätigt es über ipconfig
Cool. Das war interessant!!
fe80:10
(das0x0010
Sein 16). Ich verwende das in meinem Browser, wenn ich mit verbindungslokalen IPv6-Adressen arbeite, bin mir jedoch nicht zu 100% sicher, dass dies den Standards entspricht. (Die Verwendung des Prozentsatzes in URLs ist in BrowsernAntworten:
Die Zahl nach dem '%' ist die Bereichs-ID.
IPv6 definiert mindestens drei Erreichbarkeitsbereiche für Adressen:
Global adressierbar. Dies ist eine IPv6-Adresse, die Sie von Ihrem Internetdienstanbieter erhalten haben. Es steht im öffentlichen Internet zur Verfügung.
Link-lokal. Dies ähnelt dem Bereich 169.254.XX. Dies ist eine Adresse, die sich ein Computer selbst zuweist, um die lokale Kommunikation zu erleichtern. Diese Adressen werden im öffentlichen Internet nicht weitergeleitet, da sie nicht global eindeutig sind.
Knotenlokal. Dies ist eine Adresse, die die lokale Schnittstelle identifiziert, ähnlich wie 127.0.0.1. Grundsätzlich ist dies die Adresse :: 1.
Microsoft hat diesen Artikel veröffentlicht, in dem die IPv6-Adressierung beschrieben wird. Dies ist der am wenigsten verwirrende Artikel, den ich gefunden habe. Der Artikel gibt an, dass das Vorhandensein einer Bereichs-ID in Ihrer Adresse bedeutet, dass es sich um eine verbindungslokale Adresse handelt . Sie können auch feststellen, dass es sich um einen Link handelt, der lokal ist, da die Adresse mit beginnt
fe80
.Klare, einfach zu verstehende Informationen zu diesem Thema scheinen selten zu sein, daher fasse ich den Rest zusammen, basierend auf meinem besten Verständnis von RFC 4007 und den anderen Informationen, die es gibt.
Ein Computer kann mehrere verbindungslokale Adressen mit jeweils unterschiedlichem Gültigkeitsbereich haben. Die Bereichs-ID gibt an, für welchen Bereich die Adresse bestimmt ist. Stellen Sie sich zum Beispiel das Szenario eines Computers mit zwei Netzwerkkarten vor, von denen jede eine verbindungslokale Adresse in verschiedenen Netzwerken hat. Wenn Sie versuchen, etwas an eine andere Adresse zu senden, die mit fe80 beginnt, wie kann der Computer dann feststellen, auf welcher Netzwerkkarte gesendet werden soll? Die Scope-ID scheint hierfür die Lösung zu sein.
quelle
fe80::42
. Auch die Router haben die gleiche Adressefe80::1
. Dasfe80::1%X
kann nun zur Unterscheidung der Router verwendet werden, ist aberfe80::42%X
für den Client von geringem Nutzen, oder?fe80::1%1
, um den mit NIC # 1 verbundenen Router zu erreichen, und sendet Nachrichten anfe80::1%2
, um den mit NIC # 2 verbundenen Router zu erreichen. Abgesehen davon werden Link-Local-Adressen automatisch vom Host-Computer konfiguriert und nicht über DHCP. Daher würde er seinen beiden NICs wahrscheinlich nicht dieselbe IP zuweisen. Denken Sie auch daran, dass verbindungslokale Adressen nicht routingfähig sind. Normalerweise senden Sie also keine Nachrichten an einen Router, sondern senden Nachrichten zwischen zwei Hosts.%nn
kann zumindest für einige Befehle weggelassen werden, zum Beispielping
,tracert
.IPv6-Adressen mit dem Präfix fe80 :: / 64 sind verbindungslokale Adressen, die erstellt werden, indem dieses Präfix mit der Hardwareadresse des Netzwerkgeräts (71a3: 2b00: ddd3: 753f in Ihrem Beispiel) kombiniert wird. (Das Analogon in IPv4 lautet 169.254.0.0/16.) Da das Präfix für alle verbindungslokalen Adressen auf einem Computer identisch ist, muss das Routing unter Umständen wissen, auf welche Schnittstelle Sie sich beziehen. Und genau das gibt die Zahl nach dem Prozent an, die als Zonenindex bezeichnet wird. Einzelheiten hängen vom Betriebssystem ab: Unter Windows
%16
ist die Schnittstelle Nummer 16; Unter Linux sehen Sie zum Beispiel möglicherweise etwas wie%eth0
.Einige Tools oder APIs betrachten diesen Zonenindex für ihre Zwecke als unwichtig oder implizit. Unter Linux zeigt das
ifconfig
Tool dies beispielsweise nicht an, da offensichtlich ist, zu welcher Schnittstelle eine Adresse gehört. Im Allgemeinen sollte dies jedoch berücksichtigt werden.quelle
Die Zeichen nach dem% (in Ihrem Beispiel Zahlen) sind die Schnittstellen-ID. Diese Zeichen werden verwendet, um eine "Netzwerkschnittstelle" zu identifizieren, die häufig als "Netzwerkkarte" bezeichnet wird. Beispielsweise kann es hilfreich sein, festzustellen, ob für ein Paket eine kabelgebundene Ethernet-Karte oder ein WLAN-Adapter verwendet wird.
Ich vermute, dass Sie Microsoft Windows verwenden. Es verwendet Zahlen als Schnittstellenkennungen.
Zum Vergleich: Unix-ähnliche Systeme können Buchstaben nach dem% -Zeichen verwenden. z.B:
fe80::71a3:2b00:ddd3:753f%eth0
In diesem Fall
eth0
stimmt die Schnittstellen-ID mit dem Namen der Netzwerkkarte überein.In Microsoft Windows können Sie eine Liste der (numerischen) Schnittstellenkennungen abrufen, indem Sie eine der Befehlszeilen verwenden, die die Routingtabelle überprüfen. Ich bevorzuge "
netstat -nr
", da dies auch auf anderen Betriebssystemen funktioniert, aber Microsoft Windows auch "route print
" unterstützt . Die resultierende Ausgabe, die gemeldet wird, ist wahrscheinlich über einen langen Bildschirm verteilt. Bereiten Sie sich also darauf vor, zurückzuscrollen, es sei denn, Sie leiten eine Pipe an mehr.zB auf meinem System:
In diesem Fall bezieht sich eine Adresse wie fe80 :: 71a3: 2b00: ddd3: 753f% 14 auf meinen Realtek PCIe GBE Family Controller. Die "GBE" bezieht sich auf Gigabit-Ethernet.
Hier ist der knifflige Teil: Wenn Sie eine Remote-Adresse anpingen möchten, müssen Sie möglicherweise die IPv6-Adresse des Remote-Systems, aber die Schnittstellen-ID des lokalen Systems verwenden. Wenn ich zum Beispiel Computer A verwende und eine lokale IPv6-Adresse von fe80 :: 1 an Schnittstelle Nr. 14 anhänge und ich Computer B anpingen möchte und eine lokale IPv6-Adresse von fe80 :: 2 anhänge seine Schnittstelle Nummer 16, dann ist dies, was ich verwenden würde:
ping fe80::2%14
Der
ping
Befehl sendet das ICMPv6-Paket an die ferne IPv6-Adresse (fd80 :: 2), die zum fernen Computer gehört, und verwendet dazu die Schnittstelle mit der Kennung 14. Die Schnittstellenkennung 14 ist eine Nummer des von mir verwendeten Systems, nicht des fernen Systems.Schauen wir uns nun an, warum dies notwendig sein könnte.
Wenn ich die IPv6-Adresse von Google anpingen möchte (2607: f8b0: 400a: 802 :: 200e zu dem Zeitpunkt, als ich diese Antwort schrieb), prüft die Routing-Tabelle, welche Netzwerkkarten Adressen verarbeiten, die mit 2607: f8b0: 400a beginnen: 802. Die Routing-Tabelle zeigt an, dass keine meiner Netzwerkkarten mit Adressen, die mit 2607: f8b0: 400a: 802 beginnen, direkt mit einem Netzwerk verbunden ist, sodass mein Computer am Ende eine "Gateway" -Adresse verwendet. Wenn ich eine Verbindung zu einem anderen Netzwerk hergestellt habe, das Teil der Organisation ist, für die ich arbeite, verfügt ich möglicherweise über eine spezielle "Gateway" -Adresse, die den Datenverkehr an ein privates Netzwerk weiterleitet. In diesem Fall habe ich kein spezifischeres Gateway, daher verwende ich das IPv6-Standardgateway. So funktioniert IPv6 die meiste Zeit, mit Ausnahme von verbindungslokalen Adressen. So funktionierte auch IPv4 die meiste Zeit.
Gemäß RFC 4291 Abschnitt 2.8 sollte jeder Computer, der IPv6 verwendet, jeder Netzwerkschnittstelle eine verbindungslokale Adresse zuweisen. RFC 4291 Abschnitt 2.5.6 zeigt die Bits, mit denen verbindungslokale Adressen beginnen müssen, wodurch die verbindungslokalen Adressen mit "fe80: 0000: 0000: 0000:" beginnen (obwohl viele dieser Nullen zu einem Doppelpunkt zusammengefasst werden) ). Die Tatsache, dass diese Adressen mit "fe80:" beginnen, wird auch in RFC 4291, Abschnitt 2.4 beschrieben .
Wenn Sie versuchen, ein Remote-System zu pingen (z. B. "2607: f8b0: 400a: 802"), müssen Sie in der Regel anhand der Bits herausfinden, zu welchem Netzwerk oder Teilnetz die Adresse gehört am Anfang der Adresse. Diese Bits werden dann verwendet, um zu bestimmen, wie der Verkehr weitergeleitet werden soll.
Dieser Prozess funktioniert jedoch nicht für eine IPv6-Link-Local-Adresse, da jede einzelne (betriebsbereite, aktive) Netzwerkschnittstelle eine Link-Local-Adresse hat, die mit "fe80:" in einem Subnetz mit dem Subnetzpräfix / size of "/ beginnt. 64 ". Wenn Sie sich auf einem Laptop befinden, werden Sie wahrscheinlich feststellen, dass sowohl Ihre Ethernet-Karte als auch Ihr Wi-Fi-Adapter eine solche IPv6-Adresse haben.
Wenn Sie jetzt Ihren Ping an fe80 :: 2 senden, soll Ihr Computer dieses Paket über die richtige Netzwerkkarte senden. Wenn Sie einen Drucker haben, der an ein kabelgebundenes Netzwerk angeschlossen ist, möchten Sie den Datenverkehr nicht über einen Netzwerkpfad / eine Netzwerkroute von Ihrer Wi-Fi-Karte senden, der / die nicht dazu führt, dass der Datenverkehr zum Drucker gelangt. Wenn Sie versuchen, mit Ihrer WLAN-Karte mit einem drahtlosen Gerät zu kommunizieren, soll der Datenverkehr nicht über die Ethernet-Karte übertragen werden.
Als Lösung müssen Sie angeben, welches Netzwerkgerät der Datenverkehr verwenden soll. Das ist also der Zweck der Netzwerkkennung.
quelle