क्या प्रति होस्ट के लिए TCP स्रोत पोर्ट अद्वितीय होना चाहिए?


10

मैंने सीखा है कि टीसीपी कनेक्शन की पहचान टपल (स्रोत आईपी, स्रोत पोर्ट, गंतव्य आईपी, गंतव्य पोर्ट) द्वारा की जाती है। सैद्धांतिक रूप से, इस प्रकार host1 से एक क्लाइंट होना संभव है: port1 server1 से कनेक्ट करें: port1 और उसी समय host1 से एक अन्य क्लाइंट (host1 पर चल रहा है): port1 से server2: port1।

मैंने जावा में थोड़ा परीक्षण किया है, और अब तक यह संभव है।

हालाँकि, मैंने कई बार पढ़ा है कि स्रोत पोर्ट को होस्ट पते के लिए अद्वितीय होना चाहिए, जिसका मूल रूप से यह अर्थ होगा कि अधिकतम 65536 समवर्ती आउटगोइंग टीसीपी कनेक्शन की एक कठिन सीमा है। क्या यह सच है?

अपडेट: यहां मेरा जावा कोड है। यह काम करने लगता है, और netstat -t स्पष्ट रूप से पोर्ट 9990 (एक से 9997, एक से 9998 तक) से दो सक्रिय, आउटगोइंग कनेक्शन दिखाता है । कम से कम एक आधुनिक लिनक्स पर, यह संभव प्रतीत होता है?

Socket s1 = new Socket();
s1.setReuseAddress(true);
SocketAddress saremote = new InetSocketAddress("localhost",9999);
SocketAddress salocal = new InetSocketAddress("localhost",9990);
s1.bind(salocal);
s1.connect(saremote);


Socket s2 = new Socket();
s2.setReuseAddress(true);
SocketAddress saremote2 = new InetSocketAddress("localhost",9998);
SocketAddress salocal2 = new InetSocketAddress("localhost",9990);
s2.bind(salocal2);
s2.connect(saremote2);

और netstat -t आउटपुट (छोटा):

tcp6       0      0 localhost:9990          localhost:9998          CONNECTED 
tcp6       0      0 localhost:9990          localhost:9999          CONNECTED 

"यदि आप अच्छी तरह से डिज़ाइन किए गए सिस्टम की ऊपरी सीमाओं के बारे में पूछ रहे हैं, तो आप निश्चित रूप से इसे गलत कर रहे हैं "
क्रिस एस

जवाबों:


16

यह टीसीपी की आवश्यकता नहीं है। जहां तक ​​टीसीपी का सवाल है, केवल सोर्स आईपी, सोर्स पोर्ट, डेस्टिनेशन आईपी और डेस्टिनेशन पोर्ट का कॉम्बिनेशन यूनिक होना चाहिए। हालाँकि, व्यवहार में अधिकांश टीसीपी एपीआई एक ही स्रोत पोर्ट के साथ एक से अधिक कनेक्शन बनाने का कोई तरीका प्रदान नहीं करते हैं, जब तक कि उनके पास अलग-अलग स्रोत आईपी पते न हों।


2
धन्यवाद, कि मेरे सवाल का सैद्धांतिक हिस्सा पूरी तरह से जवाब देता है! मुझे बस हर टीसीपी कार्यान्वयन के लिए प्रयास करना होगा, मुझे लगता है।
बजे

5

व्यवहार में यह अधिकतम है कि यह आमतौर पर कम है। उदाहरण के लिए, लिनक्स net.ipv4.ip_local_portकर्नेल पैरामीटर का उपयोग आउटबाउंड कनेक्शन के लिए उपयोग किए जाने वाले पोर्ट को परिभाषित करने के लिए करता है। यह आमतौर पर कुछ ऐसा है

sysctl net.ipv4.ip_local_port_range 32768 to 61000

आप sysctl उदा के साथ उपलब्ध संख्या बढ़ा सकते हैं

sysctl -w net.ipv4.ip_local_port_range="10000 64000"

या आप एक ही जानकारी के साथ /etc/sysctl.conf को संपादित कर सकते हैं

net.ipv4.ip_local_port_range = 10000 65535

मेरे द्वारा पाए गए सभी उदाहरणों का न्यूनतम मान 1024 भी है।


1

