c# - segmento - protocolo udp user datagram protocol
Para enviar una imagen cada 50 ms., ¿Debería usar TCP o UDP? (5)
Antes que nada, su red podría no ser capaz de manejar esto sin importar lo que haga, pero yo iría con UDP. Podría intentar dividir las imágenes en bits más pequeños, y solo mostrar cada imagen si obtiene todas las partes antes de que llegue la siguiente.
Además, podría usar RTP como otros lo han mencionado, o probar UDT . Es una capa confiable bastante ligera sobre UDP. Debería ser más rápido que TCP.
Estoy construyendo una aplicación C #, utilizando el modelo servidor-cliente, donde el servidor está enviando una imagen (100 kb) al cliente a través de un socket cada 50 ms ...
Estaba usando TCP, pero además de la sobrecarga de este protocolo, a veces el cliente terminaba con más de una imagen en el socket. Y todavía no he pensado en un mecanismo inteligente para dividir los bytes de cada imagen (en realidad, solo necesito la más reciente).
Intenté usar UDP, pero llegué a la conclusión de que no puedo enviar 100kb de diagramas, solo 64kb. Y aun así, no debería usar más de 1500bytes; de lo contrario, el paquete se dividiría a lo largo de la red y las posibilidades de perder partes del paquete serían mayores.
Así que ahora estoy un poco confundido. ¿Debo continuar usando TCP y poner algunos bytes de escape al final de cada imagen para que el cliente pueda separarlos? ¿O debería usar UDP, enviar diagramas de 1500 bytes y crear un mecanismo para ordenar y recuperar?
El objetivo clave aquí es transmitir las imágenes muy rápido. No me importa perder algunos en el camino mientras el cliente siga recibiendo los más nuevos.
¿O debería usar otro protocolo? ¡Gracias por adelantado!
Debería considerar usar el protocolo de transporte en tiempo real (también conocido como RTP ).
El protocolo IP subyacente utilizado por RTP es UDP, pero tiene capas adicionales para indicar marcas de tiempo, orden de secuencia, etc.
RTP es el principal protocolo de transferencia de medios utilizado por VoIP y sistemas de video sobre IP. Me sorprendería mucho si no puede encontrar las implementaciones existentes de C # del protocolo.
Además, si sus archivos de imagen están en formato JPEG, debería poder generar una transmisión RTP / MJPEG. Hay bastantes espectadores de video que ya tienen soporte nativo para recibir y mostrar dicha transmisión, ya que algunas cámaras web IP emiten en ese formato.
Las otras respuestas cubren buenas opciones re: UDP o un protocolo "real" como RTP.
Sin embargo, si quiere seguir con TCP, construya una estructura de ''mensaje'' simple para cubrir sus necesidades. ¿Lo más simple? Longitud-prefijada. Primero, envíe la longitud de la imagen como 4 bytes, luego envíe la imagen. Fácil de escribir para el cliente y el servidor.
Si lo último es más importante que todas las imágenes, UDP debería ser su primera opción.
Pero si está trabajando con frames lager de 64K, tiene que hacer alguna forma de volver a encuadrarse. No te preocupes por los marcos fragmentados, ya que tendrás que lidiar con ellos o la capa inferior lo hará. Y solo quieres imágenes completadas.
Lo que deseará es alguna forma de encapsulación con marcas de tiempo / secuencias.
Yo recomendaría usar UDP si:
- Su aplicación puede hacer frente a una imagen o a un pequeño estallido de imágenes que no se transmiten,
- Puede comprimir sus imágenes en 65535 bytes.
Si está implementando una aplicación de videoconferencia, vale la pena señalar que la mayoría usa UDP.
De lo contrario, debería usar TCP e implementar un enfoque para delimitar las imágenes. Una sugerencia al respecto es echarle un vistazo al protocolo RTP . Está diseñado específicamente para transportar datos en tiempo real como VoIP y video.
Editar: he buscado varias veces en el pasado una biblioteca .Net RTP y, aparte de las envolturas para bibliotecas que no son de .Net o las que han sido completadas a medias, no tuve mucho éxito. Acabo de echar otro vistazo rápido y esto puede ser de este. ConferenceXP parece un poco más prometedor.