2012-07-18 20 views
5

tôi đang làm việc với ipv4 và ipv6 để lưu trữ trong db postgres.Vì IPV6 cần 128 bit (16 byte) thì tại sao dữ liệu CIDR postgres có dung lượng lưu trữ là 24 byte (8.1) và 19byte (9.1)?

như ipv4 cần 32 bit (4byte) và ipv6 cần 128 bit (16byte). Tại sao dữ liệu CIDR và ​​INET postgres có lưu trữ là 12 byte và 24 byte tương ứng cho IPV4 và IPV6 (8.1).

với 9.1, nó có 7 byte và 19 byte tương ứng cho IPV4 và IPV6.

tôi không hiểu tại sao cần thêm byte hơn 16 byte để lưu trữ IPV6 và 4 byte cho 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

Cần ít nhất +1 byte cho các bit mặt nạ mạng ví dụ: "10.1.0.0/8" hợp lệ cho mặt nạ 10.1.0.0 255.0.0.0 –

Trả lời

9

Các sourcecode cho kiểu dữ liệu IP hiển thị này:

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; 

Điều này có nghĩa, mà thêm vào các dữ liệu "thô" trong ipaddr (4 byte cho IP4, 16 byte cho IP6) có một byte cho netmask và và một byte cho gia đình địa chỉ (về cơ bản là một switch cho IP4/IP6).

Bên cạnh đó có các varlena overhead được đề cập trong cùng một tập tin:

/* 
* 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; 

Vì vậy, các phương trình cho IP4 là thế này:

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

Đối với IP6 cùng một công thức cung cấp cho bạn 19 byte.

EDIT Phiên bản cũ hơn của PostgreSQL chỉ có biểu diễn varlena 4 byte. Do đó bạn có thể thêm 3 byte cho mỗi loại (IP4: 10, IP6: 22). Ngày đầu đó có một padding lên đến 4 byte tiếp theo biên giới. Điều này cung cấp cho bạn 2 byte cho mỗi loại thêm tối đa 12 hoặc 24 byte.

This mail làm sáng tỏ sự phát triển của phiên bản ngắn hơn.

+0

cảm ơn ... @ A.H..đó thực sự đã giúp tôi .. –

Các vấn đề liên quan