sockets - कहत - विशाखापत्तनम बंदरगाह




क्या दो अनुप्रयोग एक ही बंदरगाह को सुन सकते हैं? (11)

आप एक नेटवर्क इंटरफेस के लिए एक बंदरगाह पर एक आवेदन सुन सकते हैं। इसलिए आप हो सकते हैं:

  1. httpd दूरस्थ रूप से सुलभ इंटरफ़ेस पर सुन रहा है, उदाहरण के लिए 192.168.1.1:80
  2. 127.0.0.1:80 सुनकर एक और डेमन

नमूना उपयोग केस httpd को लोड बैलेंसर या प्रॉक्सी के रूप में उपयोग करने के लिए किया जा सकता है।

क्या एक ही मशीन पर दो अनुप्रयोग एक ही बंदरगाह और आईपी पते से जुड़ सकते हैं? इसे एक कदम आगे लेते हुए, क्या एक ऐप किसी निश्चित आईपी से आने वाले अनुरोधों और दूसरे रिमोट आईपी में सुन सकता है? मुझे पता है कि मेरे पास एक ऐसा एप्लीकेशन हो सकता है जो दो धागे (या कांटे) को समान व्यवहार करने के लिए शुरू कर देता है, लेकिन क्या दो अनुप्रयोगों में समान कुछ भी नहीं हो सकता है?


आप एक ही पोर्ट इंटरफेस पर उसी पोर्ट के लिए दो एप्लिकेशन सुन सकते हैं।

निर्दिष्ट नेटवर्क इंटरफ़ेस और पोर्ट के लिए केवल एक सुनना सॉकेट हो सकता है, लेकिन उस सॉकेट को कई अनुप्रयोगों के बीच साझा किया जा सकता है।

यदि आपके पास एप्लिकेशन प्रक्रिया में एक सुनवाई सॉकेट है और आप उस प्रक्रिया को fork करते हैं, तो सॉकेट विरासत में मिलेगी, इसलिए तकनीकी रूप से अब एक ही पोर्ट को सुनकर दो प्रक्रियाएं होंगी।


जब आप एक टीसीपी कनेक्शन बनाते हैं, तो आप एक विशिष्ट टीसीपी पते से कनेक्ट करने के लिए कहते हैं, जो आईपी एड्रेस (वी 4 या वी 6, आपके द्वारा उपयोग किए जा रहे प्रोटोकॉल के आधार पर) और एक बंदरगाह का संयोजन है।

जब कोई सर्वर कनेक्शन के लिए सुनता है, तो यह कर्नेल को सूचित कर सकता है कि वह किसी विशिष्ट आईपी पते और पोर्ट, यानी, एक आईपी पता, या सभी होस्ट आईपी पते पर सुनना चाहेगा, प्रत्येक एक विशिष्ट बंदरगाह पर, जो प्रभावी रूप से प्रभावी है बहुत सारे "टीसीपी पते" पर सुनना (उदाहरण के लिए, 1 9 2.168.1.10:8000, 127.0.0.1:8000, आदि)

नहीं, आपके पास एक ही "टीसीपी पता" पर दो एप्लिकेशन नहीं सुन सकते हैं, क्योंकि जब कोई संदेश आता है, तो कर्नेल कैसे संदेश को संदेश देने के लिए जानता है?

हालांकि, आप अधिकांश ऑपरेटिंग सिस्टम में आप एक इंटरफ़ेस पर कई आईपी पतों को स्थापित कर सकते हैं (उदाहरण के लिए, यदि आपके पास इंटरफ़ेस पर 192.168.1.10 है, तो आप 1 9 2.168.1.11 भी सेट कर सकते हैं, यदि नेटवर्क पर कोई और इसका उपयोग नहीं कर रहा है) , और उन मामलों में आप उन दो आईपी पते पर पोर्ट 8000 पर अलग-अलग एप्लिकेशन सुन सकते हैं।


टीसीपी के लिए, नहीं। आप एक ही पोर्ट पर एक ही समय में एक आवेदन सुन सकते हैं। अब यदि आपके पास 2 नेटवर्क कार्ड थे, तो आपके पास एक ही पोर्ट नंबर का उपयोग करके पहले आईपी पर दूसरा एप्लिकेशन और दूसरे आईपी पर दूसरा एप्लिकेशन सुन सकता था।

