socket servidor datos datagrama conectar concepto con computadoras cliente java linux networking tcp

servidor - sockets en java con base de datos



¿Cómo reproducir una conexión TCP/IP caída silenciosamente? (4)

Debería poder aplicar temporalmente una regla usando iptables para descartar todos los paquetes provenientes del servidor remoto (abcd). Algo como:

iptables -A INPUT -s a.b.c.d -j DROP

Cuando quieras apagar el filtro

iptables -D INPUT -s a.b.c.d -j DROP

Puede jugar con esas reglas para descartar otros paquetes específicos también, pero creo que esto modelará con precisión lo que el software de su cliente vería si el servidor simplemente desapareciera.

Sin embargo, tenga en cuenta que cuando vuelva a encender la conexión, el servidor remoto aún puede tener activa la conexión anterior, por lo que no simulará un reinicio a la perfección.

Tengo una situación en la que un programa Java establece una conexión TCP / IP de larga duración con un servidor y dicha conexión funciona exactamente como está documentada, excepto por una cosa en un entorno fuera de mi control.

Todos los sábados ese servidor se reinicia, pero por alguna razón esto no se comunica correctamente a mi cliente, por lo que la conexión simplemente se bloquea esperando una respuesta para siempre. Este es exactamente el mismo comportamiento observado con conexiones JDBC obsoletas, donde algunos enrutadores entre el servidor y el cliente han encontrado que la conexión está inactiva y la han dejado sin notificación.

Necesito poder reproducir este escenario para poder crear una solución adecuada.

Por lo tanto, necesito saber si hay una buena forma de simular que un enrutador deje caer silenciosamente las conexiones bajo mi control.

Puedo poner una caja de Linux o una Mac entre mi entorno de desarrollo y el servidor. Puedo ejecutar la JVM en una máquina virtual (reproductor vmware) si puedo hacer el lanzamiento allí.

Las sugerencias son bienvenidas.

EDITAR 2012-12-18: La solución que funcionó para mí fue usar localmente un proxy SOCKS5 basado en Java que podría suspenderse con Ctrl-Z a voluntad, y decirle a mi aplicación que lo revise.


Una solución nativa basada en Linux es usar tc con netem . Netem es una cola especial que se puede conectar a varias interfaces de red para causar demoras, reordenamientos y pérdidas (consulte la página web para obtener más información). Algunos ejemplos de uso de netem incluyen:

tc qdisc change dev eth0 root netem loss 0.1%

Para hacer que eth0 caiga 0.1% de todos los paquetes salientes, y

tc qdisc change dev eth0 root netem loss 0.3% 25%

Para crear ráfagas de pérdida de paquetes:

Esto causará que se pierda el 0.3% de los paquetes y que cada probabilidad sucesiva dependa por un cuarto de la última.

Si también necesita dejar caer paquetes entrantes, puede usar el ifb (Dispositivo de Bloqueo Funcional Intermedio). Usted lo configura, reenvía todos los paquetes recibidos por eth0 al ifb y adjunta netem al ifb para crear pérdida o demora. Vea la documentación de ifb para más detalles.


Utilice Socat para reenviar su conexión (es muy fácil configurarlo como un reenviador / proxy TCP) incluso en la misma máquina si lo desea (introduciendo un nuevo puerto para que el proxy opere y apunte al punto final "oficial")

Eche un vistazo al ejemplo simple del reenviador de TCP

Luego, cuando desee poner a prueba las interrupciones, puede eliminarlo (y el socket se cerrará) o intentar detener el proceso (CTRL Z linux) para ver cómo su destino maneja las conexiones estancadas.

¿Alguna pregunta? Trataré de responder ... ¡Buena suerte!


Desenchufe el cable de red de su computadora.

Trae una prueba simple de solo este módulo. Conéctese al servidor y llegue a la parte de espera. Luego, saca tu enchufe de red.

Es importante, por supuesto, aislar este módulo y mostrar solo este módulo cuando ejecuta esta prueba. Puede haber otros aspectos de su programa que requieran acceso a la red, y estos no deberían estar en ejecución.