Control de tasa UDPclient en c#
networking bandwidth (3)
Estoy enviando múltiples paquetes udp consecutivamente a una pc remota. el problema es que, si la cantidad de datos es demasiado alta, algún dispositivo en algún lugar entre el canal experimentará un desbordamiento del búfer. intento limitar / acelerar / controlar la tasa de envío de los paquetes udp. ¿Alguien puede darme alguna guía sobre cómo encontrar el intervalo óptimo de envío de tasas?
Por cierto, por favor deja de sugerir tcp sobre udp. el objetivo no es enviar datos de manera confiable, sino medir el rendimiento máximo.
A pesar de su propuesta de que no sugiero TCP sobre UDP, tengo que hacerlo. En el mismo párrafo, usted afirma que el objetivo principal de la prueba es medir el rendimiento, es decir, el ancho de banda, y la única forma de hacerlo correctamente sin reinventar la pila TCP completa es utilizar realmente la pila TCP.
Grandes partes de TCP están diseñadas para trabajar con problemas de control de flujo, y cuando se utilizan flujos TCP, obtendrá exactamente lo que necesita: ancho de banda máximo para la conexión dada, con facilidad y sin "inventar agua caliente".
Si esta respuesta no le conviene, probablemente signifique que debe volver a establecer sus requisitos sobre el problema. Ellos están en conflicto.
Prueba y error. Punto.
- Integre una conexión de datos (basada en UDP o TCP) que use ÚNICAMENTE para enviar comandos de control.
- Envíe estadísticas allí sobre paquetes perdidos, etc. Luego, los lados pueden decidir si la velocidad de datos es demasiado alta.
- Posiblemente, comience con un valor bajo y luego suba la velocidad de datos hasta que vea paquetes faltantes.
NUNCA (!) Suponga que llegarán todos los paquetes. Significa: necesita (!) Una forma de reactivar los paquetes faltantes. Incluso en los paquetes perfectos, los paquetes se perderán a veces.
Si la pérdida está bien y solo se debe minimizar, un enfoque estadístico es prácticamente la única forma en que veo manejar esto.
Prueba esto luego:
- Comience con paquetes de 1 KB de tamaño (por ejemplo).
- Para ellos, calcule cuántos paquetes por segundo estará bien enviar, por ejemplo, 1 GB de ethernet = 100 MB de ancho de banda sin procesar, más de 100000 paquetes.
- cree un paquete así que los primeros 4 bytes serían el número de serie, el resto podría ser cualquier cosa; si está realizando una prueba aquí, llénela con ceros o ruido (datos aleatorios)
- en el lado de envío, cree un paquete y empújelo a la velocidad de RATE (calculado previamente) por un segundo. calcule el tiempo invertido y
Sleep()
el resto del tiempo, esperando un nuevo intervalo de tiempo. - en el extremo receptor, junte paquetes y mire sus números de serie. si faltan paquetes, envíe (otra conexión) alguna información al remitente al respecto.
- remitente, en la información sobre paquetes perdidos, debe hacer algo como
RATE = RATE * .9
- reducir la tasa de envío al 90% de una anterior - el remitente debería aumentar gradualmente la tasa (digamos 1%) cada pocos segundos si no recibe ningún mensaje de "paquetes perdidos"
- después de un tiempo tu FRECUENCIA convergerá a algo que querías en primer lugar
Algunas consideraciones: si la conexión remota es TCP, tendrá algo de sobrecarga allí; si la conexión posterior es UDP, también puede haber descartado paquetes aquí (porque está inundando el canal) y el remitente nunca podría saber que los paquetes se descartan: algoritmo arriba no resolverá el problema de los datos faltantes o el problema de datos fuera de orden, simplemente medirá el rendimiento.