सॉकेट एपीआई कैसे काम करता है?


126

सॉकेट एपीआई टीसीपी / आईपी और यूडीपी / आईपी संचार के लिए डी-फैक्टो मानक है (यानी, जैसा कि हम जानते हैं, नेटवर्किंग कोड)। हालांकि, इसके मुख्य कार्यों में accept()से एक, थोड़ा जादुई है।

एक अर्ध-औपचारिक परिभाषा उधार लेने के लिए:

स्वीकार () का उपयोग सर्वर साइड पर किया जाता है। यह दूरस्थ क्लाइंट से एक नया टीसीपी कनेक्शन बनाने के लिए प्राप्त आवक प्रयास को स्वीकार करता है, और इस कनेक्शन के सॉकेट एड्रेस जोड़ी के साथ जुड़ा एक नया सॉकेट बनाता है।

दूसरे शब्दों में, acceptएक नया सॉकेट लौटाता है जिसके माध्यम से सर्वर नए जुड़े क्लाइंट के साथ संवाद कर सकता है। पुराने सॉकेट (जिस acceptपर कॉल किया जाता था) खुले रहते हैं, उसी पोर्ट पर, नए कनेक्शन के लिए सुनते हैं।

कैसे acceptकाम करता है ? इसे कैसे लागू किया जाता है? इस विषय पर बहुत भ्रम है। कई लोग दावा करते हैं कि स्वीकार एक नया पोर्ट खोलता है और आप क्लाइंट से इसके माध्यम से संवाद करते हैं। लेकिन यह स्पष्ट रूप से सच नहीं है, क्योंकि कोई नया पोर्ट नहीं खोला गया है। आप वास्तव में विभिन्न ग्राहकों के साथ एक ही पोर्ट के माध्यम से संवाद कर सकते हैं, लेकिन कैसे? जब कई धागे recvएक ही पोर्ट पर कॉल करते हैं, तो डेटा को कैसे जाना जाता है?

मुझे लगता है कि यह क्लाइंट के पते के सॉकेट डिस्क्रिप्टर के साथ जुड़े होने की तर्ज पर कुछ है, और जब भी डेटा recvइसके माध्यम से आता है तो सही सॉकेट में रूट किया जाता है, लेकिन मुझे यकीन नहीं है।

इस तंत्र की आंतरिक कार्यप्रणाली का गहन विवरण प्राप्त करना बहुत अच्छा होगा।


2
इसलिए हर क्लाइंट रिक्वेस्ट के लिए, सर्वर एंड पर एक ब्रांड न्यू सॉकेट कनेक्शन खोला जाता है। इनकमिंग कॉल को सुनने के लिए सर्वर को हमेशा 80 पर खुला होना चाहिए। यदि यह एक कॉल प्राप्त करता है, तो यह तुरंत नीचे बताए गए चार ट्यूपलों के साथ एक नया सॉकेट बनाता है, जो क्लाइंट और सर्वर के बीच एक टीसीपी कनेक्शन बना देगा। क्या मेरी समझ सही है?
ब्रेन स्टॉर्म

1
यह एक बहुत ही मौलिक प्रश्न है और हाल ही में मैंने एक साक्षात्कार में इस पर परीक्षण किया था: stackoverflow.com/questions/24871827/… यदि आपके पास इस पर कोई टिप्पणी है, तो कृपया पोस्ट करें
मस्तिष्क तूफान

@brainstorm केवल तभी जब आप HTTP कीपिंग के अस्तित्व को पूरी तरह से नजरअंदाज करते हैं।
लोर्न

जवाबों:


140

आपका भ्रम यह सोचने में निहित है कि सॉकेट सर्वर आईपी: सर्वर पोर्ट द्वारा पहचाना जाता है। जब वास्तविकता में, सॉकेट को विशिष्ट रूप से सूचना की चौकड़ी द्वारा पहचाना जाता है:

Client IP : Client Port तथा Server IP : Server Port

