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.
- Perforación UDP en Android; Servidor UDP
- Unicast UDP de Android funciona, pero la difusión no
- ¿Cómo usar sockets UDP en android?
- UDP Video Streaming en Android
- ¿Tiene sentido tener más de un socket UDP Datagram en espera? ¿Los paquetes "simultáneos" han sido eliminados o puestos en cola por el núcleo?
- Problema con DatagramSocket en Android 7.1.1
- Envío de paquetes UDP desde ANDROID 2.2 (deseo de HTC)
- Java - android UDP falta de fiabilidad
- No se pueden enviar paquetes UDP de la máquina de desarrollo a Android Emulator
- Dirección de difusión de Android
- Uso de vlclib en Android
- Recibe UDP en Android Marshmallow
- ¿Problemas con el uso de TCP y UDP en la misma aplicación?
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.
- Android Bluetooth aceptar () / connect () con dispositivos ya emparejados
- ¿Puede Android Service superar el objeto de aplicación?