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?

È stato utile?

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:

  1. Machine1 si connette ai server del copilota.
  2. Machine1 si connette ai server del copilota.
  3. Machine1 si connette ai server del copilota.
  4. Successivamente Machine2 si connette e inizia la condivisione dello schermo.
  5. La Macchina2 apre una porta destinata alla connessione della Macchina1.
  6. La Macchina1 tenta di connettersi alla porta ora aperta sulla Macchina2.

Se viene stabilita questa connessione:

  1. La connessione ai server del copilota è interrotta.
  2. I dati vengono invece trasferiti tramite la connessione diretta (P2P) tra le due macchine.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top