2012-01-17 12 views
13

Qualcuno può dare un esempio di un Perforatura UDP?UDP Perforatura Algoritmo

In realtà, voglio scrivere un programma di chat con cui le persone possono chattare quando sanno IP di ogni altra. Ma entrambe le macchine saranno dietro un router firewall. Quindi, ho bisogno di dare un buco per poter comunicare.

Vorrei una funzione tale che a chiamare la funzione, un buco sarebbe stato perforato e la comunicazione del futuro sarebbe andare avanti facilmente - se questo non è troppo chiedere :)

+1

possibile vittima di: http://stackoverflow.com/questions/8523330/programming-p2p-application/8524609#8524609 – selbie

+0

Non esiste una funzione semplice che si può chiamare che la volontà risolvi tutti i tuoi problemi di attraversamento NAT. Vedi il link sopra per una discussione più lunga su NAT traversal e P2P. – selbie

risposta

18

Risposta breve: si può' essere fatto in modo affidabile

lungo Risposta:

"Perforatura" si riferisce a innescare regole di NAT automatici di un router in modo da consentire il traffico in entrata. Quando si invia un pacchetto UDP, il router (in genere) crea una regola temporanea che associa l'indirizzo di origine e la porta all'indirizzo e alla porta di destinazione e viceversa. I pacchetti UDP di ritorno dall'indirizzo di destinazione e dalla porta (e nessun altro) vengono passati all'indirizzo di origine e alla porta originali (e nessun altro). Questa regola scadrà dopo alcuni minuti di inattività.

Ottenere questo a lavorare quando entrambi i punti finali sono dietro NAT o firewall richiederebbe che i due punti finali di inviare pacchetti fra di loro a circa lo stesso tempo. Ciò significa che entrambe le parti hanno bisogno di sapere di ogni-altro pubblico indirizzi IP e numeri di porta e la necessità di comunicare questo per l'un l'altro in qualche altro modo.

Non è possibile per un programma determinare direttamente il proprio indirizzo IP pubblico se si trova dietro un NAT (verrà visualizzato solo il suo indirizzo privato, ad esempio 192.168.x.x). Ma dal momento che si presume che gli umani coinvolti conoscano gli indirizzi IP degli altri, questi umani possono semplicemente digitare l'indirizzo dell'altro.

Ma il vero problema è che non v'è anche un modo per un programma per determinare direttamente ciò che il numero di porta del router sta usando sul lato pubblico. Il programma può essere associato a 12345 sul computer locale, ma il router può mapparlo su quasi tutte le porte sul lato pubblico. (Immagina due computer sulla tua rete locale che inviano entrambi dalla porta 12345, ovviamente il router dovrà mapparne uno a un altro numero.) Quindi anche se tu e gli umani potresti sapere a quale numero di porta locale sei legato, c'è nessun modo per sapere quale numero di porta il router mostrerà al mondo.

+9

Seth - Distingui i problemi di NAT traversal molto bene, ma fai sembrare che sia un problema impossibile da risolvere. Ma in realtà, una combinazione di STUN, TURN, ICE e un servizio di segnalazione affidabile rendono la connettività P2P molto affidabile. Mettendola in un altro modo - i server dei nodi di aiuto di internet pubblici vengono connessi direttamente. – selbie

+0

È corretto che il problema scompaia in gran parte * se * è possibile raggiungere in modo affidabile un relè di terze parti. @ c.adhityaa in realtà non diceva che la comunicazione diretta era un requisito, quindi avrei dovuto chiederlo. Inoltre, se si riduce il requisito di affidabilità, quindi avere entrambi i peer contemporaneamente inviare l'un l'altro alcuni datagrammi al secondo possono funzionare per la maggior parte del tempo.Sono abituato a gestire i firewall aziendali, quindi potrei essere eccessivamente pessimista su ciò che la rete permetterà. –

7

biblioteca networking del Lidgren ha questa funzionalità built-in. Dopo aver aggiunto la libreria all'applicazione, è necessario creare un'istanza di NetServer, connettere due NetClient e chiamare NetServer.Introduce().

Link Lidgren: https://github.com/lidgren/lidgren-network-gen3