2011-12-15 21 views
28

Estoy escribiendo un programa p2p personalizado que se ejecuta en el puerto 4900. En algunos casos, cuando la persona está detrás de un enrutador, este puerto no es accesible desde Internet.Programando la aplicación P2P

Hay una forma automática de habilitar el acceso al puerto desde Internet. No estoy seguro de cómo funcionan otras aplicaciones p2p.

¿Alguien puede arrojar algo de luz sobre esto?

+0

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

+2

@David No estoy de acuerdo con el duplicado, aunque UPnP es en verdad "la" respuesta. – jv42

+2

@ 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

Respuesta

89

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

+0

Gracias por su explicación. – Jayesh

+0

@selbie, ¿puede la implementación STUN/TURN/ICE funcionar si uno de los pares, o ambos están detrás de ** NAT doble **? – JagsVG

+1

@jagsgediya - sí. Lo más probable es que converja a través de TURN. – selbie

4

hay soluciones en algunos casos, ver UPnP: https://en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal

Mi router lo permite, básicamente, el NAT puede ser configurado automáticamente por la solicitud apropiada desde el ordenador.

No cuento con esto para proporcionar una gran mejora en su disponibilidad, porque no muchos enrutadores lo admiten y lo tienen habilitado.

EDIT: @ David sugirió esta cuestión de forma para una biblioteca .NET para UPnP: Is there a UPnP Library for .NET (C# or VB.NET)?

1

Esto puede ser un poco más complicado que lo que estás buscando, pero TCP Perforación es una técnica que debería funcionar . http://en.wikipedia.org/wiki/TCP_hole_punching

Alternativamente, UPnP funciona muy bien para los enrutadores/firewalls que lo soportan.

2

Utilizaría tecnología WebRTC como marco de código abierto para dicha aplicación.

Official Website

De hecho, es un proyecto de código abierto que soporta todo lo necesario para las tecnologías peer-to-peer fuera de la caja:

  • ICE y STUN (NAT)
  • DTLS y SRTP (seguridad)
  • AVPF para la calidad de la transmisión.