इसलिए जब सर्वर आईपी और सर्वर पोर्ट सभी स्वीकृत कनेक्शनों में स्थिर होते हैं, तो क्लाइंट साइड जानकारी वह है जो इसे ट्रैक करने की अनुमति देता है कि सब कुछ कहां हो रहा है।

चीजों को स्पष्ट करने के लिए उदाहरण:

कहें कि हमारे पास एक सर्वर है 192.168.1.1:80और दो ग्राहक हैं, 10.0.0.1और 10.0.0.2

10.0.0.1स्थानीय पोर्ट पर एक कनेक्शन खोलता है 1234और सर्वर से कनेक्ट होता है। अब सर्वर में एक सॉकेट की पहचान निम्न प्रकार से की जाती है:

10.0.0.1:1234 - 192.168.1.1:80  

अब 10.0.0.2स्थानीय पोर्ट पर एक कनेक्शन खोलता है 5678और सर्वर से कनेक्ट होता है। अब सर्वर में दो सॉकेट की पहचान इस प्रकार है:

10.0.0.1:1234 - 192.168.1.1:80  
10.0.0.2:5678 - 192.168.1.1:80

3
मैं कार्यान्वयन विवरण (जो संभवतः प्लेटफ़ॉर्म से प्लेटफ़ॉर्म पर भिन्न होता है) को नहीं जानता, मुझे बस इतना पता है कि मेरे द्वारा बताई गई जानकारी की चौकड़ी द्वारा वैचारिक रूप से सॉकेट्स की पहचान की जाती है।

3
क्या आपके पास इस पर कोई संदर्भ है?
क्विक

3
यादृच्छिक सवाल: यदि नेट का उपयोग किया जा रहा है, और सर्वर से कनेक्ट होने पर समान स्थानीय पोर्ट का उपयोग करने का प्रयास करने वाले दो क्लाइंट क्या होते हैं? उदाहरण के लिए, यदि 10.0.0.1 और 10.0.0.2 दोनों 192.168.0.1 के बाहरी आईपी के साथ एक राउटर से जुड़े हैं, तो 192.168.1.1 पर सर्वर 192.168.0.1 से दो कनेक्शन देखता है। उस मामले में क्या होता है अगर यादृच्छिक संख्या-जनरेटर के कुछ अस्थायी द्वारा 10.0.0.1 और 10.0.0.2 दोनों एक ही स्थानीय पोर्ट का चयन करते हैं?
अरोथ

4
राउटर में NAT समर्थन वहाँ के विवरण का ध्यान रखता है। नेटवर्क ट्रैफ़िक वास्तव में दो कनेक्शन पर जा रहा है - क्लाइंट से राउटर, और राउटर से सर्वर। राउटर दो अलग-अलग बंदरगाहों पर 192.168.0.1:1234 और 192.168.0.1 लगभग 6678 पर आउटगोइंग कनेक्शन बनाता है। आवक ट्रैफ़िक को फिर राउटर द्वारा सही क्लाइंट के लिए पुनर्निर्देशित किया जाता है।
१ 26 २६

3
यदि एक सॉकेट को चौकड़ी से पहचाना जाता है, तो सुनने वाले सॉकेट की चौकड़ी की जानकारी क्या है?
एरिक झेंग

74

उपयोगकर्ता द्वारा दिए गए उत्तर को जोड़ने के लिए "26 का 17"

सॉकेट में वास्तव में 5 ट्यूपल होते हैं - (स्रोत आईपी, स्रोत पोर्ट, गंतव्य आईपी, गंतव्य पोर्ट, प्रोटोकॉल)। यहां प्रोटोकॉल टीसीपी या यूडीपी या किसी भी ट्रांसपोर्ट लेयर प्रोटोकॉल को लागू कर सकता है। IP डेटाग्राम में 'प्रोटोकॉल' फ़ील्ड से पैकेट में इस प्रोटोकॉल की पहचान की जाती है।

