टीसीपी / एचटीटीपी पोर्ट पर सुन रहे हैं: कैसे कई उपयोगकर्ता एक ही पोर्ट साझा कर सकते हैं
तो, क्या होता है जब एक सर्वर टीसीपी पोर्ट पर आने वाले कनेक्शन के लिए सुनता है? उदाहरण के लिए, मान लें कि आपके पास पोर्ट 80 पर एक वेब-सर्वर है। मान लें कि आपके कंप्यूटर में 24.14.181.229 का सार्वजनिक आईपी पता है और जो व्यक्ति आपसे जुड़ने की कोशिश करता है, उसका आईपी पता 10.1.2.3 है। यह व्यक्ति 24.14.181.229:80 पर टीसीपी सॉकेट खोलकर आपसे जुड़ सकता है। काफी सरल।
सहज रूप से (और गलत तरीके से), ज्यादातर लोग मानते हैं कि यह कुछ इस तरह दिखता है:
Local Computer | Remote Computer
--------------------------------
<local_ip>:80 | <foreign_ip>:80
^^ not actually what happens, but this is the conceptual model a lot of people have in mind.
यह सहज है, क्योंकि क्लाइंट के दृष्टिकोण से, उसके पास एक आईपी पता है, और आईपी: पोर्ट पर एक सर्वर से जुड़ता है। चूँकि क्लाइंट 80 पोर्ट से जुड़ता है, तो उसका पोर्ट भी 80 होना चाहिए? यह सोचने वाली एक समझदारी है, लेकिन वास्तव में ऐसा नहीं है। यदि यह सही होना था, तो हम केवल एक उपयोगकर्ता प्रति विदेशी आईपी पते की सेवा कर सकते थे। एक बार एक दूरस्थ कंप्यूटर कनेक्ट हो जाता है, तो वह पोर्ट 80 को पोर्ट 80 कनेक्शन के लिए बंद कर देगा, और कोई भी कनेक्ट नहीं कर सकता है।
तीन बातों को समझना चाहिए:
1.) एक सर्वर पर, एक प्रक्रिया एक बंदरगाह पर सुन रही है। एक बार जब यह एक कनेक्शन हो जाता है, यह इसे एक और धागे को सौंप देता है। संचार सुनने के बंदरगाह को कभी नहीं हिलाता है।
2.) निम्नलिखित 5-ट्यूपल द्वारा ओएस द्वारा कनेक्शन को विशिष्ट रूप से पहचाना जाता है: (स्थानीय-आईपी, स्थानीय-पोर्ट, रिमोट-आईपी, रिमोट-पोर्ट, प्रोटोकॉल)। यदि टपल में कोई तत्व अलग है, तो यह पूरी तरह से स्वतंत्र कनेक्शन है।
3.) जब कोई क्लाइंट किसी सर्वर से जुड़ता है, तो यह एक यादृच्छिक, अप्रयुक्त उच्च-क्रम स्रोत पोर्ट चुनता है । इस तरह, एक ही क्लाइंट के पास एक ही डेस्टिनेशन पोर्ट के लिए सर्वर में ~ 64 k कनेक्शन हो सकते हैं।
जब ग्राहक किसी सर्वर से जुड़ता है, तो यह वास्तव में क्या होता है:
Local Computer | Remote Computer | Role
-----------------------------------------------------------
0.0.0.0:80 | <none> | LISTENING
127.0.0.1:80 | 10.1.2.3:<random_port> | ESTABLISHED
असल में होता क्या है
सबसे पहले, चलो कंप्यूटर पर क्या हो रहा है यह देखने के लिए netstat का उपयोग करें। हम 80 के बजाय पोर्ट 500 का उपयोग करेंगे (क्योंकि सामान का एक पूरा गुच्छा पोर्ट 80 पर हो रहा है क्योंकि यह एक सामान्य पोर्ट है, लेकिन कार्यात्मक रूप से इससे कोई फर्क नहीं पड़ता है)।
netstat -atnp | grep -i ":500 "
जैसा कि अपेक्षित था, आउटपुट रिक्त है। अब एक वेब सर्वर शुरू करते हैं:
sudo python3 -m http.server 500
अब, यहां फिर से नेटस्टैट चलाने का आउटपुट है:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:500 0.0.0.0:* LISTEN -
तो अब एक प्रक्रिया है जो सक्रिय रूप से सुन रही है (राज्य: लिस्टेन) पोर्ट 500 पर। स्थानीय पता 0.0.0.0 है, जो "सभी आईपी पते के लिए सुनने" के लिए कोड है। एक आसान गलती केवल पोर्ट 127.0.0.1 पर सुनना है, जो केवल वर्तमान कंप्यूटर से कनेक्शन स्वीकार करेगा। तो यह एक कनेक्शन नहीं है, इसका मतलब यह है कि आईपी को पोर्ट करने के लिए बाइंड () करने के लिए अनुरोध की गई प्रक्रिया, और यह प्रक्रिया उस पोर्ट के सभी कनेक्शनों को संभालने के लिए जिम्मेदार है। यह सीमा तक संकेत देता है कि पोर्ट पर सुनने वाले कंप्यूटर पर केवल एक ही प्रक्रिया हो सकती है (मल्टीप्लेक्सिंग का उपयोग करते हुए चारों ओर पाने के तरीके हैं, लेकिन यह बहुत अधिक जटिल विषय है)। यदि कोई वेब-सर्वर पोर्ट 80 पर सुन रहा है, तो वह उस पोर्ट को अन्य वेब-सर्वर के साथ साझा नहीं कर सकता है।
तो अब, एक उपयोगकर्ता को हमारी मशीन से कनेक्ट करते हैं:
quicknet -m tcp -t localhost:500 -p Test payload.
यह एक साधारण स्क्रिप्ट ( https://github.com/grokit/quickweb ) है जो एक टीसीपी सॉकेट खोलता है, पेलोड भेजता है (इस मामले में "टेस्ट पेलोड"), कुछ सेकंड इंतजार करता है और डिस्कनेक्ट करता है। नेटस्टैट को फिर से करते हुए यह हो रहा है निम्नलिखित प्रदर्शित करता है:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:500 0.0.0.0:* LISTEN -
tcp 0 0 192.168.1.10:500 192.168.1.13:54240 ESTABLISHED -
यदि आप किसी अन्य ग्राहक के साथ जुड़ते हैं और फिर से नेटस्टैट करते हैं, तो आप निम्नलिखित देखेंगे:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:500 0.0.0.0:* LISTEN -
tcp 0 0 192.168.1.10:500 192.168.1.13:26813 ESTABLISHED -
... अर्थात्, क्लाइंट ने कनेक्शन के लिए एक और यादृच्छिक पोर्ट का उपयोग किया। इसलिए आईपी पतों के बीच कभी भ्रम नहीं होता है।