2009-07-02 22 views
204

संभव डुप्लिकेट:
Maximum length of the textual representation of an IPv6 address?अधिकतम लंबाई

क्या आप एक डेटाबेस स्तंभ ग्राहक आईपी पतों के भंडारण के लिए अधिकतम आकार के रूप में की सिफारिश करेंगे? मैंने अभी 16 पर सेट किया है, लेकिन क्या मुझे आईपी पता मिल सकता है जो आईपीवी 6 आदि से अधिक है?

+0

यह पहले से ही यहां कवर किया गया है। Http://stackoverflow.com/questions/1038950/what-is-be-the-most- अनुचित- डेटा- टाइप-for-storing-an-ip-address-in-sql-server – Arnkrishn

+4

वास्तव में, वह पोस्ट है बहुत उपयोगी नहीं है। हम एसक्यूएल सर्वर का उपयोग नहीं कर रहे हैं और इस पोस्ट के जवाब संक्षिप्त और बिंदु पर हैं, ठीक वही जो मैं खोज रहा था। –

+7

@Andriyev वह पोस्ट केवल आईपीवी 4 को संदर्भित करता है। –

उत्तर

194

IPv4 के लिए, आप दूर आईपी पते के 4 कच्चे बाइट्स भंडारण के साथ मिल सकता है (एक आईपी पता में अवधि के बीच संख्या के प्रत्येक 0-255, यानी, एक बाइट कर रहे हैं,)। लेकिन फिर आपको डीबी में और बाहर जाने का अनुवाद करना होगा और यह गन्दा है।

आईपीवी 6 पते 128 बिट्स (आईपीवी 4 पते के 32 बिट्स के विपरीत) हैं। उन्हें आमतौर पर कोलों द्वारा अलग 4 हेक्स अंकों के 8 समूहों के रूप में लिखा जाता है: 2001:0db8:85a3:0000:0000:8a2e:0370:7334। 39 प्रारूप इस प्रारूप में आईपीवी 6 पते को स्टोर करने के लिए उपयुक्त है।

संपादित करें: हालांकि, एक चेतावनी है, @ दीपक के आईपीवी 4 मैप किए गए आईपीवी 6 पते के विवरण के लिए उत्तर देखें। (सही अधिकतम आईपीवी 6 स्ट्रिंग की लंबाई है 45 वर्ण।)

+4

कुछ डेटाबेस (कम से कम पोस्टग्रेज़) में मूल आईपी कॉलम प्रकार होता है, और आपके लिए रूपांतरण करता है। – gnud

+4

मैं "थोड़ी देर के लिए डेटाबेस के उसी दायर में आईपीवी 4 और आईपीवी 6 मिश्रण से बचूंगा।" आईपीवी 4 अभी भी डिफ़ॉल्ट मानक है, और आने वाले वर्षों तक इसका उपयोग जारी रहेगा। विरासत अनुप्रयोगों में मैंने डेटाबेस के साथ आईपीवी 6 पते जोड़ने के लिए आवश्यक होने पर काम किया है, यह एक अलग प्रविष्टि के रूप में किया गया था। इसने मौजूदा कोड को अनुमति दी जो आईपीवी 4 पते को छोड़ने की उम्मीद है, और कोड को केवल आईपीवी 4 पता जारी रखने की अनुमति है। कोड के नए हिस्सों के लिए, उनके पास विशेष रूप से आईपीवी 4, आईपीवी 6, या क्वेरी से मिश्रण प्राप्त करने का विकल्प था। –

+0

यदि आप एक बाइट के रूप में आईपीवी 4 स्टोर करने जा रहे थे, तो क्या यह सवाल नहीं होगा कि क्लाइंट द्वारा कौन सी डेटा संरचनाएं स्वीकार की जाती हैं? यदि आप इसे एक एकल आईएनटी के रूप में स्टोर करना चाहते थे, और ग्राहक ने बाइनरी स्वीकार की, हाँ यह अच्छा नहीं होगा ... मुझे लगता है कि बड़ी संख्या में होने के बारे में बिंदु एक अच्छी चिंता हो सकती है, संख्या के आधार पर और अनुप्रयोगों का परिष्कार। आपके पास ऐसे ऐप्स हो सकते हैं जो केवल एक प्रारूप स्वीकार करते हैं, या दोनों। हो सकता है कि आप एक संबंधित फ़ील्ड रखना चाहें जिसमें एक प्रकार का एड्रेसिंग लेबल हो। – benc

