des plages d'adresses IPv6 [fermée]
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?
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
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)