2010-02-25 9 views
185

हार्डवेयर से अनंत प्रदर्शन मानते हैं, क्या लिनक्स बॉक्स समर्थन> 65536 खुले टीसीपी कनेक्शन हो सकते हैं?सैद्धांतिक अधिकतम संख्या में खुले टीसीपी कनेक्शन क्या हैं जो आधुनिक लिनक्स बॉक्स में

मैं समझता हूं कि तात्कालिक बंदरगाहों की संख्या (< 65536) एक स्थानीय आईपी से एक रिमोट आईपी पर एक बंदरगाह से कनेक्शन की संख्या को सीमित करती है।

टुपल (स्थानीय आईपी, स्थानीय पोर्ट, रिमोट आईपी, रिमोट पोर्ट) विशिष्ट रूप से एक टीसीपी कनेक्शन को परिभाषित करता है; क्या यह दर्शाता है कि इनमें से एक से अधिक पैरामीटर मुक्त हैं तो 65K से अधिक कनेक्शन समर्थित किए जा सकते हैं। जैसे एकाधिक स्थानीय आईपी से एकाधिक रिमोट होस्ट पर एक पोर्ट नंबर से कनेक्शन।

क्या सिस्टम में कोई और 16 बिट सीमा है? शायद फाइल डिस्क्रिप्टर की संख्या?

उत्तर

267

एक एकल श्रवण बंदरगाह एक साथ एक से अधिक कनेक्शन स्वीकार कर सकता है।

एक '64 के' सीमा है जिसे अक्सर उद्धृत किया जाता है, लेकिन यह प्रति क्लाइंट प्रति सर्वर पोर्ट है, और स्पष्टीकरण की आवश्यकता है।

प्रत्येक टीसीपी/आईपी पैकेट मूल रूप से चार फ़ील्ड को संबोधित करने के लिए है; ये हैं:

source_ip source_port destination_ip destination_port 
< client   > < server      > 

अंदर टीसीपी ढेर, इन चार क्षेत्रों एक यौगिक कुंजी कनेक्शन (उदा फ़ाइल वर्णनकर्ता) के पैकेट अप मैच के लिए के रूप में इस्तेमाल कर रहे हैं।

यदि किसी ग्राहक के पास एक ही गंतव्य पर एक ही बंदरगाह के कई कनेक्शन हैं, तो उनमें से तीन फ़ील्ड समान होंगे - केवल source_port विभिन्न कनेक्शनों को अलग करने के लिए भिन्न होता है। बंदरगाह 16-बिट संख्याएं हैं, इसलिए किसी भी दिए गए क्लाइंट को दिए गए कनेक्शन की अधिकतम संख्या किसी भी होस्ट पोर्ट को 64K है।

हालांकि, कई क्लाइंट प्रत्येक सर्वर के बंदरगाह के लिए 64 के कनेक्शन तक हो सकते हैं, और यदि सर्वर के पास एकाधिक पोर्ट हैं या तो बहु-गृह हैं तो आप इसे और गुणा कर सकते हैं।

तो वास्तविक सीमा फाइल डिस्क्रिप्टर है। प्रत्येक व्यक्तिगत सॉकेट कनेक्शन को फ़ाइल डिस्क्रिप्टर दिया जाता है, इसलिए सीमा वास्तव में फ़ाइल डिस्क्रिप्टरों की संख्या है जिसे सिस्टम को कॉन्फ़िगर करने और संसाधनों को संभालने के लिए कॉन्फ़िगर किया गया है। अधिकतम सीमा आमतौर पर 300K से अधिक है, लेकिन कॉन्फ़िगर करने योग्य है उदा। sysctl के साथ।

सामान्य बक्से के लिए घमंड यथार्थवादी सीमाएं लगभग 80K हैं उदाहरण के लिए एकल थ्रेडेड जैबर मैसेजिंग सर्वर।

+1

यदि आप (ए) SO_REUSEADDR का उपयोग करते हैं और (बी) विभिन्न गंतव्य आईपी पते को लक्षित करते हैं तो आप सैद्धांतिक रूप से 64K से अधिक आउटगोइंग कनेक्शन कर सकते हैं। लेकिन कर्नेल मेमोरी सीमा शायद आपको पहले बंद कर देगी। – Darron

+0

@ डेरॉन मैंने सोचा था कि SO_REUSEADDR सर्वर को पुनरारंभ होने पर बाध्यकारी था? – Will

+0

हां, वह भी। यह मूल रूप से नए सॉकेट के लिए पते के संघर्ष के लिए शुरुआती चेक को आराम देता है। – Darron

13

यदि आप एक सर्वर चलाने की सोच रहे हैं और यह तय करने का प्रयास कर रहे हैं कि एक मशीन से कितने कनेक्शन परोसे जा सकते हैं, तो आप the C10k problem और कई ग्राहकों को एक साथ सेवा करने में शामिल संभावित समस्याओं को पढ़ना चाहेंगे।

+10

सी 10k 10 साल पुराना है और अब मजेदार नहीं है। [इसे पढ़ें] यह देखने के लिए कि C1024K कैसे निपटाया जा सकता है। – Chandranshu

+5

@Chandranshu - क्या पढ़ा? मुझे लगता है कि आप टिप्पणी में एक लिंक डालना चाहते थे ... – Krease

+0

टक्कर 11 और अधिक ... –

7

यदि आपने कच्चे सॉकेट (SOCK_RAW) का उपयोग किया है और उपयोगकर्तालैंड में टीसीपी को फिर से कार्यान्वित किया है, तो मुझे लगता है कि उत्तर केवल (local address, source port, destination address, destination port) tuples (~ 2^64 प्रति स्थानीय पता) की संख्या से सीमित है।

यह निश्चित रूप से उन सभी कनेक्शनों को बनाए रखने के लिए बहुत सारी मेमोरी लेगा, और मुझे लगता है कि कर्नेल टीसीपी स्टैक को &/या आपकी तरफ से प्रतिक्रिया देने से रोकने के लिए आपको कुछ iptables नियम स्थापित करना होगा ।