2011-04-08 9 views
15

मैं जावा में एक पी 2 पी फाइल शेयरिंग प्रोटो/सॉफ्टवेयर करने की कोशिश कर रहा हूं। मुझे सॉकेट का उपयोग करके सीखने में दिलचस्पी है, नहीं, मैं जेXTए या किसी भी प्रकार की एपीआई का उपयोग नहीं करूंगा।बिट्सोरेंट और ग्नुटेला फ़ाइलों को स्थानांतरित करते समय एनएटी को बाईपास करने के लिए क्या उपयोग करता है?

मैं टीसीपी छेद पंचिंग के बारे में पढ़ा है, और यह सब नेट प्रकार पर काम न करें। लेकिन मैं देख सकता हूं कि ग्नुटेला और बिटटोरेंट हमेशा कोशिश की जाने वाली प्रत्येक मशीन/एनएटी पर काम करता है। तो क्या वे होस्ट के बीच कनेक्शन शुरू करने के लिए टीसीपी होल पंचिंग का उपयोग करते हैं?

इसके अलावा, इस तरह एक कोड टीसीपी होल छिद्रण करना होगा?

final ServerSocket s = new ServerSocket(7777); 
    Thread t = new Thread(new Runnable(){ 

     public void run() { 
      try 
      { 
       s.accept(); 
      } 
      catch(Exception ex) 
      { 

      } 
     } 
    }); 

    Socket sock = new Socket(); 
    sock.connect(new InetSocketAddress("IP ADDRESS", 7777), 50000); 
+2

बहुत ही रोचक सवाल (+1) –

उत्तर

1

मेरे शोध के बाद मैंने पाया कि टीसीपी एनएटी और टीसीपी होल पंचिंग को छोड़ने के लिए अच्छा नहीं है 100% sucesfull तकनीक नहीं है।

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

जावा के लिए यूडीटी जैसे कुछ एपीआई भी हैं। लेकिन मैंने इसे अभी तक कोशिश नहीं की http://sourceforge.net/projects/udt-java/

+2

आपका उत्तर आपके प्रश्न के साथ नहीं जाता है! – onmyway133

3

मुझे लगता है कि Universal Plug and Play (UPnP) एक प्रोटोकॉल है कि आप प्रोग्राम के रूटर में बंदरगाह अग्रेषण सेट करने के लिए सक्षम बनाता है। मुझे यकीन नहीं है कि यह एकमात्र तरीका है कि वे प्रोग्राम उपयोग करते हैं।

एक जावा कार्यान्वयन के लिए UPnP PortMapper project पर एक नजर डालें।

यह कोडप्रोजेक्ट आलेख भी अच्छा दिखता है, हालांकि यह जावा नहीं है: Using UPnP for Programmatic Port Forwardings and NAT Traversal

+0

मुझे यह नहीं मिला ... यह यूपीएनपी एनएटी राउटर में पोर्ट अग्रेषण नियम बना रहा है? लेकिन मैं ऐसा नहीं करना चाहता, मैं टीसीपी होल पंचिंग या अन्य तकनीक की तरह कनेक्ट करना चाहता हूं, जैसे बिट्टोरेंट, ग्नुटेला, करता है ... मैंने ऊपर दिए गए कोड को भी काम नहीं किया – fredcrs

+0

@fredcrs - मुझे टीसीपी छेद के बारे में कुछ नहीं पता पंचिंग।मुझे पता है कि μTorrent और Azureus दोनों नए आईपी पते से आने वाले कनेक्शन की अनुमति देने के लिए यूपीएनपी का उपयोग कर सकते हैं (हालांकि हो सकता है कि वे कुछ मामलों में टीसीपी छेद पंचिंग का भी उपयोग करें)। – Justin

+0

मैंने पता लगाया कि अधिकांश राउटर (कम से कम मेरे देश में) – fredcrs

2

आपको पहले विकिपीडिया पर NAT traversal पढ़ना चाहिए था।

हालांकि, वास्तव में, मुख्य रूप से उपयोग किए जाने वाले तरीके यूपीएनपी, स्टन, टर्न, साथ ही साथ आईसीई भी हैं जो स्टन और टर्न का संयोजन है।

चूंकि टीसीपी एक कनेक्शन उन्मुख प्रोटोकॉल है, इसलिए एनएटी प्रत्येक कनेक्शन के लिए इसे नियंत्रित कर सकता है, और कनेक्शन खत्म होने पर सभी पैकेट ड्रॉप कर सकता है।
लेकिन यूडीपी कनेक्शन रहित है, और प्रतिक्रिया अलग-अलग बंदरगाह या अलग-अलग पते (आपके मूल गंतव्य की तुलना में) से आ सकती है। इसके अलावा, यूडीपी संदेश के लिए कोई सटीक टाइमआउट नहीं है। इसलिए आम तौर पर एनएटी पर यूडीपी के लिए कम सीमाएं मौजूद हैं।
नतीजतन, इन पी 2 पी औजार के कई यूडीपी या UDP आधारित प्रोटोकॉल के कुछ प्रकार, microTP, RUDP, UDT, या यहाँ तक SCTP UDP पर की तरह (WebRTC यह पर आधारित है) का उपयोग कर रहे हैं।

आप एनएटी ट्रैवर्सल, आरएफसी, और बीईपी (बिटटोरेंट दस्तावेज़) के बारे में लेखों से भी सीख सकते हैं।

संपादित करें: वहाँ भी एक और दिलचस्प तरीका है - ICMP ट्रेवर्सल। असल में आईसीएमपी (विशेष रूप से टीटीएल एक्सीडिंग संदेश) में एनएटी पर यूडीपी की तुलना में भी कम सीमाएं हैं, क्योंकि त्रुटि संदेश इंटरनेट के हर कोने से भेजा जा सकता है, और एनएटी के साथ राउटर को पता नहीं हो सकता है कि ये संदेश सत्य नहीं हैं। हालांकि, आईसीएमपी पैकेट भेजने के लिए यूनिक्स जैसी प्रणालियों पर रूट की अनुमति और विंडोज़ पर व्यवस्थापक की अनुमति की आवश्यकता होती है।

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

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