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




विशाखापत्तनम बंदरगाह (13)

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


यदि कम से कम एक दूरस्थ आईपी पहले से ही ज्ञात है, स्थिर और केवल आपके किसी एक ऐप से बात करने के लिए समर्पित है, तो आप इस पते से "साझा" स्थानीय बंदरगाह में इनकमिंग ट्रैफ़िक को रीडायरेक्ट करने के लिए iptables नियम (टेबल नेट, चेन प्रिंटरिंग) का उपयोग कर सकते हैं। कोई अन्य बंदरगाह जहां उचित आवेदन वास्तव में सुनते हैं।


नहीं। केवल एक ही आवेदन एक बंदरगाह से बांध सकता है, और यदि बाध्य मजबूर हो तो व्यवहार अनिश्चित है।

मल्टीकास्ट सॉकेट के साथ - जो कहीं भी आप चाहते हैं उसके करीब कहीं भी ध्वनि नहीं - एक से अधिक एप्लिकेशन पोर्ट को बाध्य कर सकते हैं जब तक कि प्रत्येक सॉकेट के विकल्पों में SO_REUSEADDR सेट हो।

आप इसे "मास्टर" प्रक्रिया लिखकर पूरा कर सकते हैं, जो सभी कनेक्शन स्वीकार करता है और प्रक्रिया करता है, फिर उन्हें अपने दो अनुप्रयोगों को बंद कर देता है जिन्हें एक ही बंदरगाह पर सुनने की आवश्यकता होती है। यह वह दृष्टिकोण है जो वेब सर्वर और ऐसे लेते हैं, क्योंकि कई प्रक्रियाओं को 80 को सुनने की आवश्यकता होती है।

इसके अलावा, हम विनिर्देशों में शामिल हो रहे हैं - आपने टीसीपी और यूडीपी दोनों को टैग किया है, है ना? इसके अलावा, क्या मंच?


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

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

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


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

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

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

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

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

हाँ।

इस लेख से:
SO_REUSEPORT

नया सॉकेट विकल्प उसी होस्ट पर एकाधिक सॉकेट को उसी पोर्ट से बांधने की अनुमति देता है


मैंने 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

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

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


जब आप एक टीसीपी कनेक्शन बनाते हैं, तो आप एक विशिष्ट टीसीपी पते से कनेक्ट करने के लिए कहते हैं, जो आईपी एड्रेस (वी 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 पर अलग-अलग एप्लिकेशन सुन सकते हैं।


एक और तरीका एक बंदरगाह में एक प्रोग्राम को सुनना है जो कि यातायात (एसएसएच, https, आदि) का विश्लेषण करता है, यह आंतरिक रूप से दूसरे पोर्ट पर रीडायरेक्ट करता है जिस पर "असली" सेवा सुन रही है।

उदाहरण के लिए, लिनक्स के लिए, एसएसएलएच: https://github.com/yrutschle/sslh


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


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

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 का उत्तर भी देखें।


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

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

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


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





communication