Creando conexiones Peer to Peer usando un servidor intermedio

Quiero conectar dos clientes (a través de sockets TCP / IP). Los clientes pueden descubrirse entre sí utilizando un servidor intermedio. Una vez que los clientes se descubren entre sí, no debe haber ninguna participación del servidor.

Hice un estudio sobre esto y encontré muchas personas sugiriendoJXTA. Pero me gustaría crear el protocolo desde cero (porque en el futuro podría tener que implementar el mismo usando WebSockets también (cuando mi cliente es un navegador)). Actualmente, mis clientes pueden ser aplicaciones de escritorio o aplicaciones móviles.

Mis preguntas son:

¿Cómo se descubrirán los clientes en el servidor? Si el servidor envía la dirección IP global de los clientes entre sí, ¿será esa información suficiente para crear una conexión de igual a igual? ¿Qué sucede si los clientes están en la misma red LAN y el servidor está en una WAN diferente?

El cliente tiene una dirección IP dinámica. ¿Puede cambiar su IP de repente, incluso si tiene un socket activo?

¿Es confiable la conexión de igual a igual para la transferencia de datos no continuos (como en la aplicación de chat)?

[NOTA: por conexión de igual a igual me refiero a establecer una conexión de socket TCP / IP cliente-servidor (utilizando Java) haciendo que uno de los clientes sea un servidor de socket temporal]

Gracias por adelantado.

Respuestas a la pregunta(1)

Su respuesta a la pregunta