सवाल SO_REUSEADDR (सेटॉकॉप विकल्प) का अर्थ क्या है - लिनक्स? [डुप्लिकेट]


इस प्रश्न का उत्तर यहां दिया गया है:

आदमी पृष्ठ से:

SO_REUSEADDR नियमों को निर्दिष्ट करता है   आपूर्ति किए गए पते को प्रमाणित करने में उपयोग किया जाता है   बाध्य करने के लिए () स्थानीय के पुन: उपयोग की अनुमति देनी चाहिए   पते, अगर यह द्वारा समर्थित है   मसविदा बनाना। यह विकल्प एक int लेता है   मूल्य। यह एक बूलियन विकल्प है

मुझे इसका उपयोग कब करना चाहिए? "स्थानीय पते का पुन: उपयोग क्यों" देता है?


44
2017-07-12 15:42


मूल


मुझे नहीं पता कि यह सवाल क्यों vc ++ ध्वजांकित किया गया है ... - William Briand
एक गलती। मेरा मतलब सी ++ था। धन्यवाद। - Ray Templeton
इसका अभी भी सी ++ के साथ कुछ लेना देना नहीं है :) - Nikolai Fetissov


जवाब:


टीसीपी का प्राथमिक डिजाइन लक्ष्य पैकेट नुकसान, पैकेट रीडरिंग, और - कुंजी, यहां पैकेट डुप्लिकेशन के चेहरे में विश्वसनीय डेटा संचार की अनुमति देना है।

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

सबसे महत्वपूर्ण बात यह है कि अगर ऐसा कनेक्शन स्वामित्व वाला प्रोग्राम तुरंत मर जाता है, तो दूसरा क्या करना चाहिए, फिर दूसरा एक ही आईपी पता और टीसीपी पोर्ट नंबर चाहता है?

कुछ विकल्प हैं:

  1. उस आईपी / पोर्ट कॉम्बो का पुन: उपयोग अस्वीकार करें, कम से कम 2 बार अधिकतम पैकेट उड़ान में हो सकता है। टीसीपी में, इसे आमतौर पर 2 × कहा जाता हैएम एस एल देरी। आप कभी-कभी 2 × भी देखते हैंRTT, जो लगभग बराबर है।

    यह सभी सामान्य टीसीपी / आईपी ढेर का डिफ़ॉल्ट व्यवहार है। 2 × एमएसएल आम तौर पर 30 और 120 सेकंड के बीच होता है। (यह है TIME_WAIT अवधि।) उस समय के बाद, ढेर मानते हैं कि किसी भी नकली पैकेट गिरा दिए गए हैं रस्ते में समाप्त होने के कारण TTLs, तो यह छोड़ देता है TIME_WAIT राज्य, आईपी / पोर्ट कॉम्बो का पुन: उपयोग करने की अनुमति देता है।

  2. नए कार्यक्रम को उस आईपी / पोर्ट कॉम्बो से फिर से बांधने दें। के साथ ढेर में बीएसडी सॉकेट इंटरफेस - अनिवार्य रूप से सभी यूनिक्स और यूनिक्स जैसी प्रणालियों, साथ ही विंडोज़ के माध्यम से विनसॉक - आपको इस व्यवहार को सेट करके पूछना है SO_REUSEADDR के माध्यम से विकल्प setsockopt() कॉल करने से पहले bind()

SO_REUSEADDR सर्वर प्रोग्राम में सबसे अधिक सेट है।

कारण यह है कि, एक सामान्य पैटर्न यह है कि आप एक सर्वर कॉन्फ़िगरेशन फ़ाइल बदलते हैं और उसे उस सर्वर को पुनरारंभ करने की आवश्यकता होती है ताकि इसे इसकी कॉन्फ़िगरेशन पुनः लोड कर सकें। के बग़ैर SO_REUSEADDR, द bind() पुन: प्रारंभ किए गए प्रोग्राम के नए इंस्टेंस में कॉल विफल हो जाएगा यदि पिछले उदाहरण के लिए कनेक्शन खोले गए थे। उन कनेक्शनों में टीसीपी पोर्ट होगा TIME_WAIT 30-120 सेकेंड के लिए राज्य, तो आप ऊपर 1 मामले में आते हैं।

