2010-09-07 20 views
12

सर्वर सॉकेट वास्तव में कैसे काम करता है? जब मैं जावा सर्वर सॉकेट बनाता हूं और पोर्ट 1234 पर कनेक्शन स्वीकार करता हूं। क्या सर्वर वास्तव में सभी क्लाइंट्स के लिए पोर्ट 1234 का उपयोग करता है? मैंने पढ़ा है कि जब आप नेटवर्क सर्वर लिखते हैं तो सॉकेट वास्तव में कनेक्शन स्वीकार होने के बाद एक और बंदरगाह खोलता है।सर्वर सॉकेट वास्तव में कैसे काम करता है?

क्या यह सच है? यदि हां, तो मैं इसे नेटस्टैट में क्यों नहीं देख रहा हूं? मुझे इस तरह के कई कनेक्शन देख रहे हैं जैसे

tcp  0  0 ::ffff:MY_IP:1234 ::ffff:97.37.134.95:39236 ESTABLISHED 
tcp  0  0 ::ffff:MY_IP:1234 ::ffff:89.204.153.101:26117 ESTABLISHED 
tcp  0  0 ::ffff:MY_IP:1234 ::ffff:195.240.16.70:26193 ESTABLISHED 
tcp  0  0 ::ffff:MY_IP:1234 ::ffff:80.187.98.116:15012 ESTABLISHED 
tcp  0  0 ::ffff:MY_IP:1234 ::ffff:218.78.248.190:30794 ESTABLISHED 

तो क्या वे वास्तव में 1234 पर मेरे सर्वर से जुड़े हुए हैं? यदि ऐसा है, तो इसका मतलब यह नहीं है कि सर्वर असीमित कनेक्शन स्वीकार कर पाएगा?

उत्तर

1

हाँ, सर्वर एकल बंदरगाह पर किसी भी कनेक्शन को स्वीकार कर सकता है। सर्वर और क्लाइंट सॉकेट के बीच यह अंतर है, क्लाइंट सॉकेट में प्रति पोर्ट केवल एक कनेक्शन हो सकता है।

+0

तो तर्क के अनुसार, एक सर्वर बंदरगाह सेवारत ग्राहकों से कभी नहीं चलेगा? – erotsppa

+0

@erotsppa मशीनों के काम में कुछ भी अनंत नहीं है। मुझे यकीन नहीं है कि मैं सही संख्या बता सकता हूं लेकिन यह बहुत बड़ा है। (पूर्णांक (~ 2e9) शायद) – Andrey

+0

2e9 लगभग 512 है, आइए 2^16 (65536) तक कुछ आरक्षित मूल्य कम करें, और आप सच के करीब आ जाएंगे। – kriss

3

तो क्या वे वास्तव में सभी सर्वर से 1234 पर जुड़े हुए हैं?

हाँ

यदि हां, तो इसका मतलब यह नहीं है कि आप सर्वर कनेक्शन के अनंत संख्या स्वीकार करने में सक्षम हो जाएगा?

आप हो सकता है 2^32-2-1 (IP4) पते, और 2^16 दूरस्थ सॉकेट बंदरगाहों (एक ही नेटवर्क पर एक और मेजबान है करने के लिए स्वतंत्र छोड़ दें)। यह बहुत है, लेकिन अनंत नहीं है। वैसे भी आप पहले स्मृति से बाहर हो जाएगा।

2

हां, आप मूल रूप से सही हैं।

सर्वर कुछ बंदरगाह (जिसे आपने सेट किया है) पर सुन रहा है लेकिन जब आप कनेक्शन स्वीकार करते हैं तो यह एक नया कनेक्टेड सॉकेट नंबर विशेषता देगा।

यदि आपको नेटस्टैट का उपयोग करके कनेक्ट किए गए सॉकेट नहीं दिखते हैं, तो शायद यह इसलिए है क्योंकि आप इसे सही विकल्पों के साथ नहीं कहते हैं। आपके पास सर्वर पोर्ट पर एक लिस्टेन कनेक्शन होना चाहिए, और प्रत्येक सक्रिय रिमोट कनेक्शन के लिए आवंटित स्थानीय पोर्ट के साथ एक स्थापित कनेक्शन होना चाहिए। आप समय WAIT राज्य के साथ समाप्त कनेक्शन (खराब समाप्त) के कुछ अवशेष भी प्राप्त कर सकते हैं।

