Wie bestimmen Sie die Gleichheit zwischen zwei IPv6 Adressen?
Ich habe eine Anwendung, mit der Administratoren geben Sie gültige IP-Adressen aus dem web-service-Anfragen können gestellt werden. Ich nehme einfach die konfigurierte IP-Adressen, und vergleichen Sie Sie gegen die eingehende Anforderung. Vergleich der zwei IPv4-Adressen ist trivial und ich dachte, zwischen zwei IPv6-Adressen, wie gut.
Aber, meine Vernetzung Unwissenheit zu zeigen begann, als ich merkte, dass IPv6-Adressen sind ein wenig komplexer. Eine Frage, die ich bemerkt ist, dass, wenn ich Blick auf die IP-Adresse der Maschine (war das anzeigen, was die VMWare-Konsole zeigte die IP-Adresse) und die IP-Adresse von der web-Anfrage (HttpContext.Current.Request.UserHostAddress
innerhalb .NET), bemerkte ich, dass einer von Ihnen endete in %10 und ein anderes in %11:
- ipconfig zeigt: fe80:8179:5576:c6d0:8b16%11
- UserHostAddress zeigt: fe80::8179:5576:c6d0:8b16%10
Ist der einzige Unterschied %10 und %11 - was bedeutet das?
Habe ich auch gesehen IPv6-Adressen enden in "/" gefolgt von 2 Ziffern. Sollte ich diese einfach ignorieren letzten 3 Ziffern (wenn Sie vorhanden ist), als einen Vergleich zu tun? Wenn ja, was sind die gültige Alternative enden, die ich brauche zu suchen?
----------- BEARBEITEN -------------
Hier ist meine Lösung, basierend auf der Antwort des...
Ich einfach speichern eine "gescheuert" IP-Adresse, und vergleichen Sie, dass mit einem "geschrubbt" IP-Adresse. Mit .NET hier ist, wie ich Peeling eine IP-Adresse. Nicht das beste vom performance-Standpunkt aus, aber es funktioniert. Ich würde eher nur ein Vergleich der GetAddressBytes()
aber ich bin mit einem Dictionary
und ich entschied mich gegen den extra Schritt bei der Erstellung meiner eigenen ByteComparer
.
IPAddress incomingIp = null;
bool ipAddressParsePassed = IPAddress.TryParse(userHostAddress, out incomingIp);
if (ipAddressParsePassed)
{
IPAddress scrubbedIp = new IPAddress(incomingIp.GetAddressBytes());
string scrubbedIpStr = scrubbedIp.ToString()
}
- Hinweis: Mit .NET können Sie die get-oder set - link-local mit der IP-Adresse.ScopeId Eigenschaft.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wikipedia sagt:
Also diejenigen Suffixe zone-Indikatoren, dass die Mitarbeiterin die Adresse mit einer physikalischen Schnittstelle. Dies erklärt auch, warum das genügt unterscheiden zwischen LAN-und WLAN-Schnittstellen, zum Beispiel.
Helfen, die Frage zu beantworten, ich glaube nicht, dass die Suffixe enthalten sein sollten in jedem Vergleich. IPv6-Adressen sind 128 bits per definition, und die Suffixe sind streng lokale Informationen, die nicht Sinn machen, die außerhalb Ihrer eigenen Maschine und das aktuelle Betriebssystem.
Vergleich der 128 bit ausreichen sollte.
Diese sind IPv6 -zone Identifier, link-local-Adressen, also fe80-Präfix sind nur garantiert einzigartig auf dem lokalen link. Dies bedeutet, dass die Adressen fe80:8179:5576:c6d0:8b16%11 und fe80::8179:5576:c6d0:8b16%10 beziehen sich möglicherweise auf verschiedenen Rechnern, hat man Zugriff über die Schnittstelle 10 und die andere durch das interface 11.
Haben Sie einen Blick auf die definition von sockaddr_in6,
Müssen Sie vergleichen die Familie, die Anschrift und die Rahmen-id-Felder für ein komplettes Spiel.
Adressen mit einem /und einer Zahl am Ende Verwendung Classless Inter-Domain Routing (CIDR) - notation. Sie kann bezeichnen eine tatsächliche Adresse oder ein Netzwerk. Wenn es eine null oder :: vor /dann es ist ein Netzwerk.
CIDR-notation
IPv6 ist nur ein 128-bit-oder 32-bit in IPv4; Sie sollte nur in der Lage sein zu tun, ein byte für byte Vergleich.