2009-10-08 16 views
31

Sto progettando un'applicazione p2p che funziona sulla porta 30000. Il mio router non è UPnP quindi ho richiesto di inoltrare una porta al router. Ma Skype un'altra applicazione p2p funziona senza il port forwarding sul mio pc. Quando l'ho analizzato con wireshark ho trovato il suo utilizzo della porta UDP 48980, 58544. Sto usando C++.Come funziona Skype senza port forwarding?

C'è una libreria in python here che lo fa per i router Nat PnP. È possibile inoltrare automaticamente la porta al router indipendentemente dal tipo di router e dal sistema operativo. Quale dovrebbe essere l'approccio per farlo in C++ o in qualsiasi altra lingua.

risposta

20

Skype funziona in modo molto interessante. Da quello che ho letto (e questo è qualche tempo fa), che funziona così:

  • server di Skype mantiene una lista di tutti gli utenti e IP.
  • L'utente Skype A parla all'utente B L'utente Skype A invia un pacchetto di rete all'indirizzo IP dell'utente e attende una risposta. (l'utente B non riceve mai questo pacchetto).
  • Skype l'utente A notifica del server di IP/porta combinazione su cui è in attesa di una risposta
  • Server notifica l'utente B di inviare una risposta al
  • utente A sulla porta specificata Viene stabilita una connessione .

Questo è probabilmente troppo semplificato ma l'ultima volta che ho controllato, questo è come funziona. (Qualcuno mi corregga se sbaglio).

+0

ma la domanda è che sono IP dei client PUBLIC? vedi ad esempio A ha bisogno di comunicare con B e il server conosce l'IP di B ma quale ip usa? se questo è il caso è possibile ping anyones ip? scusa se è stupido –

+4

Questa risposta descrive semplicemente A e non riesce a comunicare a B e il server inviando la giusta combinazione IP/Porta all'utente B. Manca il punto principale, che è chiamato perforazione e molto ben descritto nel link fornito da @ MartinBeckett. Vorrei solo aggiungere che è anche possibile inoltrare la porta indipendentemente dal tipo di router e dal sistema operativo, a condizione che il router supporti UPnP. – Igor

+1

@rein cosa ne dici di NAT simmetrico? – onmyway133

18

UDP hole punching è (uno) dei modi in cui attraversare il NAT.

+0

io non sono in grado di capire la differenza tra il router e NAT? Inoltriamo la porta al router o al NAT? Non è la perforatura equivalente all'invio di dati da entrambi i lati allo stesso tempo, il che non funziona quando lavoriamo su porte diverse. Grazie – Xinus

+1

Un router instrada le informazioni da una rete all'altra. NAT è il processo di avere un intervallo di indirizzi privati ​​sulla rete interna e solo il router ha un indirizzo valido sull'altra rete. Il router è un dispositivo fisico, NAT è qualcosa che fai. – rein

3

È necessario utilizzare un server intermedio e avviare la comunicazione dal lato client. Come menzionato da Yossarian, da quel punto una possibilità è la perforazione UDP. A seconda del tipo di applicazione (e se è effettivamente P2P o meno) è possibile mantenere il server intermedio in posizione per tutto il tempo.

0

Skype utilizza un altro peer come punto intermedio quando la connessione diretta non è possibile.

, ad esempio il peer A vuole connettersi al peer B, ma il peer B ha tutte le porte chiuse, quindi la comunicazione viene avviata tramite il peer C che ha porte aperte.

0

avere una certa esperienza nella realizzazione di applicazioni P2P e inducendole a lavorare dietro router NAT.

Skype utilizza la perforatura UDP per lavorare dietro router NAT. Ho scritto un articolo e realizzato un video dimostrativo per aiutare gli altri a implementare applicazioni simili. Fornisce anche collegamenti a librerie utili che svolgono la maggior parte del lavoro come libutp, qui.

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

Problemi correlati