Connessioni TCP/IP dirette nelle app P2P
-
09-06-2019 - |
Domanda
Da un Il post di Joel su Copilot:
Collegamento diretto!Abbiamo sempre fatto tutto il possibile per assicurarci che Fog Creek Copilot possa connettersi in qualsiasi situazione di networking, indipendentemente dai firewall o dai NAT.Per far sì che ciò accada, entrambe le parti effettuano connessioni in uscita al nostro server, che trasmette il traffico per loro conto.Bene, in molti casi, questo non è necessario.Quindi la versione 2.0 fa qualcosa di piuttosto intelligente:Imposta la connessione iniziale tramite i nostri server, quindi ti collega immediatamente con affidabilità al 100%.Ma poi una volta che sei connesso, silenziosamente, sullo sfondo, cerca un modo per stabilire una connessione diretta.Se non può, nessun grosso problema:Continui a trasmettere attraverso il nostro server.Se è possibile effettuare una connessione peer-to-peer diretta, sposta silenziosamente i tuoi dati sulla connessione diretta.Non noterai nulla tranne, probabilmente, una comunicazione molto più veloce.
Come cambiano la connessione al server in una connessione P2P?
Soluzione
È piuttosto complicato e interessante.Sicuramente ho sbagliato qualche dettaglio, ma la panoramica è questa:
I programmi possono già comunicare tra loro attraverso il server di Joel, in modo che possano scambiare informazioni tra loro e con il server di Joel.Inoltre, Joel ha i loro indirizzi IP esterni e fornisce a Joel informazioni sui loro indirizzi IP interni.
Decidono di provare questa tecnica del perforatore.Il computer A avvia una connessione TCP con il computer B utilizzando l'indirizzo IP esterno di B.Non passerà, ma ciò che fa è dire al router di A che deve consentire i pacchetti in entrata da B su una determinata porta.
Il computer B fa la stessa cosa, ma il suo messaggio arriva ad A poiché il router di A ha aperto una combinazione porta/ip che corrisponde a ciò che B ha inviato (c'è qualche magia sulla porta che accade qui - questo non è banale, ma fattibile).
Il router di B ricorda che B ha avviato una connessione con A su una determinata porta e IP, quindi i pacchetti di A ora fluiscono correttamente anche in B oltre il router.
Quindi in realtà è piuttosto semplice, ma l'implementazione contiene dettagli, in particolare riguardo a come vengono assegnate le porte alle nuove connessioni TCP e a come i router NAT tipicamente gestire le richieste TCP e il modo in cui vengono mappate alle porte esterne.Questi dettagli sono la parte interessante e difficile.
-Adamo
Altri suggerimenti
Esiste una tecnica chiamata "Perforazione" che funziona bene con NAT "Cone" (Cone è una famiglia tecnica di router).Questa non è una tecnica sicura al 100%, oggi funziona bene con UDP su circa l'80% del router.
Esistono alcune implementazioni della libreria per realizzare la perforazione: STORDIRE (Wikipedia)
Credo che la versione semplice sia che interrompono la connessione al server e la sostituiscono con la connessione P2P.
Qualcosa sulla falsariga di:
- Machine1 si connette ai server del copilota.
- Machine1 si connette ai server del copilota.
- Machine1 si connette ai server del copilota.
- Successivamente Machine2 si connette e inizia la condivisione dello schermo.
- La Macchina2 apre una porta destinata alla connessione della Macchina1.
- La Macchina1 tenta di connettersi alla porta ora aperta sulla Macchina2.
Se viene stabilita questa connessione:
- La connessione ai server del copilota è interrotta.
- I dati vengono invece trasferiti tramite la connessione diretta (P2P) tra le due macchine.