2011-11-16 13 views
8

से Beej's Guide to Network programmingAF_UNSPEC का उपयोग करने के नुकसान/जोखिम क्या होंगे?

आप जो कुछ भी उपयोग करने के लिए AF_UNSPEC रूप ai_family क्षेत्र में आईपीवी 4 या आईपीवी 6 उपयोग करने के लिए, या छोड़ यह मजबूर कर सकते हैं। यह अच्छा है क्योंकि आपका कोड आईपी संस्करण-अज्ञेयवादी हो सकता है।

शीर्षक के रूप में कहते हैं - क्या नुकसान (या जोखिम, यदि कोई हो) होगा की हमेशा बजाय आईपीवी 4 या आईपीवी 6 को निर्दिष्ट करने की, AF_UNSPEC का उपयोग कर?

या यह केवल एक कारण के लिए है - यदि संस्करण निर्दिष्ट है, तो यह गारंटी देगा कि यह और केवल यह संस्करण समर्थित है?


एक छोटी सी पृष्ठभूमि - मैं क्लाइंट-सर्वर (C++) अनुप्रयोगों में IPv6 के लिए समर्थन जोड़ने के बारे में सोचते हैं और दोनों संस्करणों का समर्थन किया जाना चाहिए। तो मुझे आश्चर्य हुआ कि AF_UNSPEC का उपयोग करना ठीक है या स्ट्रिंग से पते को पहचानना बेहतर है और पते के आधार पर AF_INET6 या AF_INET का उपयोग करना बेहतर है।

उत्तर

3

आपको क्लाइंट और सर्वर अनुप्रयोगों के बीच अंतर करना होगा।

क्लाइंट पर, यह आसान है: बस getaddrinfo() पर कॉल करें और जब तक आप कनेक्शन प्राप्त न करें तब तक अनुक्रम में प्रत्येक उत्तर को आज़माएं।

सर्वर पर, चीजों को थोड़ा कठिन हैं:

  • सिस्टम जिसका IPv4 और v6 ढेर जुड़े रहते हैं कर रहे हैं, वहाँ यह सिर्फ आईपीवी 6 पर सुनने के लिए पर्याप्त है। शायद सॉकेट को दोनों को सुनने के लिए सक्षम होना चाहिए।
  • अन्य सिस्टम, जैसे कि विंडोज एक्सपी, ने स्टैक्स को अलग किया है जहां यह कनेक्शन संभव नहीं है। वहां आपको एक साथ कई सॉकेट के साथ काम करना होगा। मुझे निम्नलिखित में उन पर ध्यान केंद्रित करने दें।

सर्वर पर भी, getaddrinfo() का उपयोग किया जा सकता है। वहां आप संकेतों में ध्वज AI_PASSIVE का उपयोग करते हैं। फिर आपको परिणाम मिलते हैं। इन सभी पर आपको सुनना होगा, शायद IPV6_V6ONLY ध्वज सक्षम करना।

accept() या तो गैर-अवरुद्ध किया जाना चाहिए या select() या poll() (सुनिश्चित नहीं है कि उत्तरार्द्ध संभव है)।

+0

धन्यवाद। मैंने टैग में से एक को 'यूनिक्स' में बदल दिया। तो, मेरा सवाल लिनक्स के बारे में है। मैंने 'AF_UNSPEC' के साथ प्रयास किया और यह दोनों संस्करणों के लिए सही काम करता प्रतीत होता है। मैंने सोचा कि क्या मैं इसे इस तरह इस्तेमाल कर सकता हूं, या कई सॉकेट से निपटना बेहतर है। –

+0

http://stackoverflow.com/questions/8113805/usage-of-getaddrinfo-with-ai-passive पर देखें। मैंने इसके बारे में एक निष्कर्ष लिखा ... – glglgl

+0

आह, अब मैं देखता हूं। यह समझने में मुझे इतना समय लगा कि आपका क्या मतलब है: डी मैं बस नेटवर्क प्रोग्रामिंग के लिए नया हूं। धन्यवाद, +1 और स्वीकार किया गया (भले ही यह वास्तव में अपने शीर्षक में प्रश्न का उत्तर नहीं देता है, लेकिन मुझे अपने दिमाग को साफ़ करने में मदद मिली :)) –

3

जिस तरह से चीजें होना चाहिए:

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

कुछ वास्तविक दुनिया के मुद्दों:

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

-1

AF_UNSPEC का उपयोग करने के जोखिमों में से एक यह है कि आप क्लाइंट को किसी दुर्भावनापूर्ण DNS सर्वर से बड़े प्रतिक्रियाओं के बारे में बताते हैं जो एक स्टैक बफर ओवरफ़्लो का कारण बनने के लिए CVE-2015-7547 का उपयोग करने का प्रयास कर रहा है, और दुर्भावनापूर्ण कोड निष्पादित किया जा सकता है ग्राहक द्वारा वास्तव में गेटड्रिन्फो में ज्ञात दोष के लिए एक प्रस्तावित कामकाज AF_UNSPEC के उपयोग को बग रिपोर्ट में विस्तृत here के रूप में उपयोग करना है। 2K से अधिक DNS प्रतिक्रियाओं के लिए अतिप्रवाह दोष 2.9 से glibc को प्रभावित करता है, और 2.23 में तय किया गया है। यह वर्तमान में स्थापित लिनक्स वितरण को प्रभावित करता है।

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