Programmazione dell’applicazione P2P

Sto scrivendo un programma p2p personalizzato che gira sulla porta 4900. In alcuni casi, quando la persona si trova dietro un router, questa porta non è accessibile da internet.

Esiste un modo automatico per abilitare l’accesso alla porta da internet. Non sono veramente sicuro di come funzionano le altre applicazioni p2p.

Qualcuno può per favore gettare un po ‘di luce su questo?

Connettività P2P in poche parole. Supponiamo che stiamo parlando di UDP qui. I passaggi seguenti possono anche essere applicati a TCP con alcune modifiche.

  1. Enumerare tutti gli indirizzi IP locali (di solito solo 1). Creare un socket UDP su un determinato numero di porta ** per ogni adattatore con un indirizzo IP.

  2. Per ciascun socket creato nel passaggio 1, contattare un server STUN o TURN con quello stesso socket per scoprire il proprio indirizzo IP esterno e scoprire quale mappa del numero di porta interna si trova all’esterno del NAT (non è sempre lo stesso valore di porta). Cioè, il tuo indirizzo locale 192.168.1.2:4900 potrebbe essere 128.11.12.13:8888 per il mondo esterno. E alcuni NAT non utilizzano sempre la stessa mapping delle porte quando si utilizza la stessa porta locale per altri indirizzi IP. TURN fornirà anche un “indirizzo relay”. È inoltre ansible utilizzare UPNP per ottenere un indirizzo mappato sulla porta direttamente dal router, se supporta tale protocollo.

  3. Tramite un servizio di rendez-vous (SIP, XMPP, messaggistica istantanea, servizio web, e-mail, tazze con stringhe), pubblica la tua lista di candidati ad un servizio o invia una notifica all’altro cliente che dice “hey, voglio collegarmi con te “. Questo messaggio include tutti gli “indirizzi candidati” (ip e port pair) raccolti nei passaggi 1 e 2.

  4. Il client remoto, dopo aver ricevuto l’invito a connettersi, esegue anche i passaggi 1 e 2 sopra. Quindi rimanda la sua lista di candidati attraverso lo stesso canale su cui ha ricevuto l’elenco di candidati dell’inventore.

  5. Passo di perforazione. Entrambi i client, iniziano a inviare messaggi di test su UDP agli altri candidati dell’indirizzo e ad ascoltare gli stessi messaggi sulla loro estremità. Ogni volta che viene ricevuto un messaggio, rispondi all’indirizzo da cui proviene. Alla fine, i client scopriranno di avere una coppia di indirizzi che possono anche inviare in modo affidabile i datagrammi. Tipicamente, un endpoint prende la decisione finale su quale coppia di indirizzi (socket) comunicare con e il protocollo facilita questo endpoint che dice all’altra endpoint questa decisione.

** – Di solito è meglio non fare affidamento su una porta ben nota per i client P2P. Perché due client con lo stesso NAT o firewall non sarebbero probabilmente in grado di utilizzare il tuo software contemporaneamente.

Ecco un breve riepilogo di alcune tecnologie da esplorare.

STUN – È un semplice server e protocollo per i client dietro una NAT / route per scoprire qual è il loro IP esterno e le loro mappature delle porte.

TURN è un’espansione a STUN, ma supporta l’inoltro per scenari di connettività P2P in cui firewall e NAT prevengono connessioni dirette.

ICE è una serie di passaggi con cui STUN e TURN vengono utilizzati per impostare una connessione P2P. ICE è un protocollo formale per i passaggi 1-5 sopra. Due eccellenti serie di diapositive su ICE sono qui e qui .

WebRTC è una variante dello standard ICE e una libreria di riferimento per effettuare sessioni P2P con STUN e TURN.

UPNP + Internet Gateway Device Protocol – Alcuni router supportano questo per gli host per ottenere automaticamente i mapping delle porte.

libnice è una libreria C open source per Linux (e potrebbe funzionare su Windows) che implementa ICE.

libjingle è un’altra implementazione ICE (in C ++) di Google. Per Windows e Linux.

PJNATH è una libreria all’interno della suite PJSIP di librerie di codifica. È una buona implementazione di uno stack ICE (codice C) ed è stato portato su molte piattaforms. (Windows, Linux, Mac, iOS, Symbian e presto Android).

E infine, ho una spina sfacciata per poter usare il mio codice base del server STUN .

Ci sono soluzioni in alcuni casi, vedi UPnP: https://en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal

Il mio router di casa consente questo, in pratica, il NAT può essere configurato automaticamente dalla richiesta corretta dal computer.

Non conterei su questo per fornire un grande miglioramento alla tua disponibilità, perché non molti router supportano questo e hanno abilitato.

EDIT: @David ha suggerito questa domanda SO per una libreria .NET per UPnP: esiste una libreria UPnP per .NET (C # o VB.NET)?

Userò la tecnologia WebRTC come framework open source per tale applicazione.

Sito ufficiale

In effetti è un progetto open source che supporta tutti gli strumenti necessari per le tecnologie peer-to-peer out of the box:

  • ICE e STUN (NAT traversal)
  • DTLS e SRTP (sicurezza)
  • AVPF per la qualità dello streaming.

Questo potrebbe essere un po ‘più complicato di quello che stai cercando, ma TCP Hole Punching è una tecnica che dovrebbe funzionare. http://en.wikipedia.org/wiki/TCP_hole_punching

In alternativa, UPnP funziona perfettamente per router / firewall che lo supportano.

Avete un’altra opzione che è NAT Portfolio Protocol (NAT-PMP) NAT-PMP è ampiamente utilizzato dalle applicazioni VoIP come client Skype o BitTorrent P2P.