Cuál es la mejor aproximación para enviar grandes paquetes UDP en secuencia

Tengo una aplicación de Android que necesita enviar datos a través del protocolo UDP cada 100 milisegundos. Cada paquete UDP tiene un promedio de 15000 bytes. Los paquetes se envían en emisión

Cada 100 milisegundos líneas abajo se ejecutan a través de un bucle.

DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, broadcast, 9876); clientSocket.send(sendPacket); 

La aplicación comienza a funcionar bien, pero después de aproximadamente 1 minuto la frecuencia de los paquetes recibidos disminuye hasta que los paquetes no llegan sobre el destino.

El límite teórico (en Windows) para el tamaño máximo de un paquete UDP es 65507 bytes

Sé que el MTU de medios de una red es de 1500 bytes y cuando envío un paquete más grande se divide en varios fragmentos y si un fragmento no llega al destino se pierde todo el paquete.

No entiendo por qué al principio 1 minuto los paquetes se envían correctamente y después de un rato los paquetes no llegan más. Así que me pregunto cuál sería el mejor enfoque para resolver este problema?

Es exactamente el problema que describiste. Cada datagrama que transmitas se divide en 44 paquetes. Si alguno de ellos se pierde, el datagrama se pierde. Tan pronto como usted tiene suficiente tráfico para causar, digamos, 1% de pérdida de paquetes, tiene 35% de pérdida de datagrama. 2% de pérdida de paquetes equivale a 60% de pérdida de datagrama.

Necesita mantener sus datagramas de difusión lo suficientemente pequeños para no fragmentarse. Si usted tiene una corriente de 65.507 pedazos del byte tales que usted no puede cambiar el hecho de que usted debe tener el pedazo entero para que los datos sean útiles, entonces la difusión UDP ingenua era mala opción.

Tendría que saber mucho más sobre los detalles de su aplicación para hacer una recomendación razonable. Pero si usted tiene un pedazo de datos alrededor de 64KB tal que usted necesita el pedazo entero para que los datos sean útiles, y usted no pueda cambiar eso, entonces usted debe utilizar un acercamiento que divide esos datos en pedazos con algo de redundancia tal que Algunas piezas se pueden perder. Con la codificación de borrado , puede dividir 65.507 bytes de datos en 46 trozos, cada uno de 1.490 bytes, de tal forma que los datos originales se pueden reconstruir a partir de cualquier 44 trozos. Esto toleraría la pérdida moderada del datagrama con solamente sobre un aumento del 4% en tamaño de los datos.

TCP se utiliza específicamente en lugar de UDP cuando se necesita una entrega fiable y correctamente ordenada. Pero suponiendo que realmente necesita UDP para la radiodifusión, podría:

  1. Depurar la red para ver cómo y dónde se pierden los paquetes, o tal vez es el receptor que está obstruido / rezagado. Pero a menudo no tienes control sobre estas cosas. ¿Está involucrada una red WiFi? Si es así, es difícil obtener una buena QoS.

  2. Hacer algo en la capa de aplicación para garantizar el pedido y la entrega fiable. Por ejemplo, SIP utiliza normalmente UDP, pero el protocolo utiliza transacciones y números de secuencia para que los clientes y servidores retransmitir mensajes según sea necesario.

  3. Implementar el ocultamiento de la pérdida de paquetes. Usando las matemáticas, el receptor puede recrear un paquete perdido, análogo a cómo una disposición del disco de RAID puede perder impulsiones y todavía funcionar.

Que su configuración funciona bien por un minuto y luego no es una pista de que hay congestión de la red o congestión de software en la transmisión o el lado del receptor.

¿Puedes hacer algunas capturas de paquetes con Wireshark y compartir los resultados?

  • Servicio de Android para sockets TCP
  • 'Permiso denegado' al conectarse al socket unix abstracto
  • Escucha un shoutcast con Android
  • Acceda a la impresora a través de Wifi desde el dispositivo Android
  • ¿Cómo asociar la intención de conectividad a socket?
  • Conexión larga de sondeo TCP de Android
  • Androide, socket, programación, atrás, router
  • Cómo enviar el archivo binario y el texto usando el mismo socket
  • Android socket de programación ... ¿qué da?
  • Sockets, Threads y Servicios en android, ¿cómo hacerlos trabajar juntos?
  • ¿El zócalo del cliente androide, cómo leer datos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.