Pergunta

Na sequência este post estou interessado na busca intervalos de endereços IPv6.

Sob IPv4 eu seria capaz de determinar o início e fim endereços IP fornecidos por um ISP e utilizar esses valores inteiros como limites de alcance procurar rapidamente um banco de dados para ver se quaisquer entradas no DB caiu nesse intervalo.

Como isso vai ser afectados pelo IPv6? Will ISP ainda está têm endereços IPv6 em faixas como fazem agora? E como você eficientemente procurar esses intervalos se estivesse armazenando os endereços IPv6 como duas bigint de em um servidor de DB SQL?

Foi útil?

Solução

Não é correto usar endereços IP (nem IPv4, nem IPv6) em intervalos. A maneira correta de grupo um "intervalo" particular de endereços IP está usando prefixos (notação CIDR) ou máscaras (obsoletos, válido apenas para IPv4 e insanidade ensues se você tentar usar uma máscara não contíguas).

Às vezes, você vai ver alguém (às vezes até mesmo aplicativos, roteadores domésticos, etc) usando faixas IPv4, mas isso é apenas a maneira errada de fazê-lo.

Usando Classes Inter-Domain Routing (CIDR) você terá uma tupla

, em que o endereço é um inteiro sem sinal de 128 bits e Prefixo é uma pequena (0..128) inteiro sem sinal. O prefixo diz quantos bits mais significativos do endereço representa o endereço de rede, deixando o outro de 128 Prefixo menos significativos bits para representar um host específico nessa rede.

Assim, por exemplo, um "intervalo" IPv6 de 2620: 0: 860: 2 :: / 64 (wikimedia.org) representa todos os anfitriões de 2620: 0: 860: 2 :: até 2620: 0: 860 : 2: FFFF: FFFF: FFFF:. FFFF

Você não deve usar dois "bigint" é para armazenar esse valor em um banco de dados, mas usar qualquer representação nativa em uma única coluna, a menos que você quiser fazer sua vida desenvolvedor um pesadelo. Se o seu DBMS não suporta inteiros tão grande, além de substituir seu DBMS, eu sugiro usar uma coluna de dados binários de tamanho fixo, 16 bytes.

Outras dicas

Usando um SGBD com o suporte adequado para endereços IPv6 não seria uma má idéia. Aqui está um exemplo com PostgreSQL, versão 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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top