Comment déterminez-vous l'égalité entre deux adresses IPv6?
j'ai une application qui permet aux administrateurs de spécifier des adresses IP valides à partir desquelles des demandes de service web peuvent être faites. Je prends simplement les adresses IP configurées et les compare avec la requête entrante. Comparer deux adresses IPv4 est trivial et j'ai pensé que comparer deux adresses IPv6 serait aussi bien.
cependant, mon ignorance de réseau a commencé à montrer quand j'ai remarqué que les adresses IPv6 sont un peu plus complexes. Seul problème que j'ai remarqué, c'est que si je regarde l'adresse IP sur la machine (je regardais ce que la console VMWare a montré que l'adresse IP est) par rapport à l'adresse IP de la requête web ( HttpContext.Current.Request.UserHostAddress
dans .NET) j'ai remarqué que l'un d'eux s'est terminé dans le %10 et un autre dans le %11:
- ipconfig shows:fe80:8179: 5576: c6d0:8b16%11
- Userhostadress montre: fe80:: 8179: 5576: c6d0: 8b16%10
la seule différence est le %10 et le %11-qu'est-ce qui donne?
j'ai aussi vu les adresses IPv6 finir en " / " suivies de 2 chiffres. Devrais-je simplement ignorer ces trois derniers chiffres (s'ils existent) lors d'une comparaison? Si c'est le cas, quelles sont les autres fins valables que je dois chercher?
----------- MODIFIER -------------
Voici ma solution basée sur la réponse fournie...
je stocke simplement une adresse IP" effacée "et je la compare à une adresse IP" effacée". Voici comment je nettoie une adresse IP en utilisant .NET. Pas le meilleur du point de vue de la performance, mais ça marche. Je préférerais simplement faire une comparaison du GetAddressBytes()
mais j'utilise un Dictionary
et j'ai décidé contre l'étape supplémentaire de créer mon propre ByteComparer
.
IPAddress incomingIp = null;
bool ipAddressParsePassed = IPAddress.TryParse(userHostAddress, out incomingIp);
if (ipAddressParsePassed)
{
IPAddress scrubbedIp = new IPAddress(incomingIp.GetAddressBytes());
string scrubbedIpStr = scrubbedIp.ToString()
}
4 réponses
parce que tous les liens-adresses locales dans un l'hôte ont un préfixe commun, normal les procédures d'acheminement ne peuvent être utilisées pour: choisissez l'interface sortante quand envoyer des paquets à un lien-local destination. Un identifiant spécial, connu sous le nom d'indice de zone, est nécessaire pour fournir le routage supplémentaires information; dans le cas de link-local adresses, les indices de zone correspondent à identificateurs d'interface.
Lorsqu'une adresse est écrite textuellement, l'indice de zone est annexé à la adresse, séparés par un signe de pourcentage "% " . La syntaxe actuelle des indices de zone dépend du système d'exploitation [...]
donc, ces suffixes sont des indicateurs de zone, qui associent l'adresse à une interface physique. Cela explique également pourquoi les suffices diffèrent entre les interfaces câblées et sans fil, par exemple.
pour aider à répondre la question, Je ne pense pas que les suffixes devraient être inclus dans une comparaison. Les adresses IPv6 sont 128 bits par définition, et les suffixes sont des informations strictement locales qui n'ont pas de sens en dehors de votre propre machine et de son système d'exploitation actuel.
comparer les 128 bits devrait suffire.
la seule différence est le %10 et le %11 - ce qui donne?
ce sont des IPv6 identificateurs de zone , lien-les adresses locales, c'est-à-dire le préfixe fe80, ne sont garantis uniques sur le lien local. Cela signifie que les adresses fe80: 8179: 5576:c6d0: 8b16%11 et fe80:: 8179:5576:c6d0: 8b16%10 peuvent se référer à différentes machines, l'une doit être accessible par l'interface 10 et l'autre par l'interface 11.
regardez la définition de sockaddr_in6 ,
struct sockaddr_in6 {
short sin6_family;
u_short sin6_port;
u_long sin6_flowinfo;
struct in6_addr sin6_addr;
u_long sin6_scope_id;
};
vous devrez comparer les champs famille, adresse et scope-id pour une correspondance complète.
adresses avec un / et un numéro à l'utilisation finale Classless Inter-Domain Routing (CIDR) notation. Ils peuvent indiquer une adresse ou un réseau. Si il y a un zéro ou :: avant le / alors c'est un réseau.
IPv6 est juste un 128-bit contre 32-bit Dans IPv4; vous devriez juste être en mesure de faire une comparaison byte par byte.