2009-10-08 12 views
31

मैं पी 2 पी एप्लिकेशन जो पोर्ट 30000 पर काम करता है, डिज़ाइन कर रहा हूं। मेरा राउटर UPnP नहीं है इसलिए मुझे एक पोर्ट को राउटर में अग्रेषित करने की आवश्यकता है। लेकिन स्काइप एक और पी 2 पी एप्लीकेशन मेरे पीसी पर पोर्ट अग्रेषण के बिना काम करता है। जब मैंने इसे वायरशर्क के साथ विश्लेषण किया तो मैंने इसे यूडीपी पोर्ट 48 9 80, 58544 का उपयोग किया। मैं सी ++ का उपयोग कर रहा हूं।स्काइप बंदरगाह अग्रेषण के बिना कैसे काम करता है?

पाइथन here में एक लाइब्रेरी है जो नेट पीएनपी राउटर के लिए करता है। राउटर और ऑपरेटिंग सिस्टम के बावजूद राउटर पर पोर्टेट को प्रोग्रामेटिक रूप से आगे करना संभव है? सी ++ या किसी अन्य भाषा में ऐसा करने का दृष्टिकोण क्या होना चाहिए।

उत्तर

20

स्काइप एक बहुत ही रोचक तरीके से काम करता है। से मैं क्या पढ़ा है (और यह कुछ समय पहले है) यह काम करता है इस प्रकार है:

  • स्काइप सर्वर सभी उपयोगकर्ताओं तथा IP की एक सूची रखता।
  • स्काइप उपयोगकर्ता ए उपयोगकर्ता बी स्काइप उपयोगकर्ता से बात करना चाहता है ए उपयोगकर्ता बी के आईपी पते पर पर नेटवर्क पैकेट भेजता है और प्रतिक्रिया की प्रतीक्षा करता है। (उपयोगकर्ता बी को यह पैकेट कभी नहीं मिलता है)।
  • स्काइप प्रयोक्ता एक सूचित करता आईपी/पोर्ट संयोजन जिस पर यह एक प्रतिक्रिया के लिए प्रतीक्षा कर रहा है के सर्वर
  • सर्वर उपयोगकर्ता बी सूचित करता है एक निर्दिष्ट पोर्ट एक कनेक्शन हो जाने पर पर
  • उपयोगकर्ता एक के जवाब भेजने के लिए ।

यह शायद सरलीकृत हो गया है लेकिन आखिरी बार मैंने जांच की है, इस तरह यह काम करता है। (अगर मैं गलत हूं तो कोई मुझे सही करेगा)।

+0

लेकिन सवाल यह है कि ग्राहक के आईपी सार्वजनिक हैं? उदाहरण के लिए देखें बी को संवाद करने की आवश्यकता है और सर्वर बी के आईपी को जानता है लेकिन यह किस आईपी का उपयोग करता है? अगर ऐसा कोई मामला है तो आप किसी भी आईपी को पिंग कर सकते हैं? क्षमा करें अगर यह बेवकूफ –

+4

है, तो यह उत्तर केवल बी का वर्णन करता है और बी को संचार करने में विफल रहता है और सर्वर बी को सही आईपी/पोर्ट संयोजन भेजता है। इसमें मुख्य बिंदु गुम है, जिसे छेद पंचिंग कहा जाता है और यह लिंक में बहुत अच्छी तरह वर्णित है @MartinBeckett द्वारा प्रदान की गई। मैं बस इतना जोड़ूंगा कि राउटर और ऑपरेटिंग सिस्टम के प्रकार को अनजाने में पोर्ट को अग्रेषित करना भी संभव है, बशर्ते राउटर यूपीएनपी का समर्थन करता हो। – Igor

+1

@rein तो सममित एनएटी के बारे में क्या? – onmyway133

18

UDP hole punching (ए) एनएटी के माध्यम से कैसे मार्गांतरित करने के तरीके हैं।

+0

मैं रूटर और नेट के बीच अंतर को समझने में सक्षम नहीं हूँ? क्या हम पोर्ट को राउटर या एनएटी के लिए आगे बढ़ाते हैं? जब हम अलग-अलग बंदरगाह पर काम करते हैं तो दोनों पक्षों से डेटा भेजने के बराबर छेद छिद्रण नहीं होता है। धन्यवाद – Xinus

+1

एक राउटर मार्ग एक नेटवर्क से दूसरी नेटवर्क की जानकारी। एनएटी आंतरिक नेटवर्क पर एक निजी पता सीमा रखने की प्रक्रिया है और केवल राउटर के पास अन्य नेटवर्क पर एक वैध पता है। राउटर एक भौतिक उपकरण है, एनएटी ऐसा कुछ है जो आप करते हैं। – rein

3

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

0

डायरेक्ट कनेक्शन संभव नहीं होने पर स्काइप मध्यवर्ती बिंदु के रूप में अन्य सहकर्मियों का उपयोग करता है।

यानी पीयर ए पीयर बी से कनेक्ट करना चाहता है, लेकिन सहकर्मी बी में सभी बंदरगाह बंद हैं, फिर सहकर्मी सी के माध्यम से संचार शुरू किया जाता है जिसमें खुले बंदरगाह होते हैं।

0

में बहुत अच्छी तरह से वर्णित पी 2 पी अनुप्रयोगों को लागू करने के लिए और उन्हें नेट रूटर के पीछे काम करने के लिए प्राप्त करने में कुछ अनुभव है।

स्काइप एनएटी राउटर के पीछे काम करने के लिए यूडीपी छेद पंचिंग का उपयोग करता है। मैंने एक लेख लिखा है और अन्य लोगों को समान अनुप्रयोगों को लागू करने में मदद करने के लिए डेमो वीडियो बनाया है। उपयोगी पुस्तकालयों के लिंक भी प्रदान किए गए हैं जो यहां अधिकांश भूमि कार्य जैसे libutp, करते हैं।

>>> UDP hole punching Demo video and useful Libs.