2012-07-18 19 views
5

estoy trabajando con ipv4 e ipv6 para almacenar en postgres db.Como IPV6 necesita 128 bits (16 bytes), ¿por qué en postgres el tipo de datos CIDR tiene un almacenamiento de 24 bytes (8.1) y 19 bytes (9.1)?

ya que ipv4 necesita 32 bits (4 bytes) e ipv6 necesita 128 (16 bytes) bits.entonces en postgres CIDR e INET datatype tiene el almacenamiento como 12 bytes y 24 bytes respectivamente para IPV4 e IPV6 (8.1).

con 9.1, tiene 7 bytes y 19 bytes respectivamente para IPV4 e IPV6.

no entiendo por qué necesita bytes adicionales de más de 16 bytes para almacenar IPV6 y 4 bytes para IPV4 ??

http://www.postgresql.org/docs/8.1/static/datatype-net-types.html

http://www.postgresql.org/docs/9.1/interactive/datatype-net-types.html

+0

Necesita al menos +1 byte para la máscara de red, por ejemplo, "10.1.0.0/8" es válido para 10.1.0.0 máscara 255.0.0.0 –

Respuesta

9

El sourcecode para los tipos de datos IP a mostrar este:

typedef struct 
{ 
    unsigned char family;  /* PGSQL_AF_INET or PGSQL_AF_INET6 */ 
    unsigned char bits;   /* number of bits in netmask */ 
    unsigned char ipaddr[16]; /* up to 128 bits of address */ 
} inet_struct; 

Esto significa, que adicionalmente a los datos "en bruto" en ipaddr (4 bytes para IP4, 16 bytes para IP6) hay un byte para la máscara de red y un byte para la familia de direcciones (básicamente un interruptor para IP4/IP6).

Además existe la varlena gastos generales que se menciona en el mismo archivo:

/* 
* Both INET and CIDR addresses are represented within Postgres as varlena 
* objects, ie, there is a varlena header in front of the struct type 
* depicted above. This struct depicts what we actually have in memory 
* in "uncompressed" cases. Note that since the maximum data size is only 
* 18 bytes, INET/CIDR will invariably be stored into tuples using the 
* 1-byte-header varlena format. However, we have to be prepared to cope 
* with the 4-byte-header format too, because various code may helpfully 
* try to "decompress" 1-byte-header datums. 
*/ 
typedef struct 
{ 
    char  vl_len_[4];  /* Do not touch this field directly! */ 
    inet_struct inet_data; 
} inet; 

Por lo tanto la ecuación para IP4 es la siguiente:

1 byte varlena 
1 byte address family 
1 byte netmask 
4 raw bytes 
=========== 
7 byte total 

Para IP6 la misma fórmula que da 19 bytes.

EDIT Las versiones anteriores de PostgreSQL solo tenían una representación varlena de 4 bytes. Por lo tanto, puede agregar 3 bytes para cada tipo (IP4: 10, IP6: 22). Además de eso, había un relleno hasta el siguiente borde de 4 bytes. Esto le da 2 bytes para cada tipo sumando hasta 12 o 24 bytes.

This mail arroja algo de luz sobre el desarrollo de la versión más corta.

+0

gracias ... @ A.H ... en realidad me ayudó ... –

Cuestiones relacionadas