यूडीपी (मल्टीकास्ट) के लिए, एकाधिक एप्लिकेशन एक ही बंदरगाह की सदस्यता ले सकते हैं।


मैंने socat साथ निम्न कोशिश की है:

socat TCP-L:8080,fork,reuseaddr -

और भले ही मैंने सॉकेट से कनेक्शन नहीं बनाया है, फिर भी मैं reuseaddr विकल्प के बावजूद, उसी बंदरगाह पर दो बार नहीं सुन सकता।

मुझे यह संदेश मिलता है (जिसे मैंने पहले उम्मीद की थी):

2016/02/23 09:56:49 socat[2667] E bind(5, {AF=2 0.0.0.0:8080}, 16): Address already in use

यदि अनुप्रयोगों से आप कई प्रक्रियाओं का मतलब है तो हां लेकिन आम तौर पर नहीं। उदाहरण के लिए अपाचे सर्वर एक ही बंदरगाह (आमतौर पर 80) पर कई प्रक्रियाओं को चलाता है। यह वास्तव में बंदरगाह से बांधने के लिए प्रक्रिया में से एक को नामित करके किया जाता है और फिर उस प्रक्रिया का उपयोग विभिन्न प्रक्रियाओं को हैंडओवर करने के लिए करता है जो कनेक्शन स्वीकार कर रहे हैं।


सिद्धांत रूप में, नहीं।

यह पत्थर में लिखा नहीं है; लेकिन यह तरीका है कि सभी एपीआई लिखे गए हैं: ऐप एक बंदरगाह खोलता है, इसे एक हैंडल प्राप्त करता है, और जब ओएस क्लाइंट कनेक्शन (या यूडीपी मामले में एक पैकेट) आता है तो ओएस इसे (उस हैंडल के माध्यम से) सूचित करता है।

यदि ओएस ने दो ऐप्स को एक ही बंदरगाह खोलने की इजाजत दी, तो यह कैसे पता चलेगा कि कौन सा अधिसूचना देना है?

लेकिन ... इसके आसपास के तरीके हैं:

  1. जैसा कि जेड noted , आप एक 'मास्टर' प्रक्रिया लिख ​​सकते हैं, जो कि एकमात्र ऐसा होगा जो वास्तव में बंदरगाह पर सुनता है और दूसरों को सूचित करता है, किसी भी तर्क का उपयोग करके वह ग्राहक अनुरोधों को अलग करना चाहता है।
    • लिनक्स और बीएसडी (कम से कम) पर आप 'रीमेपिंग' नियम सेट कर सकते हैं जो किसी भी नेटवर्क से संबंधित मानदंडों (शायद मूल के नेटवर्क, या कुछ के अनुसार 'दृश्यमान' पोर्ट से पैकेट को अलग-अलग (जहां ऐप्स सुन रहे हैं) पर रीडायरेक्ट करते हैं। लोड संतुलन के सरल रूप)।

हाँ।

  1. एकाधिक श्रवण टीसीपी सॉकेट, सभी एक ही बंदरगाह से बंधे हैं, सह-अस्तित्व में हो सकते हैं, बशर्ते वे सभी अलग-अलग स्थानीय आईपी पते से बंधे हों। ग्राहक जो भी चाहते हैं उससे जुड़ सकते हैं। इसमें 0.0.0.0 ( INADDR_ANY ) शामिल नहीं है।

  2. एकाधिक स्वीकृत सॉकेट सह-अस्तित्व में हो सकते हैं, सभी एक ही सुनवाई सॉकेट से स्वीकार किए जाते हैं, सभी सुनते सॉकेट के समान स्थानीय पोर्ट नंबर दिखाते हैं।

  3. एक ही बंदरगाह से जुड़े कई यूडीपी सॉकेट सभी सह-अस्तित्व में उपलब्ध हो सकते हैं (1) या वे सभी को बाध्यकारी से पहले SO_REUSEADDR विकल्प सेट किया गया है।

  4. टीसीपी बंदरगाहों और यूडीपी बंदरगाहों में अलग-अलग नामस्थान हैं, इसलिए टीसीपी के लिए बंदरगाह का उपयोग यूडीपी के लिए इसके उपयोग को रोकता नहीं है, और इसके विपरीत।

संदर्भ: स्टीवंस एंड राइट, टीसीपी / आईपी इलस्ट्रेटेड, वॉल्यूम II।