23

आप मानक संकेतन में IPV6 को संभालने के लिए 4 हेक्स अंक के 8 समूहों देखते हैं चाहते हैं:

2001:0dc5:72a3:0000:0000:802e:3370:73E4 

32 हेक्स अंक + 7 = 39 विभाजक वर्ण।

सावधानी: यदि आप IPV6 पते, use 45 characters as @Deepak suggests के रूप में मैप किए गए आईपीवी 4 पते भी रखना चाहते हैं।

5

IPv6 Wikipedia आलेख में वर्णित के रूप में,

IPv6 पतों सामान्य रूप से चार हेक्साडेसिमल अंकों की आठ समूहों, जहां प्रत्येक समूह के रूप में लिखा जाता है एक कॉलन अलग (:)

एक ठेठ IPv6 पता:

2001:0db8:85a3:0000:0000:8a2e:0370:7334 

यह 39 वर्ण लंबा है। आईपीवी 6 पते 128 बिट लंबा हैं, इसलिए आप कल्पना कर सकते हैं कि एक बाइनरी (16) कॉलम का उपयोग करें, लेकिन मुझे लगता है कि मैं अल्फान्यूमेरिक प्रतिनिधित्व के साथ रहूंगा।

1

आईपीवी 4 32 बिट का उपयोग करता है, के रूप में:

255.255.255.255 

मैं इसे अपने डेटा-प्रकार पर निर्भर करता है, चाहे आप सिर्फ एक CHAR प्रकार के साथ एक स्ट्रिंग के रूप में संग्रहीत करने रहे हैं या आप एक संख्यात्मक उपयोग कर रहे हैं लगता है प्रकार।

आईपीवी 6 128 बिट्स का उपयोग करता है। आपके पास तब तक आईपी नहीं होंगे जबतक कि आप उनके साथ अन्य जानकारी शामिल नहीं कर लेते।

आईपीवी 6 (विकिपीडिया से) की तरह, कोलन से अलग 4 हेक्स अंक के सेट में बांटा जाता है:

2001:0db8:85a3:0000:0000:8a2e:0370:7334 

आप एक 39-चरित्र लंबी स्ट्रिंग के रूप में यह भंडारण सुरक्षित हैं, आप ऐसा करना चाहते हैं चाहिए । पते को लिखने के लिए अन्य शॉर्टेंड तरीके भी हैं। शून्यों के समूह को एक 0 पर छोटा कर दिया जा सकता है, या शून्य के सेट को डबल कॉलन द्वारा पूरी तरह छुपाया जा सकता है।

10

कोई है जो यह सब तीन तरीकों की कोशिश की है से ले लो ... बस अब तक सम्मिलित/अपडेट करने पर परिवर्तित और यह फ़ॉर्मेट करने के लिए होने के किसी भी लाभ outweighs एक varchar (39)

थोड़ा कम कुशल मेमोरी का उपयोग इसे कहीं भी दिखाते समय।

2

यदि आप इसे संदर्भ के लिए संग्रहीत कर रहे हैं, तो आप इसे एक स्ट्रिंग के रूप में स्टोर कर सकते हैं, लेकिन यदि आप एक लुकअप करना चाहते हैं, उदाहरण के लिए, यह देखने के लिए कि आईपी पता कुछ तालिका में है, तो आपको "कैनोलिक प्रतिनिधित्व" । " पूरी चीज़ को एक (बड़ी) संख्या में परिवर्तित करना सही काम है। आईपीवी 4 पते को लंबे int (32 बिट्स) के रूप में संग्रहीत किया जा सकता है लेकिन आपको आईपीवी 6 पता स्टोर करने के लिए 128 बिट नंबर की आवश्यकता है। , 127.000.000.001, :: 1, 0 127.0.0.1:

