UDP Hole Punching no es posible con el proveedor móvil

En realidad iam codificación de una aplicación para Android que recibe las imágenes de una cámara web que se conecta a un PC. Para ganar más fps uso el protocolo udp en lugar de tcp. La idea es, que el PC envía las imágenes a la IP del teléfono y el puerto. 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 perforación udp, pero que no funcionó. Cuando mi teléfono envía un paquete a la PC, el PC obtiene IP del teléfono y el puerto. Que ocurre cada segundo para mantener la conención abierta. A continuación, el servidor envía los marcos webcame a este ip y puerto tan rápido como pueda. Pero el teléfono recibe sólo 10-15 imágenes wihtin 1-2 segundos. Después de que el proveedor parece filtrar cada paquete siguiente o algo así porque el teléfono no recibe ningún otro paquete.

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 el streaming debido a demasiados overhead y correcciones de errores.

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

  • Como probablemente ya sabes, una vez que envías un datagrama UDP, no hay absolutamente ninguna garantía de que pasará y no hay manera segura de saber qué pasó si no lo hizo.

  • Es probable que las cargas de más de 1400 bytes se dividan en fragmentos de IP. El sistema operativo receptor puede volver a ensamblar esos en un paquete entero, pero solamente si cada fragmento llega. Algunos enrutadores sueltan fragmentos de forma arbitraria, algunos firewalls sueltan fragmentos si contienen patrones de bytes particulares y algunos limitan la velocidad a la que se pueden enviar fragmentos. Su mejor mantener siempre sus datagramas pequeños y manejar el reensamblaje y las repeticiones de pedazos que falta usted mismo.

  • No hay control de flujo: si el búfer de un enrutador está lleno, todo lo que queda después es eliminado. Algunos enrutadores comenzarán aleatoriamente cayendo un porcentaje de paquetes si sus búferes están creciendo pero aún no están llenos. Algunos firewalls anotarán una fuente UDP si va más rápido que algún umbral arbitrario.

En general, los fabricantes de dispositivos y cortafuegos tienden a tratar el UDP como una mierda, de modo que un desarrollador de UDP tiene que ser un ciudadano muy bueno para no ser descargado: regula tu flujo, recuerda que los paquetes perdidos significan que puedes ir demasiado rápido y mantenerlo Los paquetes pequeños. Hay mucho con lo que puedes salir en un ambiente controlado, pero si la aplicación se desplegará "en estado salvaje" se necesitará mucha programación cuidadosa para evitar problemas.

  • Problema con DatagramSocket en Android 7.1.1
  • ¿Cómo usar sockets UDP en android?
  • Mantenimiento de una conexión bidireccional UDP
  • Comunicación UDP de Android
  • Android enviar mpegts arroyos sobre udp
  • Retraso / retraso enorme de UDP con Android
  • Uso de vlclib en Android
  • No se pueden recibir paquetes UDP adecuados mediante SSDP
  • Emulador de Android udp broadcast
  • DatagramSocket.bind (); Socket excepción: no se puede asignar la dirección solicitada. Emulador de Android
  • No se puede establecer el valor DSCP en la aplicación android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.