इस प्रकार सर्वर पर अलग-अलग एप्लिकेशन का उसी 4-ट्यूपल पर एक ही क्लाइंट से संवाद करना संभव है, लेकिन प्रोटोकॉल क्षेत्र में अलग-अलग होना संभव है। उदाहरण के लिए

सर्वर साइड पर अपाचे (सर्वर1.com:880-client1:1234 पर टीसीपी) और वर्ल्ड ऑफ वॉकर पर बात कर रहे हैं (सर्वर 1.com:880-client1:1234 UDP पर)

क्लाइंट और सर्वर दोनों ही इसे IP पैकेट में प्रोटोकॉल फ़ील्ड के रूप में संभालेंगे, दोनों ही मामलों में, भले ही अन्य 4 फ़ील्ड समान हों।


13

जब मैं यह सीख रहा था तो मुझे जो भ्रम हुआ था, वह यह था कि शर्तें socketऔर portसुझाव है कि वे कुछ भौतिक हैं, जब वास्तव में वे डेटा संरचनाएं हैं, जो कर्नेल नेटवर्किंग के विवरणों को सार करने के लिए उपयोग करता है।

जैसे, डेटा संरचनाएं अलग-अलग क्लाइंट से अलग कनेक्शन रखने में सक्षम होने के लिए कार्यान्वित की जाती हैं। के रूप में वे कैसे कार्यान्वित किए जाते हैं, इसका उत्तर या तो एक है।) यह कोई फर्क नहीं पड़ता, सॉकेट्स एपीआई का उद्देश्य ठीक है कि कार्यान्वयन कोई फर्क नहीं पड़ता या बी) केवल एक नज़र है। अत्यधिक अनुशंसित स्टीवंस पुस्तकों के अलावा, एक कार्यान्वयन का विस्तृत विवरण प्रदान करने वाला, लिनक्स या सोलारिस में स्रोत या बीएसएम में से एक की जांच करें।


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

-1

जैसा कि दूसरे लड़के ने कहा, एक सॉकेट को विशिष्ट रूप से 4-ट्यूपल (क्लाइंट आईपी, क्लाइंट पोर्ट, सर्वर आईपी, सर्वर पोर्ट) द्वारा पहचाना जाता है।

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

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


क्या आप 'हैंडऑफ़ पोर्ट' के हिस्से पर विस्तार से बता सकते हैं?
एली बेंडरस्की

1
यह या तो कुछ पूर्व-टीसीपी प्रोटोकॉल का विवरण है, या अत्यधिक सरलीकृत है। सुनने वाले सॉकेट से कनेक्ट करने का प्रयास करने वाला क्लाइंट कनेक्शन स्थापित करने के लिए एक विशेष पैकेट भेजता है (SYN बिट सेट)। एक पैकेट में एक नया सॉकेट बनाने और एक मौजूदा सॉकेट का उपयोग करने के बीच एक स्पष्ट अंतर है।
जॉन एम

... कनेक्शन स्थापित करने के लिए एक विशेष पैकेट भेजता है (SYN बिट सेट)। जो (जैसा कि मैं इसे समझता हूं) प्रोटोकॉल स्टैक को 'श्रोता (यदि कोई है) को देने का कारण बनता है, यही वजह है कि प्रति पते / पोर्ट / प्रोटोकॉल संयोजन में केवल एक ही सुनने का पोर्ट हो सकता है। मुझे यकीन नहीं है कि अगर यह कल्पना या केवल कार्यान्वयन सम्मेलन में है।
पीटर जूल

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

"एक डेटाबेस रखता है (जिसका अर्थ है कि मुझे परवाह नहीं है कि किस प्रकार की तालिका / सूची / वृक्ष / सरणी / मैजिक डेटा संरचना का उपयोग करता है)" :) मैं आमतौर पर इसे "टेबल" (या शायद "ग्राफ" या "निर्णय पेड़" कहता हूं) )। "डेटाबेस" मेरे लिए कुछ कार्यान्वयन का सुझाव देता है।
मास्टरएक्सिलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.