protocolo ejemplos datagrama caracteristicas udp processing-efficiency packet-loss

udp - ejemplos - tcp ip



¿El tamaño de paquete udp más confiable y eficiente? (4)

534 bytes. Se requiere que se transmita sin fragmentación. Todavía se puede perder por completo, por supuesto. Los gastos generales debidos a la retransmisión de paquetes perdidos y los gastos generales de red en sí mismos son varios órdenes de magnitud más significativos que cualquier costo de CPU.

El envío de lotes de paquetes pequeños por UDP requeriría más recursos (cpu, compresión por zlib, etc ...). Leí here que el envío de un paquete grande de ~ 65kBYTEs por UDP probablemente fallaría, así que creo que el envío de paquetes más pequeños tendría más éxito, pero luego viene la sobrecarga computacional de usar más potencia de procesamiento (o al menos eso es lo que hago). estoy asumiendo). La pregunta es básicamente esta; ¿Cuál es el mejor escenario para enviar el máximo de paquetes exitosos y mantener el cálculo al mínimo? ¿Hay un tamaño específico que funcione la mayor parte del tiempo? Estoy usando Erlang para un servidor y Enet para el cliente (escrito en c ++). También utilizo la compresión Zlib y envío los mismos paquetes a cada cliente (el término supongo es el que supongo).


¿El envío de lotes de paquetes pequeños por UDP requeriría más recursos?

Sí, definitivamente lo haría! Acabo de hacer un experimento con una aplicación de streaming. La aplicación envía 2000 marcos de datos cada segundo, cronometrados con precisión. La carga útil de datos para cada trama es de 24 bytes. Usé UDP con sendto () para enviar estos datos a una aplicación de escucha en otro nodo.

Lo que encontré fue interesante. ¡Este nivel de actividad llevó a mi envío de CPU a sus rodillas! Pasé de tener un 64% de tiempo libre de CPU, ¡a tener un 5%! Eso fue desastroso para mi aplicación, así que tuve que arreglar eso. Decidí experimentar con variaciones.

Primero, simplemente comenté la llamada sendto () para ver cómo se ve la sobrecarga del conjunto de paquetes. Alrededor de un 1% de éxito en el tiempo de CPU. No está mal. OK ... debe ser la llamada sendto () !

Luego, hice una prueba de falsificación rápida ... Llamé a la API sendto () solo una vez en cada 10 iteraciones, pero rellené el registro de datos a 10 veces su longitud anterior, para simular el efecto de reunir una colección de registros más pequeños en Uno más grande, enviado con menos frecuencia. Los resultados fueron bastante satisfactorios: 7% de éxito de CPU, en comparación con el 59% anterior. Parecería que, al menos en mi sistema * NIX-like, la operación de enviar un paquete es costosa solo en la sobrecarga de hacer la llamada.

En caso de que alguien dude de que la prueba estuviera funcionando correctamente, verifiqué todos los resultados con la observación de Wireshark de las transmisiones UDP reales para confirmar que todo funcionaba como debería.

Conclusión: usa MUCHO menos tiempo de CPU para enviar paquetes más grandes con menos frecuencia, luego la misma cantidad de datos en forma de paquetes más pequeños enviados con más frecuencia. Es cierto que no sé qué sucede si UDP comienza a fragmentar su datagrama UDP demasiado grande ... Quiero decir, no sé cuánta sobrecarga de CPU agrega. Intentaré averiguarlo (me gustaría saberlo) y actualizaré esta respuesta.


Probablemente estés usando el protocolo equivocado. UDP es casi siempre una mala elección para los datos que le interesan transmitir. Usted termina la secuenciación de capas, el reintento y la lógica de integridad sobre ella, y luego tiene TCP.


El tamaño máximo de la UDP payload que, la mayoría de las veces, no causará la fragmentación de IP es

MTU size of the host handling the PDU (most of the case it will be 1500) - size of the IP header (20 bytes) - size of UDP header (8 bytes) 1500 MTU - 20 IP hdr - 8 UDP hdr = 1472 bytes

@EJP habló de 534 bytes pero lo arreglaría en 508 . Este es el número de bytes que FOR SURE no causará fragmentación, porque el tamaño mínimo de MTU que un host puede establecer es de 576 y el IP header max size puede ser de 60 bytes (508 = 576 MTU - 60 IP - 8 UDP)

Por cierto, intentaría ir con 1472 bytes porque 1500 es un valor suficientemente estándar.

Use 1492 lugar de 1500 para el cálculo si está pasando por una conexión PPPoE .