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

125

Ich benutze die .NET FrameworkKlassen, 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 WMIabfrage, 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!!

Amith George
quelle
2
Ich hatte keine Ahnung, was es war, bevor Sie fragten. Ich habe heute auch etwas Nettes über IPv6 gelernt (was für Nerds wir sind).
Stephen Jennings
@Stephen, hast du schon mal mit ipv6 gearbeitet? Ich war überrascht, dass du es schnell geschafft hast. Ich hatte einige Zeit gegoogelt, bevor ich die Frage hier postete. Gute Arbeit!
Amith George 23.01.10
Die Suche nach "ipv6 address percent" brachte mir den Namen, den ich brauchte, und von da an dauerte es am längsten, die verwirrende technische Dokumentation zu durchsuchen und zu verstehen. Ich verstehe, was IPv6 zu erreichen versucht, aber es gibt viele neue Konzepte, die ich nicht erforscht und verstanden habe. Dies war eine, und nichts gibt Ihnen ein besseres Verständnis, als zu versuchen, jemand anderem zu erklären.
Stephen Jennings
Eine alternative Schreibweise könnte sein fe80:10(das 0x0010Sein 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 Browsern
Arjan

Antworten:

134

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

  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, 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.

Stephen Jennings
quelle
Vielen Dank! Bearbeitet meine Frage, um die zusätzlichen Dinge hinzuzufügen, die ich beim Warten auf eine Antwort beobachtet habe. Und als ich kam, um sie zu posten, war ich überrascht, dass Ihre Antwort die Beobachtungen bestätigte :)
Amith George
Gute Antwort. Lassen Sie mich sehen, ob ich das verstanden habe. Daher kann ein Gerät mit zwei Netzwerkkarten eine Verbindung zu zwei verschiedenen Routern herstellen und die gleiche DHCP-Adresse erhalten fe80::42. Auch die Router haben die gleiche Adresse fe80::1. Das fe80::1%Xkann nun zur Unterscheidung der Router verwendet werden, ist aber fe80::42%Xfür den Client von geringem Nutzen, oder?
user123444555621
2
@ Pumbaa80 Der Client sendet Nachrichten an fe80::1%1, um den mit NIC # 1 verbundenen Router zu erreichen, und sendet Nachrichten an fe80::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.
Stephen Jennings
durch Experimente, so scheint es , die Hinter %nnkann zumindest für einige Befehle weggelassen werden, zum Beispiel ping, tracert.
Matt Wilkie
Sehr gute Antwort. Nur zu erwähnen, dass die Bereichs-ID Null ist, ist etwas Besonderes und scheint darauf hinzudeuten, dass ein implementierungsspezifischer Algorithmus eine Bereichs-ID aus der Liste der Schnittstellen mit diesem Bereich dieser IP auswählt.
Arran Cudbard-Bell
21

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 %16ist 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 ifconfigTool dies beispielsweise nicht an, da offensichtlich ist, zu welcher Schnittstelle eine Adresse gehört. Im Allgemeinen sollte dies jedoch berücksichtigt werden.

Peter Eisentraut
quelle
18

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 eth0stimmt 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:

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

TOOGAM
quelle
2
Okay, nach dem erneuten Lesen von Peter Eisentrauts Antwort sieht es so aus, als wäre seine technisch korrekt. Hoffentlich sorgen meine Angaben für mehr Klarheit. Ich stimme der Antwort von Stephen Jennings nicht zu , da diese Antwort den Eindruck erweckt , dass die "Bereichs-ID" "Link lokal" als den Bereich kennzeichnet. Zwei verschiedene Netzwerkschnittstellen können jedoch beide "lokal verbinden" sein, sie verwenden jedoch nicht denselben "Bereich" (gemäß den in seiner nummerierten Liste gezeigten Beispielen). Stattdessen sage ich, dass diese Nummern die "Netzwerkschnittstelle" identifizieren.
TOOGAM