Question

Suite à ce poste Je suis intéressé par la recherche des plages d'adresses IPv6.

Dans IPv4 je serais en mesure de déterminer le début et les adresses IP de fin fournies par un fournisseur d'accès et l'utilisation de ces valeurs entières comme des limites de plage de recherche rapidement un DataBase pour voir si toutes les entrées dans la base de données est tombé dans cette plage.

Comment cela sera impacté par IPv6? Est-ce que fournisseur d'accès Internet ont encore des adresses IPv6 dans des gammes comme ils le font maintenant? Et comment voulez-vous rechercher efficacement ces gammes si vous stockez les adresses IPv6 comme deux bigint dans un DB de SQL Server?

Était-ce utile?

La solution

Il est incorrect d'utiliser des adresses IP (IPv4 ni, ni IPv6) dans les rangs. La bonne façon de groupe une « gamme » particulier d'adresses IP utilise préfixes (notation CIDR) ou des masques (obsolète, valable uniquement pour IPv4, et la folie s'ensuit si vous essayez d'utiliser un masque non contigu).

Parfois, vous voyez quelqu'un (parfois même des applications, des routeurs à domicile, etc.) en utilisant des plages IPv4, mais qui est juste la mauvaise façon de le faire.

Utilisation vlsm (CIDR) vous aurez un tuple , si l'adresse est un entier non signé de 128 bits et le préfixe est un petit (0..128) entier non signé. Le préfixe indique le nombre de bits les plus significatifs de l'adresse représente l'adresse réseau, laissant l'autre 128 Prefix bits les moins significatifs pour représenter un hôte particulier dans ce réseau.

Ainsi, par exemple, une IPv6 "plage" de 2620: 0: 860: 2 :: / 64 (wikimedia.org) représente tous les hôtes de 2620: 0: 860: 2 :: jusqu'à 2620: 0: 860 : 2: FFFF: FFFF: FFFF:. FFFF

Vous ne devriez pas utiliser deux « bigint » s pour stocker une telle valeur dans une base de données, mais utiliser une représentation native dans une seule colonne, sauf si vous voulez faire de votre vie de développeur un cauchemar. Si votre SGBD ne supporte pas les entiers ce grand, en plus de remplacer votre SGBD, je suggère d'utiliser une colonne de données binaires de taille fixe, 16 octets.

Autres conseils

L'utilisation d'un SGBD avec un soutien approprié pour les adresses IPv6 ne serait pas une mauvaise idée. Voici un exemple avec PostgreSQL, version 8.3:

mydb=> CREATE TABLE Networks (name TEXT, prefix INET);
CREATE TABLE
mydb=> INSERT INTO Networks VALUES ('Documentation', '2001:DB8::/32');
INSERT 0 1
mydb=> INSERT INTO Networks VALUES ('ULA', 'FC00::/7');
INSERT 0 1
mydb=> INSERT INTO Networks VALUES ('Orchid', '2001:10::/28');
INSERT 0 1

mydb=> SELECT * FROM Networks;
 name      |    prefix     
---------------+---------------
 Documentation | 2001:db8::/32
 ULA           | fc00::/7
 Orchid        | 2001:10::/28
(3 rows)

mydb=> SELECT * FROM Networks WHERE '2001:DB8::dcaf:BAD' << prefix;
 name      |    prefix     
---------------+---------------
 Documentation | 2001:db8::/32
(1 row)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top