S एक सर्वर प्रोग्राम है: मान लीजिए कि यह एक HTTP सर्वर है, इसलिए यह HTTP के लिए प्रसिद्ध पोर्ट नंबर का उपयोग करेगा , जो कि 80 है। मैं इसे IP पते वाले होस्ट पर चलाता हूं 10.0.0.4
, इसलिए यह कनेक्शनों के लिए सुनेगा 10.0.0.4:80
(क्योंकि यही वह जगह है जहाँ हर कोई इसे खोजने की उम्मीद करेगा)।
एस के अंदर , मैं एक सॉकेट बनाने जा रहा हूं और इसे उस पते पर बांध10.0.0.4:80
दूंगा : अब, ओएस जानता है कि आने वाले कनेक्शन को उस विशेष सॉकेट के माध्यम से मेरी एस प्रक्रिया में भेजा जाना चाहिए ।
नेटस्टैट आउटपुट एक बार सॉकेट बाउंड होने के बाद:
$ netstat --tcp -lan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
एनबी। स्थानीय पता सभी शून्य है क्योंकि S को इस बात की परवाह नहीं है कि उसके ग्राहक उस तक कैसे पहुँचे
एक बार जब एस में यह सॉकेट बंध जाता है, तो यह कनेक्शन स्वीकार करेगा - हर बार एक नया क्लाइंट कनेक्ट होने पर, accept
एक नया सॉकेट लौटाता है , जो उस क्लाइंट के लिए विशिष्ट है
एक बार कनेक्शन स्वीकृत होने के बाद netstat आउटपुट:
$ netstat --tcp -lan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 10.0.0.4:80 10.0.0.5:55715 ESTABLISHED
10.0.0.4:80
कनेक्शन के एस के अंत का प्रतिनिधित्व करता है, और द्वारा लौटाए गए सॉकेट के साथ जुड़ा हुआ हैaccept
10.0.0.5:55715
कनेक्शन का क्लाइंट अंत है, और उस सॉकेट से जुड़ा है जिसे क्लाइंट कनेक्ट करने के लिए पास किया गया है । इस टीसीपी कनेक्शन पर पैकेट को रूट करने के अलावा सही प्रक्रिया के लिए क्लाइंट के पोर्ट का उपयोग नहीं किया जाता है: यह एपर्मेरल पोर्ट रेंज से क्लाइंट के कर्नेल द्वारा यादृच्छिक रूप से असाइन किया जाता है।
अब, एस खुशी से अधिक ग्राहक कनेक्शन स्वीकार कर सकता है ... प्रत्येक को अपना सॉकेट मिलेगा, प्रत्येक सॉकेट एक अद्वितीय टीसीपी कनेक्शन के साथ जुड़ा होगा, और प्रत्येक कनेक्शन में एक अद्वितीय रिमोट एड्रेस होगा। S क्लाइंट की स्थिति को ट्रैक करेगा (यदि कोई है) तो इसे सॉकेट के साथ जोड़कर।
तो, लगभग:
- आईपी पता नेटवर्क पर मेजबानों के बीच रूटिंग के लिए है
- पोर्ट होस्ट पर सही सॉकेट के लिए रूटिंग के लिए है
- मैंने लगभग सही प्रक्रिया कहा है , लेकिन यह वास्तव में एक ही सॉकेट पर स्वीकार करने वाले कई (आमतौर पर बच्चे) प्रक्रियाओं के लिए संभव है ...
- हालाँकि, जब भी कोई समवर्ती
accept
कॉल करता है, तो वह केवल एक प्रक्रिया में ऐसा करता है, प्रत्येक आने वाले कनेक्शन का सॉकेट सर्वर के एक उदाहरण के लिए अद्वितीय होता है
- सॉकेट वह वस्तु है जो एक प्रक्रिया एक विशेष कनेक्शन के बारे में ओएस से बात करने के लिए उपयोग करती है, बहुत कुछ फ़ाइल विवरणक की तरह
- जैसा कि टिप्पणियों में उल्लेख किया गया है, सॉकेट्स के लिए बहुत सारे अन्य उपयोग हैं जो सभी बंदरगाहों का उपयोग नहीं करते हैं: उदाहरण के लिए सॉकेटपेयर एक साथ जुड़े सॉकेट्स की एक जोड़ी बनाता है जिनकी कोई भी संबोधित करने की योजना नहीं है - उस पाइप का उपयोग करने का एकमात्र तरीका है वह प्रक्रिया, जिसे कहा जाता है
socketpair
, उस प्रक्रिया का एक बच्चा होना और किसी को विरासत में देना या स्पष्ट रूप से उस प्रक्रिया में से एक सॉकेट को पारित करना