it-swarm.com.de

Warum enthält die IPv6-Adresse ein Prozentzeichen '%'?

Ich verwende die Klassen .NET Framework, um die IP-Adressen für meinen Computer abzurufen.

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 als fe80::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. Gemäß MSDN wird jeder Netzwerkadapter eindeutig identifiziert, 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!!

119
Amith George

Die Zahl nach dem '%' ist die Bereichs-ID.

IPv6 definiert mindestens drei Erreichbarkeitsbereiche für Adressen:

  1. Global adressierbar. Dies ist eine IPv6-Adresse, die Sie von Ihrem Internetdienstanbieter erhalten haben. Es steht im öffentlichen Internet zur Verfügung.

  2. Link-lokal. Dies ähnelt dem 169.254.X.X-Bereich. 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.

  3. 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, der die IPv6-Adressierung beschreibt , den am wenigsten verwirrenden Artikel, den ich gefunden habe. Der Artikel gibt an, dass das Vorhandensein einer Bereichs-ID in Ihrer Adresse bedeutet, dass es sich um eine linklokale Adresse handelt. Sie können auch feststellen, dass es sich um eine linklokale Adresse handelt, da die Adresse mit fe80 beginnt.

Klare, einfach zu verstehende Informationen zu diesem Thema scheinen selten zu sein, daher setze 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, woher weiß der Computer, an welche NIC gesendet werden soll? Die Scope-ID scheint hierfür die Lösung zu sein.

128

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. Besonderheiten hängen vom Betriebssystem ab: Unter Windows ist %16 die Schnittstellennummer 16; Unter Linux sehen Sie beispielsweise möglicherweise so etwas wie %eth0.

Einige Tools oder APIs betrachten diesen Zonenindex für ihre Zwecke als unwichtig oder implizit. Unter Linux zeigt das Tool ifconfig dies beispielsweise nicht an, da offensichtlich ist, zu welcher Schnittstelle eine Adresse gehört. Im Allgemeinen sollte dies jedoch berücksichtigt werden.

20

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 stimmt die Schnittstellen-ID eth0 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 unterstützt auch "route print". 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.

zum Beispiel auf meinem System:

=========================================================================== 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 ===========================================================================

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 Befehl ping 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. Der Interface Identifier 14 ist eine Nummer des von mir verwendeten Systems, nicht des Remote-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 über 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. (Ich habe dieses Beispiel vereinfacht, indem ich von einer IPv6-Subnetzgröße von/64 ausgegangen bin, da die Beschreibung des gesamten Prozesses diese Beschreibung noch länger gemacht hätte.)

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 reduziert werden) zu einem Doppelpunkt). 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 Subnetz 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 mit einem kabelgebundenen Netzwerk verbunden 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 Wi-Fi-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.

15
TOOGAM