8.9. Tipos de dados de endereço de rede #

8.9.1. inet
8.9.2. cidr
8.9.3. inet versus cidr
8.9.4. macaddr
8.9.5. macaddr8

O PostgreSQL oferece tipos de dados para armazenar endereços IPv4, IPv6 e MAC, conforme mostrado na Tabela 8.21. É melhor usar esses tipos de dados em vez de usar tipos de dados de texto simples para armazenar endereços de rede, porque esses tipos de dados oferecem verificação de erros de entrada, além de operadores e funções especializados. (veja Seção 9.12).

Tabela 8.21. Tipos de dados de endereço de rede

NomeTamanho de armazenamentoDescrição
cidr7 ou 19 bytesredes IPv4 e IPv6
inet7 ou 19 bytesredes e hospedeiros IPv4 e IPv6
macaddr6 bytesendereços MAC
macaddr88 bytesendereços MAC (formato EUI-64)

Ao ordenar os tipos de dados inet ou cidr, os endereços IPv4 sempre vêm antes dos endereços IPv6, incluindo os Endereços IPv4 encapsulados ou mapeados para endereços IPv6, como ::10.2.3.4 ou ::ffff:10.4.3.2.

8.9.1. inet #

O tipo de dados inet guarda um endereço de hospedeiro IPv4 ou IPv6 e, opcionalmente, sua sub-rede, tudo em um só campo. A sub-rede é representada pelo número de bits de endereço de rede presentes no endereço do hospedeiro (a máscara de rede). Se a máscara de rede for 32 e o endereço for IPv4, o valor não indicará uma sub-rede, indicará apenas um único hospedeiro. No IPv6, o comprimento do endereço é de 128 bits, portanto 128 bits especificam o endereço de um único hospedeiro. Note que se for desejado aceitar apenas redes, deve ser usado o tipo de dados cidr em vez de inet.

O formato de entrada para o tipo de dados inet é endereço/y, onde endereço é um endereço IPv4 ou IPv6, e y é o número de bits na máscara de rede. Se a porção /y for omitida. a máscara de rede é assumida como sendo 32 para IPv4 ou 128 para IPv6, então o valor representa apenas um único hospedeiro. Na saída, a porção /y é suprimida se a máscara de rede especificar um único hospedeiro.

8.9.2. cidr #

O tipo de dados cidr armazena uma especificação de rede IPv4 ou IPv6. O formato de entrada e de saída segue as convenções Classless Inter-Domain Routing (CIDR). [48] O formato para especificar redes é endereço/y, onde endereço é o endereço mais baixo da rede representado como endereço IPv4 ou IPv6, e y é o número de bits na máscara de rede. Se y for omitido, então é calculado usando suposições do antigo sistema de numeração de rede com classe (classful), exceto por ser pelo menos grande o suficiente para incluir todos os octetos escritos na entrada. É um erro especificar um endereço de rede que tenha bits definidos à direita da máscara de rede especificada.

A Tabela 8.22 mostra alguns exemplos.

Tabela 8.22. Exemplos de entradas cidr

Entrada cidrSaída cidrabbrev(cidr)
192.168.100.128/25192.168.100.128/25192.168.100.128/25
192.168/24192.168.0.0/24192.168.0/24
192.168/25192.168.0.0/25192.168.0.0/25
192.168.1192.168.1.0/24192.168.1/24
192.168192.168.0.0/24192.168.0/24
128.1128.1.0.0/16128.1/16
128128.0.0.0/16128.0/16
128.1.2128.1.2.0/24128.1.2/24
10.1.210.1.2.0/2410.1.2/24
10.110.1.0.0/1610.1/16
1010.0.0.0/810/8
10.1.2.3/3210.1.2.3/3210.1.2.3/32
2001:4f8:3:ba::/642001:4f8:3:ba::/642001:4f8:3:ba/64
2001:4f8:3:ba:​2e0:81ff:fe22:d1f1/1282001:4f8:3:ba:​2e0:81ff:fe22:d1f1/1282001:4f8:3:ba:​2e0:81ff:fe22:d1f1/128
::ffff:1.2.3.0/120::ffff:1.2.3.0/120::ffff:1.2.3/120
::ffff:1.2.3.0/128::ffff:1.2.3.0/128::ffff:1.2.3.0/128

