2012-08-05 10 views
7

realmente iam codifica una aplicación de Android que recibe las imágenes de una cámara web que conectó a una PC. Para ganar más fps, uso el protocolo udp en lugar de tcp. La idea es que la PC envíe las imágenes a la IP y al puerto del teléfono. Pero el proveedor del teléfono tiene diferentes puertos públicos. así que no puedo dirigir el teléfono directamente. Es por eso que traté de resolver el problema a través de perforaciones udp, pero eso no funcionó. Cuando mi teléfono envía un paquete a la computadora, la computadora obtiene la IP y el puerto públicos del teléfono. eso sucede cada segundo para mantener la interacción abierta. Luego, el servidor envía los marcos de webcame a esta ip y puerto lo más rápido que puede. pero el teléfono recibe solo 10-15 imágenes con 1-2 segundos. después de eso, el proveedor parece filtrar cada paquete siguiente o algo así porque el teléfono no recibe ningún paquete adicional.Perforación de UDP no es posible con el proveedor de telefonía móvil

Ahora mi pregunta es: ¿qué está sucediendo (o qué está haciendo el proveedor) y cómo puedo solucionar este problema? El protocolo TCP funciona pero es demasiado lento para la transmisión debido a demasiados gastos generales y correcciones de errores.

+0

¿Qué tan grandes son los paquetes? –

+3

son aproximadamente 20k. pero ya encontré la razón para esto: envié demasiados paquetes en un intervalo de tiempo demasiado corto. Se han almacenado en algún lugar de la pila de la red del dispositivo porque el dispositivo no pudo avanzar lo suficientemente rápido. Ahora espero 75 ms entre cada paquete y funciona como un encanto =) – Dano

+2

@Dano Si encontraste una solución, edita tu respuesta o responde a tu pregunta. Pls. –

Respuesta

9

Hay varias cuestiones a tener en cuenta con UDP, que se magnifica en las redes móviles:

  • Como usted probablemente sabe, una vez que se envía un datagrama UDP, no hay absolutamente ninguna garantía de que obtendrá a través y no hay forma segura de saber qué pasó si no fuera así.

  • Es probable que las cargas útiles de más de 1400 bytes se dividan en fragmentos de IP. El sistema operativo receptor puede volver a montarlos en un paquete completo, pero solo si llega cada fragmento. Algunos enrutadores eliminan fragmentos arbitrariamente, algunos cortafuegos eliminan fragmentos si contienen patrones de bytes particulares y otros limitan la velocidad a la que se pueden enviar los fragmentos. Lo mejor es mantener siempre pequeños los datagramas y controlar el reensamble y las repeticiones de las piezas que faltan.

  • No hay control de flujo: si el búfer de cualquier enrutador está lleno, todo lo demás se cae. Algunos enrutadores comenzarán a soltar aleatoriamente un porcentaje de paquetes si sus almacenamientos intermedios están creciendo pero aún no están llenos. Algunos firewalls incluirán en una lista negra una fuente UDP si va más rápido que algún umbral arbitrario.

En general, los dispositivos y firewall fabricantes tienden a tratar la UDP como una mierda por lo que como desarrollador UDP tiene que ser un buen ciudadano extra para no consigue descargado en: regular su flujo, recuerda que los paquetes descartados significa que podría ir demasiado rápido, y mantener los paquetes pequeños. Hay muchas cosas con las que puede salirse con la suya en un entorno controlado, pero si la aplicación se implementa "en la naturaleza", se necesitará mucha programación cuidadosa para evitar problemas.

Cuestiones relacionadas