क्या टीसीपी पोर्ट 0 से कनेक्ट करना संभव है?


59

टीसीपी पोर्ट 0 को सुनकर मुझे सिस्टम पर एक मुफ्त पोर्ट नंबर आवंटित होता है।

लेकिन क्या होता है जब मैं टीसीपी पोर्ट 0 से कनेक्ट करने की कोशिश करता हूं ? स्पष्ट उत्तर है: "यह काम नहीं करता है":

$ nc localhost 0                 
nc: port number too small: 0

व्यवस्था में यह कहां से संभाला जाता है? OS कर्नेल के TCP स्टैक में? क्या यूनिक्स हैं जहां टीसीपी पोर्ट 0 से जुड़ने से काम चलेगा?


2
सिद्धांत रूप में आप एक कस्टम टीसीपी स्टैक का निर्माण कर सकते हैं जिसमें पोर्ट 0 वर्क्स से सुनने या कनेक्ट करने का मतलब है, जिसका अर्थ है कि दो ऐसे कार्यान्वयन पोर्ट 0. पर एक दूसरे से बात कर सकते हैं
जोशुआ

जवाबों:


60

बस यह सुनिश्चित करने के लिए कि हम एक ही पृष्ठ पर हैं (आपका प्रश्न इस तरह अस्पष्ट है), पोर्ट 0 पर टीसीपी को बांधने के लिए पूछना एक अप्रयुक्त पोर्ट नंबर को गतिशील रूप से उत्पन्न करने के अनुरोध को इंगित करता है। दूसरे शब्दों में, उस अनुरोध के बाद आप जिस पोर्ट नंबर पर वास्तव में सुन रहे हैं, वह शून्य नहीं है। इस में के बारे में एक टिप्पणी है [linux kernel source]/net/ipv4/inet_connection_sock.cपर inet_csk_get_port():

/* Obtain a reference to a local port for the given sock,
 * if snum is zero it means select any available local port.
 */

जो एक मानक यूनिक्स सम्मेलन है। ऐसी प्रणालियां हो सकती हैं जो वास्तव में पोर्ट 0 का उपयोग करने की अनुमति देंगी, लेकिन यह एक बुरा अभ्यास माना जाएगा। हालाँकि यह व्यवहार आधिकारिक रूप से POSIX, IANA या TCP प्रोटोकॉल द्वारा निर्दिष्ट नहीं है। 1 आपको यह दिलचस्प लग सकता है ।

इसलिए आप समझदारी से एक TCP कनेक्शन को शून्य पोर्ट नहीं कर सकते हैं। संभवतः इससे ncअवगत है और आपको सूचित करता है कि आप एक गैर-सनसनीखेज अनुरोध कर रहे हैं। यदि आप मूल कोड में यह कोशिश करते हैं:

int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = 0;
inet_aton("127.0.0.1", &addr.sin_addr);
if (connect(fd, (const struct sockaddr*)&addr, sizeof(addr)) == -1) {
    fprintf(stderr,"%s", strerror(errno));
}    

आपको वही त्रुटि मिलती है जिसे आप किसी अन्य अनुपलब्ध पोर्ट से कनेक्ट करने का प्रयास करेंगे: ECONNREFUSED"कनेक्शन ने इनकार कर दिया"। तो जवाब में:

व्यवस्था में यह कहां से संभाला जाता है? OS कर्नेल के TCP स्टैक में?

शायद ऩही; इसके लिए विशेष हैंडलिंग की आवश्यकता नहीं है। यानी, यदि आप एक सिस्टम पा सकते हैं जो पोर्ट 0 पर बाध्यकारी और सुनने की अनुमति देता है, तो आप संभवतः इसे कनेक्ट कर सकते हैं।


1. लेकिन IANA इसे "आरक्षित" ( यहां देखें ) के रूप में संदर्भित करता है । मतलब, इस पोर्ट का उपयोग ऑनलाइन नहीं किया जाना चाहिए । यह गतिशील असाइनमेंट सम्मेलन के संबंध में ठीक है (क्योंकि यह वास्तव में उपयोग नहीं किया जाएगा)। एक उद्देश्य के रूप में विशेष रूप से निर्धारित करना, शायद IANA के दायरे से परे होगा; संक्षेप में ऑपरेटिंग सिस्टम ऐसा करने के लिए स्वतंत्र हैं जो वे इसके साथ चाहते हैं, जिसमें कुछ भी नहीं है।


यह IPv4 में पते 0.0.0.0 के समान ही लगता है। एक आरक्षित मूल्य, और एक विशेष उद्देश्य के लिए ओएस और कार्यक्रमों द्वारा उपयोग किया जाता है। एक सादृश्य के रूप में, रेडियो में आरक्षित आवृत्तियों होते हैं जो कोई भी प्रसारण के लिए उपयोग नहीं करता है, लेकिन आंतरिक रूप से उपकरणों में उपयोग किया जाता है।
ctrl-alt-delor

1
@richard नहीं, 0.0.0.0 का एक अलग अर्थ है;) यह एक अमान्य, अज्ञात या गैर-लागू लक्ष्य या "प्रसारण" के रूप में नामित करने के लिए उपयोग किया जाता है
एंड्रियासी

2
@AndreaCi का प्रसारण 255.255.255.255 में नहीं हुआ था?
शाफ़्ट सनकी

4
@ratchetfreak 255.255.255.255 प्रसारित होता है। संदर्भ के आधार पर 0.0.0.0 के दो अर्थ हैं। प्रोग्रामिंग में यह पर्यायवाची w / है INADDR_ANY, जो कि रिकर्ड का उल्लेख है (सिस्टम इसे डिफ़ॉल्ट रूप से बदल देगा)। लेकिन वास्तव में एक नेटवर्क पर पते का उपयोग करने से लगता है कि एंड्रिया का उल्लेख है (इतना स्पष्ट नहीं है कि यह "प्रसारण" के रूप में गिना जाता है): en.wikipedia.org/wiki/0.0.0.0
Goldilocks


5

पोर्ट 0 का उपयोग ऑपरेटिंग सिस्टम को खोजता है और अगले उपलब्ध पोर्ट को आवंटित करता है। यह आपको एक विशिष्ट पोर्ट को हार्ड कोड करने या उपलब्ध पोर्ट की खोज करने से बचाती है। मेरा मिंट लिनक्स सिस्टम देता है

nc: port range not valid

सेवा

nc localhost 0 

2

nc -l 0पोर्ट 0 पर सुनने के लिए OS से पूछेगा। लेकिन जैसा कि ऊपर टिप्पणी की गई है, अधिकांश ऑपरेटिंग सिस्टम 0 देखेंगे और अपने आवेदन के लिए एक सकारात्मक-संख्या वाले पोर्ट को चुनने के लिए अपने विशेष रीति-रिवाजों को लागू करेंगे, इसलिए nc56514 जैसे कुछ पोर्ट पर सुनने पर हवाएं चलेंगी।


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