8.9.3. inet versus cidr #

A diferença essencial entre os tipos de dados inet e cidr é que inet aceita valores com bits diferentes de zero à direita da máscara de rede, enquanto cidr não aceita. Por exemplo, 192.168.0.1/24 é um endereço válido para inet, mas não para cidr.

Dica

Se não gostar do formato de saída para os valores de inet ou cidr, experimente as funções host, text e abbrev.

8.9.4. macaddr #

O tipo de dados macaddr armazena endereços MAC, conhecidos, por exemplo, nos endereços de hardware dos adaptadores de rede Ethernet (embora o endereço MAC seja usado para outras finalidades também). A entrada é aceita nos seguintes formatos:

'08:00:2b:01:02:03'
'08-00-2b-01-02-03'
'08002b:010203'
'08002b-010203'
'0800.2b01.0203'
'0800-2b01-0203'
'08002b010203'

Todos esses exemplos especificam o mesmo endereço. São aceitas letras maiúsculas e minúsculas para os dígitos de a a f. A saída é sempre na primeira forma mostrada acima.

O padrão IEEE 802-2001 especifica a segunda forma mostrada acima (com hifens) como forma canônica para o endereço MAC, e especifica a primeira forma (com dois pontos) como usada com bit-reversed, notação MSB-first, tal que 08-00-2b-01-02-03 = 10:00:D4:80:40:C0. Essa convenção é amplamente ignorada hoje em dia, relevante apenas para protocolos de rede obsoletos (como Token Ring). O PostgreSQL não faz provisões para bit-reversed; todos os formatos aceitos usam a ordem LSB canônica.

Os últimos cinco formatos de entrada mostrados acima não fazem parte de nenhum padrão.

8.9.5. macaddr8 #

O tipo de dados macaddr8 armazena endereços MAC no formato EUI-64, conhecidos, por exemplo, nos endereços de hardware dos adaptadores de rede Ethernet (embora o endereço MAC seja usado para outras finalidades também). Esse tipo de dados pode aceitar endereços MAC de comprimento de 6 e 8 bytes, e os armazena no formato de comprimento de 8 bytes. Os endereços MAC fornecidos no formato de 6 bytes são armazenados no formato de comprimento de 8 bytes, com o 4º e o 5º bytes definidos como FF e FE, respectivamente. Note que o IPv6 usa um formato EUI-64 modificado, onde o 7º bit deve ser definido como 1 após a conversão de EUI-48. A função macaddr8_set7bit é fornecida para fazer essa alteração. De modo geral, qualquer entrada composta por pares de dígitos hexadecimais (em fronteiras de byte), opcionalmente separados de forma consistente por ':', '-' ou '.', é aceita. O número de dígitos hexadecimais deve ser 16 (8 bytes) ou 12 (6 bytes). Os espaços em branco à esquerda e à direita são ignorados. A seguir estão mostrados exemplos de formatos de entrada aceitos:

'08:00:2b:01:02:03:04:05'
'08-00-2b-01-02-03-04-05'
'08002b:0102030405'
'08002b-0102030405'
'0800.2b01.0203.0405'
'0800-2b01-0203-0405'
'08002b01:02030405'
'08002b0102030405'

Todos esses exemplos especificam o mesmo endereço. São aceitas maiúsculas e minúsculas para os dígitos de a a f. A saída é sempre na primeira forma mostrada acima.

Os últimos seis formatos de entrada mostrados acima não fazem parte de nenhum padrão.

Para converter um endereço MAC tradicional de 48 bits no formato EUI-48 para o formato EUI-64 modificado, para ser incluído como a porção do hospedeiro de um endereço IPv6, deve ser usada a função macaddr8_set7bit (veja a Seção 9.12), conforme mostrado abaixo:

SELECT macaddr8_set7bit('08:00:2b:01:02:03');

    macaddr8_set7bit
-------------------------
 0a:00:2b:ff:fe:01:02:03
(1 linha)



[48] O Roteamento Interdomínio Sem Classes, CIDR (do inglês Classless Inter-Domain Routing), foi introduzido em 1993 para substituir a arquitetura de endereçamento de rede com classes anterior na Internet.. (Fonte: Wikipédia)