conectividad P2P en pocas palabras. Supongamos que estamos hablando de UDP aquí. Los pasos a continuación también se pueden aplicar a TCP con algunos ajustes.
Enumere todas sus direcciones IP locales (generalmente solo 1). Cree un socket UDP en un número de puerto ** para cada adaptador con una dirección IP.
Para cada socket creado en el paso 1, póngase en contacto con un efecto de aturdimiento o TURN servidor con la misma toma de descubrir su dirección IP externa y para descubrir lo que el número de puerto interno se asigna a las afueras de la NAT (no es siempre el mismo puerto valor). Es decir, su dirección local 192.168.1.2:4900 podría ser 128.11.12.13:8888 para el mundo exterior. Y algunos NAT no siempre usan la misma asignación de puertos cuando usan el mismo puerto local para otras direcciones IP. TURN también te proporcionará una "dirección de relevo". También puede usar UPNP para obtener una dirección asignada al puerto directamente desde su enrutador, si es compatible con ese protocolo.
Mediante un servicio de encuentro (SIP, XMPP, mensaje instantáneo, servicio web, correo electrónico, tazas con cadenas), publique su lista de candidatos de direcciones en un servicio o envíe una notificación al otro cliente que diga "hey, yo quiero conectarme contigo ". Este mensaje incluye todos los "candidatos de dirección" (pares de puerto e IP) recopilados en los pasos 1 y 2.
El cliente remoto, al recibir la invitación a conectarse, realiza los pasos 1 y 2 anteriores también. Luego devuelve su lista de candidatos a través del mismo canal en el que recibió la lista de candidatos del invitador.
Paso de perforado. Ambos clientes comienzan a enviar mensajes de prueba a través de UDP a los candidatos de dirección del otro lado y escuchan los mismos mensajes en su extremo. Siempre que se reciba un mensaje, responda de nuevo a la dirección de la que proviene. Eventualmente, los clientes descubrirán que tienen un par de direcciones que también pueden enviar datagramas de manera confiable. Típicamente, un punto final toma la decisión final sobre qué par de direcciones (sockets) se comunican y el protocolo facilita que este punto extremo le indique al otro punto final esta decisión.
** - por lo general la mejor manera de no depender de un puerto bien conocido por los clientes P2P. Debido a que dos clientes detrás del mismo NAT o firewall probablemente no puedan usar su software al mismo tiempo.
Aquí hay un resumen rápido de algunas tecnologías para explorar.
STUN - es un servidor simple y protocolo para clientes detrás de un NAT/ruta para descubrir cuáles son sus asignaciones de IP y de puerto son externos.
TURN es una expansión de STUN, pero admite retransmisión para escenarios de conectividad P2P donde los cortafuegos y los NAT impiden las conexiones directas.
ICE es un conjunto de pasos por los que STUN y su vez se utilizan para la creación de una conexión P2P. ICE es un protocolo formal para los pasos 1-5 anteriores. Dos excelentes juegos de diapositivas en ICE son here y here.
WebRTC es una variante del estándar ICE, así como una biblioteca de referencia para realizar sesiones P2P con STUN y TURN.
UPNP + Internet Gateway Device Protocol - Algunos enrutadores admiten esto para que los hosts obtengan automáticamente las asignaciones de puertos.
libnice es una biblioteca C de código abierto para Linux (y podría funcionar en Windows) que implementa ICE.
libjingle es otra implementación de ICE (en C++) de Google. Para Windows y Linux.
PJNATH es una biblioteca dentro del conjunto de bibliotecas de códigos PJSIP. Es una buena implementación de una pila ICE (código C) y ha sido portada a muchas plataformas. (Windows, Linux, Mac, iOS, Symbian y pronto Android).
Y, por último, tengo un enchufe descarado para que pueda usar my STUN server code base.
posible duplicado de [¿Hay una biblioteca UPnP para .NET (C# o VB.NET)?] (Http://stackoverflow.com/questions/333079/is-there-a-upnp-library-for -net-c-o-vb-net) – David
@David No estoy de acuerdo con el duplicado, aunque UPnP es en verdad "la" respuesta. – jv42
@ jv42: Es suficiente, razón por la cual el cierre requiere 5 votos.Por lo menos, apunta al OP a información útil y relacionada. Creo que la etiqueta de StackOverflow prefiere vincular duplicados de esta manera sobre volver a publicar la misma respuesta. Pero puedo ver dónde estos dos difieren lo suficiente. De cualquier manera, siempre que se ayude al OP, la misión se cumplirá :) – David