उदाहरण के लिए, इन सभी स्ट्रिंग्स वास्तव में एक ही आईपी पता कर रहे हैं 0: 0: 0: 0: 0: 0: 1

323

नहीं है सामान्य 39 वर्ण आईपीवी 6 संरचना के साथ एक चेतावनी। आईपीवी 4 मैप किए गए आईपीवी 6 पते के लिए, स्ट्रिंग लंबे (39 वर्णों से अधिक) हो सकती है। एक उदाहरण इस दिखाने के लिए:

आईपीवी 6 (39 वर्ण):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD 

आईपीवी 4-मैप किया आईपीवी 6 (45 वर्ण):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:192.168.158.190 

नोट: पिछले 32-बिट (कि के अनुरूप आईपीवी 4 एड्रेस) को 15 वर्णों की आवश्यकता हो सकती है (क्योंकि आईपीवी 4 1 बाइट के 4 समूहों का उपयोग करता है और डॉट्स (. कैरेक्टर) से अलग 0-255 रेंज में 4 दशमलव संख्याओं के रूप में स्वरूपित होता है, इसलिए अधिकतम DDD.DDD.DDD.DDD है)।

सही अधिकतम आईपीवी 6 स्ट्रिंग की लंबाई, इसलिए, 45.

यह वास्तव में एक IPv6 प्रशिक्षण मैं भाग लिया में एक प्रश्नोत्तरी सवाल किया गया है। (हम सभी ने उत्तर दिया 39!)

+2

ऐसा लगता है कि यह सही नहीं है। एक आईपीवी 6 मैप किया गया पता अधिकतम 22 वर्ण लंबा है: https://tools.ietf.org/html/rfc5952#page-10 और https://tools.ietf.org/html/rfc4291#section-2.5.5 के रूप में वे हमेशा प्रारूप :: एफएफएफ: 000.000.000.000 के हैं और उन्हें कम किया जाना चाहिए – tarzan

+0

मुझे आश्चर्य है कि क्या वह वास्तव में "ipv6- संगत ipv4 पता" का अर्थ है https://tools.ietf.org/html/rfc4291#section- 2.5.5.1। मुझे कभी जंगली में देखने को याद नहीं है। –

2

लोग कच्चे डेटा में आईपी पते को संपीड़ित करते समय वर्णों के बारे में बात कर रहे हैं।

तो सिद्धांत रूप में, क्योंकि हम केवल IPv4 (32 बिट) या आईपीवी 6 (128 बिट), का उपयोग आप अंतरिक्ष की सबसे 128 बिट पर की जरूरत का मतलब है, या 128/8 = 16 बाइट्स कि!

जो सुझाए गए 39 बाइट्स से काफी कम है (माना जाता है कि वर्णसेट एएससीआई है)।

उस ने कहा, आपको कच्चे डेटा में/आईपी पते को डीकोड और एन्कोड करना होगा, जो स्वयं ही करने के लिए एक छोटी सी चीज है (मैंने इसे पहले किया है, 32-बिट आईपी के लिए PHP के ip2long() देखें) ।

संपादित करें:inet_pton (और इसके विपरीत, inet_ntop()) आपको क्या चाहिए होता है, और दोनों का पता प्रकार के साथ काम करता है। लेकिन सावधान रहें, विंडोज़ पर यह PHP 5.3 के बाद उपलब्ध है।

+0

@Elipticalview मुझे नहीं लगता कि आप मेरा जवाब बिल्कुल पढ़ते हैं। मैंने कभी भी 45 बाइट्स का उल्लेख कभी नहीं किया है! यदि आप कच्चे डेटा में किसी भी आईपीवी 4 वैल्यू (यहां तक ​​कि आपके जैसे बुरे लोगों को भी परिवर्तित करते हैं) को परिवर्तित करते हैं, तो उन्हें 4 बाइट्स से अधिक नहीं होना चाहिए - क्योंकि आपके पास कितने बिंदु हैं, उन्हें हमेशा 255 तक प्रत्येक 4 नंबर तक की राशि चाहिए। – Christian

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