2009-04-21 29 views
5

Siguiendo de this post Estoy interesado en buscar rangos de direcciones IPv6.Rangos de direcciones IPv6

Bajo IPv4 Podría determinar las direcciones IP de inicio y final proporcionadas por un ISP y usar esos valores enteros como límites de rango buscar rápidamente una Base de datos para ver si alguna entrada en el DB caía dentro de ese rango.

¿Cómo se verá afectado esto por IPv6? ¿Los ISP todavía tienen direcciones IPv6 en rangos como lo hacen ahora? ¿Y cómo buscaría eficientemente estos rangos si estuviera almacenando las direcciones IPv6 como dos bigints en un DB de SQL Server?

+0

El siguiente hilo fue sugerido por [@vinS] (https://stackoverflow.com/users/977855/vins) como solución a su pregunta IPv6: https: //stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses – datv

Respuesta

8

No es correcto usar direcciones IP (ni IPv4, ni IPv6) en rangos. La forma correcta de agrupar un "rango" particular de direcciones IP es usar prefijos (notación CIDR) o máscaras (obsoletos, solo válidos para IPv4, y la locura se produce si intenta utilizar una máscara no contigua).

A veces verá a alguien (a veces incluso aplicaciones, enrutadores hogareños, etc.) utilizando rangos de IPv4, pero esa es la forma incorrecta de hacerlo.

Usando Classless Inter-Domain Routing (CIDR) tendrá una Dirección tupla <, Prefijo >, donde dirección es un entero sin signo de 128 bits y prefijo es una pequeña (0..128) entero sin signo. El prefijo indica cuántos bits más significativos de la dirección representan la dirección de red, dejando los otros bits menos significativos de 128 prefijos para representar un host particular en esa red.

Así, por ejemplo, un "rango" de IPv6 de 2620: 0: 860: 2 ::/64 (wikimedia.org) representa todos los hosts desde 2620: 0: 860: 2 :: hasta 2620: 0: 860: 2: FFFF: FFFF: FFFF: FFFF.

No debe usar dos "letras grandes" para almacenar dicho valor en una base de datos, pero use cualquier representación nativa en una sola columna, a menos que desee convertir su vida de desarrollador en una pesadilla. Si su DBMS no admite números enteros tan grandes, además de reemplazar su DBMS, sugiero usar una columna de datos binarios de tamaño fijo, de 16 bytes de longitud.

4

El uso de un DBMS con soporte adecuado para direcciones IPv6 no sería una mala idea . He aquí un ejemplo con PostgreSQL, versión 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) 
+1

Buena proeza para PostgreSQL. Si solo cambiar DBMS fuera tan fácil como aplaudir :) –

Cuestiones relacionadas