2009-10-24 10 views
46

मैं वर्तमान में यूडीपी सॉकेट एप्लिकेशन पर काम कर रहा हूं और मुझे समर्थन में निर्माण करने की आवश्यकता है ताकि आईपीवी 4 और आईपीवी 6 कनेक्शन सर्वर पर पैकेट भेज सकें।आईपीवी 4 और आईपीवी 6 कनेक्शन दोनों का समर्थन कैसे करें

मैं उम्मीद कर रहा था कि कोई मेरी मदद कर सकता है और मुझे सही दिशा में इंगित कर सकता है; जो दस्तावेज मैंने पाया वह पूरा नहीं हुआ था। यदि आप विंसॉक और बीएसडी सॉकेट के बीच कोई अंतर बता सकते हैं तो यह भी उपयोगी होगा।

अग्रिम धन्यवाद!

उत्तर

72

सबसे अच्छा तरीका आईपीवी 6 सर्वर सॉकेट बनाना है जो आईपीवी 4 कनेक्शन भी स्वीकार कर सकता है। ऐसा करने के लिए, एक नियमित आईपीवी 6 सॉकेट बनाएं, सॉकेट विकल्प IPV6_V6ONLY से बंद करें, इसे "किसी भी" पते से बांधें, और प्राप्त करना प्रारंभ करें। IPv4-mapped प्रारूप में आईपीवी 4 पते आईपीवी 6 पते के रूप में प्रस्तुत किए जाएंगे।

सिस्टम में प्रमुख अंतर यह है कि IPV6_V6ONLY ए) उपलब्ध है, और बी) डिफ़ॉल्ट रूप से चालू या बंद है। यह डिफ़ॉल्ट रूप से लिनक्स पर बंद हो जाता है (यानी सेटकॉप्ट के बिना दोहरी-स्टैक सॉकेट की इजाजत देता है), और अधिकांश अन्य सिस्टम पर चालू है।

इसके अतिरिक्त, Windows XP पर IPv6 स्टैक उस विकल्प का समर्थन नहीं करता है। इन मामलों में, आपको दो अलग-अलग सर्वर सॉकेट बनाने की आवश्यकता होगी, और उन्हें चुनिंदा या एकाधिक धागे में रखें।

+1

इस जानकारी के लिए धन्यवाद, ठीक वही मैं जो खोज रहा था। – Charles

+7

यह कहकर कि Linux पर डिफ़ॉल्ट रूप से IPV6_V6ONLY बंद है गलत है: यह केवल कर्नेल पर नहीं, ऑपरेटिंग सिस्टम पर निर्भर करता है। उदाहरण के लिए, डेबियन जीएनयू/लिनक्स पर, यह हाल ही में डिफ़ॉल्ट रूप से स्विच किया गया। – bortzmeyer

+1

ओएस एक्स भी डिफ़ॉल्ट रूप से इसे बंद कर देता है, लेकिन सबसे अच्छी बात यह है कि इसे हमेशा स्पष्ट रूप से सेट करना है। स्थानीय sysadmin इसे सब के बाद बदल दिया हो सकता है। –

6

सॉकेट एपीआई आईईटीएफ आरएफसी द्वारा शासित है और विंडोज़ डब्लूआरटी आईपीवी 6 सहित सभी प्लेटफॉर्म पर समान होना चाहिए।

आईपीवी 4/आईपीवी 6 अनुप्रयोगों के लिए यह सभीgetaddrinfo() और getnameinfo() के बारे में है। getaddrinfo एक प्रतिभा है - क्या मैं आईएनवी 4, आईपीवी 6 या दोनों किसी विशेष गंतव्य तक पहुंचने के लिए अनन्त प्रश्न को हल करने के लिए ग्राहक के DNS, पोर्ट नाम और क्षमताओं को देख सकता हूं? "या यदि आप दोहरी-स्टैक मार्ग पर जा रहे हैं और आईपीवी 4 मैप किए गए आईपीवी 6 पते वापस करना चाहते हैं, यह भी ऐसा करेगा।

यह एक सीधा sockaddr * संरचना कि bind(), recvfrom(), sendto() में जोड़ा जा सकता है और socket() के लिए पता परिवार ... कई मामलों में इसका मतलब है कोई गंदा sockaddr_in(6) संरचनाओं को भरें और से निपटने के लिए प्रदान करता है।

यूडीपी कार्यान्वयन के लिए मैं दोहरी-स्टैक सॉकेट सेट करने या अधिक आम तौर पर सभी इंटरफेस (INADDR_ANY) के लिए बाध्यकारी होने के बारे में सावधान रहूंगा। क्लासिक मुद्दा यह है कि, जब पते को लॉक नहीं किया जाता है (bind() देखें) विशिष्ट इंटरफेस पर और सिस्टम में कई इंटरफेस अनुरोध हैं, तो ओएस रूटिंग टेबल की सनकी के आधार पर कई पतों वाले कंप्यूटरों के लिए प्रतिक्रिया अलग-अलग पतों से पार हो सकती है, भ्रमित अनुप्रयोग प्रोटोकॉल - विशेष रूप से प्रमाणीकरण आवश्यकताओं के साथ किसी भी प्रणाली।

यूडीपी कार्यान्वयन के लिए जहां यह कोई समस्या नहीं है, या टीसीपी, दोहरी स्टैक सॉकेट आईपीवी * -अपने सिस्टम को सक्षम करते समय बहुत समय बचा सकता है। किसी को पूरी तरह से दोहरी-स्टैक पर भरोसा करने के लिए सावधान रहना चाहिए, जहां यह बिल्कुल आवश्यक नहीं है क्योंकि उचित प्लेटफ़ॉर्म (पुरानी लिनक्स, बीएसडी, विंडोज 2003) की कोई कमी नहीं है क्योंकि आईपीवी 6 स्टैक के साथ तैनात किया गया है जो दोहरी स्टैक सॉकेट में सक्षम नहीं है।

2

आरएफसी वास्तव में आईपीवी 6_वी 6ONLY सॉकेट विकल्प का अस्तित्व निर्दिष्ट नहीं करते हैं, लेकिन, यदि यह अनुपस्थित है, तो आरएफसी बहुत स्पष्ट हैं कि कार्यान्वयन होना चाहिए कि विकल्प गलत है।

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

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

+3

आईपीवी 6 एपीआई, आरएफसी 34 9 3 पर मानक, यदि आप सभी विवरण पढ़ना चाहते हैं तो अपने अनुभाग 5.3 में आईपीवी 6_वी 6ONLY का वर्णन करता है। – bortzmeyer

3

मैं विंडोज के तहत इसके साथ खेल रहा हूं और वास्तव में यह एक सुरक्षा समस्या प्रतीत होता है, यदि आप लूपबैक पते से जुड़ते हैं तो आईपीवी 6 सॉकेट सही ढंग से [:: 1] तक बंधी हुई है लेकिन मैप किए गए आईपीवी 4 सॉकेट INADDR_ANY से जुड़ा हुआ है, इसलिए आपका (माना जाता है) सुरक्षित रूप से स्थानीय-केवल ऐप वास्तव में दुनिया के सामने आ गया है।

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