नीचे अपने सिस्टम वर्तमान स्थिति (लिनक्स पर netstat -anlp साथ मिल गया)

tcp  0  0 0.0.0.0:3389   0.0.0.0:*    LISTEN  27002/rdpproxy 
tcp  0  0 10.10.4.185:3389  10.10.4.13:36725  ESTABLISHED 27233/rdpproxy 

सर्वर, 10.10.4.185 है से कुछ निकालने और बंदरगाह 3389 किसी भी दूरदराज के आईपी और दूरदराज के पोर्ट पर ध्यान दे रहा है करने के लिए अनुमति दी है जुडिये।

दूसरी पंक्ति एक कनेक्टेड सत्र दिखाती है। रिमोट पता 10.10.4.13 है और इस पते के लिए पोर्ट 36725 आरक्षित है। इसलिए आप 10.10.4.185 (हजारों के दसवें) से बहुत से कनेक्शन खोल सकते हैं और फिर भी अन्य प्रणालियों से अधिक।

और, नहीं, इसका मतलब यह नहीं है कि आपका सर्वर असीमित कनेक्शन स्वीकार कर पाएगा, आपका सिस्टम संसाधनों से बाहर जा सकता है और उस सीमा से पहले नए कनेक्शन खोलने में विफल रहेगा।

+0

वैसे ही यह है कि अन्य लोग क्या कह रहे हैं, जब आप एक नया कनेक्शन स्वीकार करते हैं तो आप स्थानीय बंदरगाहों का कोई उपभोग नहीं करते हैं। – erotsppa

+0

@erotspaa: आप * उच्च श्रेणी से अतिरिक्त स्थानीय बंदरगाह का उपभोग करते हैं। सर्वर पोर्ट आमतौर पर निम्न श्रेणी (प्रसिद्ध बंदरगाहों) से सुरक्षित है और आरक्षित है। – kriss

+0

@erotspaa: लेकिन यह एक बड़ी सीमा नहीं है, क्योंकि ये बंदरगाह प्रत्येक आईपी के लिए उपलब्ध हैं। सर्वर पोर्ट्स के साथ समस्या यह है कि वे किसी भी आईपी या आईपी के कुछ प्रतिबंधित सेट से बंधे हैं। इसलिए आप बहुत तेज भूखे रहेंगे। – kriss

3

टीसीपी/आईपी सॉकेट विशिष्ट रूप से टुपल (स्थानीय पता, स्थानीय बंदरगाह, रिमोट पता, रिमोट पोर्ट) द्वारा पहचाने जाते हैं।

यह बहुत बड़ी संख्या में सॉकेट प्रदान करेगा, लेकिन अनंत नहीं।

+0

क्या इसका मतलब है कि किसी सर्वर को बंदरगाहों से बाहर निकलने की चिंता करने की आवश्यकता नहीं होगी? मैं हमेशा इस धारणा के तहत था कि यदि आपके पास 65535 से अधिक कनेक्शन हैं तो एक सर्वर बंदरगाह से बाहर हो जाएगा। – erotsppa

+1

यह जटिल है। तकनीकी रूप से सीमा एक ही सहकर्मी पते के साथ केवल 65535 कनेक्शन है, लेकिन कई टीसीपी/आईपी स्टैक्स स्थानीय बंदरगाहों को सॉकेट बाइंड समय पर अद्वितीय रखकर निराशाजनक रूप से संघर्ष को रोकते हैं। आप जोखिम की एक छोटी राशि के साथ, REUSEADDR सॉकेट विकल्प के साथ इसे अक्षम कर सकते हैं। – Darron

0

यह अनंत नहीं है। एक सीमा है यूनिक्स आधारित ऑपरेटिंग सिस्टम पर, ulimit कमांड आपको एक "प्रक्रिया" की अधिकतम संख्या बताएगा जो एक प्रक्रिया हो सकती है और आपको इसे बदलने की अनुमति भी देगी। यदि आप इस सीमा को पार करते हैं, तो आप "बहुत सारी खुली फाइलों" से संबंधित IOExceptions को देखना शुरू कर देंगे।

संबंधित मुद्दे