इयान के जवाब (ऊपर) के अलावा, कि आपके कर्नेल द्वारा आउटगोइंग कनेक्शन के लिए केवल 10,000 पोर्ट की अनुमति हो सकती है, सिद्धांत रूप में आपके कम से कम एक्सपी के एक सेट तक सीमित है, एडेप्टर पर आईपी पते के प्रति XXX पोर्ट। चूंकि 127.1 बाहरी नेटवर्क पर उपलब्ध नहीं है, स्थानीय नेटवर्क पर है, तो एक दूसरे के आईपी पते ( बाहरी ) के लिए आपके पास 65K पोर्ट रेंज के भीतर आउटगोइंग पोर्ट्स का एक सेट है।

तो निवर्तमान सीमा वास्तव में है:

  With 1 IP Address: XX,XXX (or 2 x XX,XXX on internal network)
  With 2 IP addresses: 2 x XX,XXX (or 3 x XX,XXX on internal network)
  With 3 IP addresses: 3 x XX,XXX (or 4 x XX,XXX on internal network)
  etc.

यह काम करने के लिए, आपको इस थ्रेड का उत्तर पढ़ने की आवश्यकता होगी ।


0

हाँ। यह सच है।

पोर्ट्स बाइंड करने वाले होते हैं और नेटवर्क वाले ऐप्स।

आपके पास टीसीपी द्वारा जुड़ा 65553 से अधिक आवेदन नहीं हो सकता है और उसी मेजबान पर यूडीपी द्वारा 65535 कनेक्ट होता है। ऑपरेटिंग सिस्टम टिपिकल डाइनैमिकली पोर्ट्स को नेटवर्क से कनेक्ट होने वाले प्रत्येक ऐप के लिए एक असाइन करने में कामयाब रहे।

अगर आपके पास नेटवर्क पोर्ट पैकेज आने पर एक ही पोर्ट पर दो एप्लिकेशन लिस्ट होती हैं, तो कंप्यूटर को पता नहीं चल पाता कि ऐप किस डेटा को डिलीवर करने वाला है। उदाहरण के रूप में यदि आपके पास मैसेंजर और स्काइप समान पोर्ट पर एक ही बाइंड किया गया है तो आपका मैसेंजर संदेश स्काइप में दिखाई देगा और इसके विपरीत :)


मुझे लगता है कि सवाल सुनने वाले अनुप्रयोगों की संख्या पर ऊपरी सीमा के बारे में नहीं था - जो, जैसा कि आप बताते हैं, अद्वितीय पोर्ट संख्याओं की संख्या तक सीमित है - लेकिन एक समय में संचालित सॉकेट की संख्या के बारे में। वेब सर्वर में अक्सर दर्जनों सॉकेट्स होते हैं, जिन्हें उनके सिंगल पोर्ट 80 या 443 पर संबोधित किया जाता है। यदि किसी होस्ट के कई सर्वरों ने ऐसा किया है, तो कोई कारण नहीं है कि ओपन सॉकेट्स की संख्या 2 ^ 32 से अधिक नहीं हो सकती है।
ब्रैंडन रोड्स

0

हालाँकि एक सिस्टम में खुले टीसीपी कनेक्शनों की संख्या की सीमा हो सकती है, लेकिन इसमें आमतौर पर उपयोग किए गए पोर्ट नंबरों के बारे में कोई प्रतिबंध नहीं है। हालाँकि, एक अच्छा टीसीपी कार्यान्वयन दो बार सॉकेट की एक ही जोड़ी का उपयोग करने से रोकना चाहिए। (सॉकेट = आईपी एड्रेस + पोर्ट)। एक पोर्ट हालांकि चोरी करने वाले कनेक्शन को रोकने के लिए एक प्रक्रिया को सौंपा गया है, और सामान्य तरीका यह है कि एक सुनने वाले पोर्ट के लिए या एक आउटगोइंग के लिए एक मुफ्त पोर्ट का अनुरोध किया जाए। यह डुप्लिकेट आउटगोइंग सॉकेट को रोकता है और इसलिए डुप्लिकेट कनेक्शन। उस पद्धति का उपयोग करने में विफल होने पर, एप्लिकेशन को डुप्लिकेट कनेक्शन बनाने से रोकना होगा।


3
यह इस पुराने प्रश्न पर पहले से पोस्ट किए गए उत्तरों को कुछ नया कैसे जोड़ता है ??
क्रिस एस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.