हां और ना। केवल एक ही एप्लिकेशन एक बंदरगाह पर सक्रिय रूप से सुन सकता है। लेकिन वह एप्लिकेशन किसी अन्य प्रक्रिया के साथ अपने कनेक्शन को दे सकता है। तो आप एक ही बंदरगाह पर काम कर रहे कई प्रक्रियाएं हो सकती हैं।


संक्षिप्त जवाब:

here दिए गए उत्तर से जा रहे here । आपके पास एक ही आईपी पते और पोर्ट नंबर पर दो एप्लिकेशन सुन सकते हैं, इसलिए पोर्ट में से एक यूडीपी पोर्ट है, जबकि दूसरा एक टीसीपी पोर्ट है।

स्पष्टीकरण:

बंदरगाह की अवधारणा टीसीपी / आईपी स्टैक की परिवहन परत पर प्रासंगिक है, इस प्रकार जब तक आप ढेर के विभिन्न परिवहन परत प्रोटोकॉल का उपयोग कर रहे हैं, तो आप एक ही <ip-address>:<port> पर कई प्रक्रियाओं को सुन सकते हैं। मेल।

एक संदेह है कि लोगों के पास यह है कि यदि दो अनुप्रयोग एक ही <ip-address>:<port> संयोजन पर चल रहे हैं, तो रिमोट मशीन पर चलने वाला क्लाइंट दोनों के बीच अंतर कैसे करेगा? यदि आप आईपी लेयर पैकेट हेडर ( https://en.wikipedia.org/wiki/IPv4#Header ) देखते हैं, तो आप देखेंगे कि बिट्स 72 से 79 बिट प्रोटोकॉल को परिभाषित करने के लिए उपयोग किए जाते हैं, इस प्रकार भेदभाव किया जा सकता है।

यदि आप एक ही टीसीपी <ip-address>:<port> संयोजन पर दो आवेदन करना चाहते हैं, तो जवाब नहीं है (एक दिलचस्प अभ्यास दो वीएम लॉन्च किया जाएगा, उन्हें एक ही आईपी पता दें, लेकिन विभिन्न मैक पते दें, और देखें क्या होता है - आप देखेंगे कि वीएम 1 को कुछ बार पैकेट मिलेगा, और अन्य बार वीएम 2 को पैकेट मिलेगा - एआरपी कैश रीफ्रेश के आधार पर)।

मुझे लगता है कि एक ही <op-address>:<port> पर दो एप्लिकेशन चलाकर आप कुछ प्रकार के लोड संतुलन प्राप्त करना चाहते हैं। इसके लिए आप विभिन्न बंदरगाहों पर एप्लिकेशन चला सकते हैं, और उनके बीच यातायात को विभाजित करने के लिए आईपी टेबल नियम लिख सकते हैं।

@ User6169806 का उत्तर भी देखें।


हां (टीसीपी के लिए) यदि प्रोग्राम ऐसा करने के लिए डिज़ाइन किए गए हैं, तो आपके पास दो सॉकेट एक ही सॉकेट पर सुन सकते हैं। जब सॉकेट को पहले प्रोग्राम द्वारा बनाया जाता है, तो सुनिश्चित करें कि SO_REUSEADDR विकल्प सॉकेट पर सेट है bind() । हालांकि, यह वही नहीं हो सकता जो आप चाहते हैं। यह क्या करता है एक आने वाला टीसीपी कनेक्शन कार्यक्रमों में से एक को निर्देशित किया जाएगा, दोनों नहीं, इसलिए यह कनेक्शन को डुप्लिकेट नहीं करता है, यह केवल दो कार्यक्रमों को आने वाले अनुरोध की सेवा करने की अनुमति देता है। उदाहरण के लिए, वेब सर्वरों में पोर्ट 80 पर सभी प्रक्रियाएं होंगी, और ओ / एस नए कनेक्शन को स्वीकार करने के लिए तैयार प्रक्रिया के लिए एक नया कनेक्शन भेजता है।

SO_REUSEADDR

अन्य सॉकेट को इस पोर्ट में bind() करने की अनुमति देता है, जब तक कि पहले से ही बंदरगाह से सक्रिय सक्रिय सुनवाई सॉकेट न हो। जब आप क्रैश के बाद अपने सर्वर को पुनरारंभ करने का प्रयास करते हैं तो यह आपको उन "पता पहले से उपयोग में" त्रुटि संदेश प्राप्त करने में सक्षम बनाता है।





communication