2012-06-27 12 views
15

Estoy buscando una forma de agregar emulación de red a un zócalo.Simular las condiciones de la red con un zócalo C/C++

La solución básica sería de alguna manera agregar la limitación del ancho de banda a una conexión.

La solución ideal para mí sería:

  • Apoyo propiedades de red avanzada (latencia, pérdida de paquetes)
  • de código abierto
  • tuvo un API similar a enchufes estándar (o se envuelve alrededor de ellos)
  • trabajo en Windows y Linux
  • Soporte IPv4 e IPv6

Vi algunas opciones que funcionan en el nivel del sistema, o incluso como proxy (Dummynet, WANem, neten, etc.), pero eso no me va a funcionar, porque quiero poder emular cada socket manualmente (por ejemplo, abra un socket con emulación de módem y uno con emulación 3G. Básicamente, quiero saber cómo lo hacen estas herramientas.

EDIT: Necesito incorporar esta funcionalidad en mi propio producto, por lo tanto, no es aceptable utilizar una caja adicional o una herramienta de terceros que necesite una configuración manual. Quiero escribir código que haga lo mismo que esas herramientas, y mi pregunta es cómo hacerlo.

Epílogo: En retrospectiva, mi pregunta fue un poco engañosa. Aparentemente, no hay forma de hacer lo que quería directamente en el socket. Hay dos opciones:

Añadir retrasos para enviar/recibir operación (Basado en la respuesta de @ PaulCoccoli):
mediante la adición de un retardo antes de enviar y recibir, se puede obtener una simulación de red muy cruda (retardo constante para latencia, retraso en el envío, para no enviar más de X bytes por segundo, para ancho de banda).
La respuesta y el comentario de Paul fueron de gran inspiración para mí, por lo que le otorgo la recompensa.

Añadir la lógica de simulación de la red como un proxy (Basado en @ m0she y otros respuesta):
Cualquiera de enviar la solicitud a través del proxy o bien utiliza el proxy para interceptar las peticiones, a continuación, añadir la simulación deseada. Sin embargo, tiene más sentido utilizar una solución preparada en lugar de escribir su propia implementación de proxy: por lo que he visto, es probablemente la mejor opción (esto es lo que hace webpagetest.org). Otras opciones están en las respuestas a continuación, también agregaré DonsProxy
Esta es la mejor manera de hacerlo, por lo que estoy aceptando esta respuesta.

+3

C++ no tiene enchufes. –

+1

Es una aplicación C++, aunque tiene razón: los sockets son C (winsock y POSIX) –

+1

C tampoco tiene sockets ... Las bibliotecas proporcionadas por el SO sí (con las interfaces C). No ser pedante ... :) –

Respuesta

6

Puede compilar un proxy en su software que pueda hacer eso. Puede ser una implementación de proxy de calcetines completo (como this) o probablemente mejor, algo más simple que solo serviría para su propósito (y no requiere el prefijo de su comunicación con el destino y la sobrecarga de otros calcetines). Ese código podría ejecutarse como un proceso separado o un hilo dentro de su proceso.

Agregar aceleración a un proxy no debería ser demasiado difícil. Puede:

  • expedición inmediata de los datos si pasa cierto límite de ancho de banda
  • latencia complemento mediante la adición de temporizador antes de las operaciones de lectura/escritura de memorias intermedias.
  • Si está trabajando con un protocolo basado en conexión (como TCP), no tendría sentido colocar paquetes, pero con un protocolo basado en datagramas (UDP) también sería fácil de implementar.

La API de creación de la conexión sería un poco diferente de POSIX/winsock normal (a menos que haga un poco de magia macro u otro), pero todo lo demás (SEND/RECV/select/cierre/etc ..) es la misma .

+0

Esta es una idea interesante, aunque si de todos modos necesito escribir el código para las demoras, puedo escribirlo directamente en el código que envía/recibe los datos, no necesito un proxy para eso (ver la respuesta de @Paul Coccoli) –

+0

@ yasei-no-umi - Eso es más o menos lo que pretendía. Creo que la solución de proxy es más sencilla de implementar, más conveniente para alguien que esté familiarizado con la API de socket winsock/posix y más desacoplado (por ejemplo, le permite cambiar la implementación a un proceso externo o una solución de terceros) eso ofrecería una funcionalidad de estrangulamiento más sofisticada.) – m0she

+0

En lugar de escribir el proxy desde cero, puedo usar un proxy que tenga estas capacidades integradas (como Dummynet) - Crearía tuberías sobre la marcha según la red requerida, y enviaría el tráfico a través de él. –

2

Sólo sé Network Link Conditioner para Mac OS X Lion. Deberías ser el desarrollador de Mac para descargarlo, así que no puedo poner el enlace de descarga allí. Descripción única de 9to5mac.com: http://9to5mac.com/2011/08/10/new-in-os-x-lion-network-link-conditioner-utility-lets-you-simulate-internet-and-bandwidth-conditions/

+0

Gracias, pero no lo que soy buscando - está en el nivel del sistema, estoy buscando un nivel más bajo (Socket). Además, por multiplataforma, en realidad me refería a Windows y Linux, pero no a Mac –

