2012-07-18 4 views
5

मैं पोस्टग्रेस डीबी में स्टोर करने के लिए ipv4 और ipv6 के साथ काम कर रहा हूं।आईपीवी 6 के रूप में 128 बिट्स (16 बाइट्स) की आवश्यकता है तो सीईडीआर डेटाटाइप में 24 बाइट (8.1) और 1 9बीटी (9.1) के रूप में भंडारण क्यों है?

आईपीवी 4 के रूप में 32 बिट्स (4byte) और आईपीवी 6 की आवश्यकता 128 बिट्स (16byte) बिट्स की आवश्यकता है। फिर पोस्टग्रेज़ सीआईडीआर और आईएनईटी डाटाटाइप में आईपीवी 4 और आईपीवी 6 (8.1) के लिए क्रमशः 12 बाइट और 24 बाइट्स के रूप में स्टोरेज है।

9.1 के साथ, इसमें आईपीवी 4 और आईपीवी 6 के लिए क्रमशः 7 बाइट और 1 9 बाइट है।

मुझे समझ में नहीं आ रहा है कि आईपीवी 4 के लिए आईपीवी 6 और 4 बाइट स्टोर करने के लिए इसे 16 बाइट से अधिक अतिरिक्त बाइट क्यों चाहिए ??

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; 

इसका मतलब यह है, कि अतिरिक्त IP4, 16 के लिए ipaddr (4 बाइट्स में "कच्चे" डेटा के लिए:

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

नेटमास्क बिट्स के लिए इसे कम से कम +1 बाइट की आवश्यकता है जैसे "10.1.0.0/8" 10.1.0.0 मास्क 255.0.0.0 –

उत्तर

9

sourcecode आईपी डेटाटाइप्स के लिए यह दिखाने आईपी ​​6 के लिए बाइट्स) नेटमास्क के लिए एक बाइट और पता परिवार के लिए एक बाइट है (मूल रूप से आईपी 4/आईपी 6 के लिए एक स्विच)।

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

तो IP4 के लिए समीकरण यह है::

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

ip6 के लिए एक ही सूत्र आप 19 बाइट्स देता

साथ ही वहाँ varlena भूमि के ऊपर जो एक ही फाइल में बताया गया है है।

EDIT PostgreSQL के पुराने संस्करणों में केवल 4 बाइट varlena प्रतिनिधित्व था। इसलिए आप प्रत्येक प्रकार के लिए 3 बाइट जोड़ सकते हैं (आईपी 4: 10, आईपी 6: 22)। इसके शीर्ष पर अगले 4 बाइट सीमा तक एक पैडिंग थी। यह आपको 12 या 24 बाइट्स जोड़ने वाले प्रत्येक प्रकार के लिए 2 बाइट देता है।

This mail छोटे संस्करण के विकास पर कुछ प्रकाश डालता है।

+0

धन्यवाद के लिए मान्य है ... @ एएच..इस ने वास्तव में मेरी मदद की .. –

संबंधित मुद्दे