करने के लिए सुरक्षित चीज इंतजार कर रहा है TIME_WAITअवधि, लेकिन व्यवहार में यह एक बड़ा जोखिम नहीं है कि यह करने के लायक है। सर्वर को तुरंत बैक अप लेना बेहतर होता है ताकि आवश्यकतानुसार किसी और आने वाले कनेक्शन को याद न किया जा सके।


96
2017-07-12 23:18



महान और बहुत उपयोगी उत्तर। बीटीडब्ल्यू: ध्यान दें कि निम्नलिखित उद्धरण आदमी 7 आईपी: बंद होने के बाद कुछ समय के लिए बाध्य किया गया एक टीसीपी स्थानीय सॉकेट पता अनुपलब्ध है, जब तक कि SO_REUSEADDR ध्वज सेट किया गया है। इस ध्वज का उपयोग करते समय देखभाल की जानी चाहिए क्योंकि यह टीसीपी कम विश्वसनीय बनाता है।


SO_REUSEADDR आपके सर्वर को अनुमति देता है   एक पते से बांधें जो एक में है
  TIME_WAIT स्थिति।

यह सॉकेट विकल्प कर्नेल को बताता है कि भले ही यह पोर्ट व्यस्त है (TIME_WAIT स्थिति में), आगे बढ़ें और फिर भी इसका पुन: उपयोग करें। यदि यह व्यस्त है, लेकिन किसी अन्य राज्य के साथ, आपको अभी भी उपयोग त्रुटि में पहले से ही एक पता मिलेगा। यह उपयोगी है अगर आपका सर्वर बंद कर दिया गया है, और फिर तुरंत बंद कर दिया गया है जबकि सॉकेट अभी भी अपने बंदरगाह पर सक्रिय हैं।

से unixguide.net


19
2017-07-12 15:51



बहुत बहुत धन्यवाद, मुझे यह भी मिला लेकिन अभी भी समझ में नहीं आया ... - Ray Templeton
मान लें कि आप एक टीसीपी कनेक्शन खोलते हैं। डेटा संचारित करने के बाद, आप सॉकेट बंद करते हैं। लेकिन वास्तव में, इसे TIME_WAIT स्थिति (TIME_WAIT == "में सेट किया जाएगा, यह संभव है कि कुछ डेटा अभी तक वितरित नहीं किए गए हैं, या कुछ, इसलिए हम थोड़ी देर के लिए सावधानीपूर्वक टीसीपी कार्यान्वयन :)") के रूप में प्रतीक्षा करते हैं। REUSEADDR का उपयोग करके, आप एक ही आईपी / पोर्ट पर एक और कनेक्शन नहीं खोल सकते हैं। - William Briand
पैसा गिरा दिया। आपका बहुत बहुत धन्यवाद! - Ray Templeton


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

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

यदि आप एक ही आईपी के साथ एकाधिक सॉकेट बनाने का प्रयास करते हैं: पोर्ट जोड़ी वास्तव में तेज़ है, तो आपको "पता पहले से उपयोग में" त्रुटि मिलती है क्योंकि पहले सॉकेट पूरी तरह से रिलीज़ नहीं हुआ होगा। SO_REUSEADDR का उपयोग इस त्रुटि से छुटकारा पा जाएगा क्योंकि यह पिछले किसी भी उदाहरण के लिए चेक ओवरराइड करेगा।


6
2017-07-12 23:33



मुझे लगता है कि यह वाक्यांश सबसे महत्वपूर्ण था और किसी ने पहले इसका उल्लेख नहीं किया - "यदि आप एक ही आईपी के साथ एकाधिक सॉकेट बनाने का प्रयास करते हैं: पोर्ट जोड़ी वास्तव में तेज़ है, तो आपको" पता पहले से उपयोग में "त्रुटि मिलती है।" एक वोट वोट के लायक :) - ultimate cause
आईटी को ओएस के लिए "नोटिस" करने में समय नहीं लगता है। वहां एक है परिभाषित टीसीपी राज्य जिसे TIME_WAIT कहा जाता है जिसमें टीसीपी प्रोटोकॉल का विनिर्देशन होता है की आवश्यकता है अंततः इसे जारी करने से पहले बंदरगाह को बनाए रखने के लिए ऑपरेटिंग सिस्टम। यह राज्य संबंधित सॉकेट को बंद करने के बाद की तारीख है। - user207421