1

generalmente agrega un dispositivo de red a su red que acelera el ancho de banda o la latencia, puerto por puerto, puede lograr lo que desea con solo conectar al puerto asignado a el tipo particular de red maliciosa que desea probar, sin cambios de código o modificaciones requeridas.

La forma más fácil de hacerlo es simplemente add iptables rules a un servidor Linux que actúa como proxy.

Si desea que funcione sin el dispositivo por separado, intente goteo que es un paquete de software que acelera su red en su PC cliente. (o for Windows)

+0

. Quiero que esta característica forme parte de mi producto y, por lo tanto, no puedo instalar/configurar otro producto. Básicamente, quiero saber cómo lo hacen estos tipos. –

2

Esta respuesta podría ser una solución parcial para usted al usar linux: Simulate delayed and dropped packets on Linux. Se refiere a un módulo kernel llamado netem, que puede simular todo tipo de problemas de red.

Si desea trabajar con conexiones TCP, tener "pérdida de paquetes" podría ser problemático ya que una gran cantidad de manejo de errores (como la recuperación de paquetes perdidos) se realiza en el kernel. Simular esto de una manera multiplataforma podría ser difícil.

+0

La pérdida de paquetes no es imprescindible para mí, pero hacerlo programáticamente es - No puedo instalar o configurar netem. –

1

Puede que desee comprobar WANem http://wanem.sourceforge.net/. WANEM es de código abierto y está licenciado bajo la licencia pública general de GNU.

WANem permite que el equipo de desarrollo de aplicaciones para configurar una puerta de enlace de aplicación transparente que puede ser utilizado para simular las características WAN como retardo de red, pérdida de paquetes, la corrupción de paquetes, desconexiones, paquetes de reordenamiento, Jitter, etc.

+0

Miré WANem (incluso lo mencioné en mi pregunta), pero esto no es lo que estoy buscando –

6

Si está incorporando esto en su producto, luego debe implementar una capa de abstracción sobre la API de sockets para que pueda seleccionar su propia implementación en tiempo de ejecución. Alternativamente, puede implementar envoltorios de cada función de socket y seleccionar si desea llamar a su propia versión o a la del sistema.

En cuanto a agregar latencia, puede hacer que su implementación de la API de sockets se salga de un hilo. En ese hilo, tenga una cola de prioridad ordenada por tiempo (es decir, este hilo de fondo realiza una simulación de eventos discretos muy básica). Cada "paquete" que envíe o reciba podría enviarse junto con un tiempo de entrega. Cada tiempo de entrega debe tener cierta cantidad de retraso agregado. Usaría algún tipo de generador de números aleatorios con una distribución gaussiana.

El hilo de fondo también debería simular el otro lado de la conexión, aunque parece que ya ha implementado esa parte?

+0

Esto es lo más cercano a lo que necesito, y lo que tenía en mente en primer lugar. Esperaba obtener ayuda con un fragmento de código/marco que lo haría más fácil y más preciso, pero parece que tendré que escribirlo yo mismo. En cuanto a la otra parte, estaba pensando en implementar la misma idea en el lado receptor (es decir,agregar demora antes de recibir el siguiente búfer) - No quiero introducir cambios en el otro lado - este es el servidor que quiero probar como está. El propósito de todo esto es hacer que el servidor crea que está interactuando con un cliente lento. –

1

Si desea una solución de software único que controle, tendrá que implementarla usted mismo. No conozco ningún paquete existente.

Si bien una capa de envoltura sobre un socket puede darle la posibilidad de introducir un retraso, no será suficiente para introducir la pérdida o la entrega fuera de servicio. Para simular esas actividades, realmente necesita interceptar los datos en tránsito entre las dos pilas TCP.

El enfoque que recomendaría es usar un dispositivo de tunelización (digamos tunX). Las rutas se deben configurar para que el cliente crea que el camino hacia el servidor es a través del tunX. El código adicional (tal vez ejecutado en un hilo diferente) interceptaría el tráfico de forma promiscua en tunX, y realizaría su comportamiento aumentado, antes de reenviar paquetes a través de la verdadera interfaz física que obtendrá el tráfico a su servidor. Lo contrario ocurriría con los paquetes que llegan del servidor en la interfaz física. Esos paquetes serían interceptados por el código del cliente, comportamiento aumentado, antes de reenviar a través del tunX.

Sin embargo, dado que está probando el software del cliente, no estoy seguro de por qué desea insertar este código en el software lanzado, a menos que el software en sí sea un cliente de simulación WAN.

1

Creo que podría utilizar una herramienta como Network Simulator. Es gratis, para Windows.

Lo único que debe hacer es configurar su programa para utilizar los puertos correctos (y la configuración de la red, por supuesto).

+0

Gracias, pero eso no funcionará para mí. De acuerdo con sus preguntas frecuentes: "En este momento puede crear hasta 32 flujos por cada tarjeta de interfaz de red. Los flujos solo están activos cuando se ejecuta el componente GUI de Network Simulator". Necesito más flujos que eso, y necesito configurarlo de forma programática (no a través de la interfaz de usuario), también lo necesito para Linux. –

Cuestiones relacionadas