UDP no garantiza que se haya recibido un paquete determinado, por lo que es problemático codificar lo que se transmite como una "diferencia de la última vez": no se puede saber que su contraparte tiene la misma idea que usted sobre lo que la "última vez" fue. Básicamente, tendría que crear una sobrecarga en la parte superior de UDP para verificar qué paquetes se han recibido (etiquetar cada paquete con una ID única): todos los que hayan intentado seguir esta ruta estarán de acuerdo en que, en la mayoría de los casos, se encuentran más o más menos duplicación de la infraestructura de transmisión TCP sobre UDP ... solo, muy probablemente, no tan sólida y bien desarrollada (aunque hay que admitir que a veces puede aprovechar características muy especiales de sus cargas útiles para obtener una ventaja modesta sobre el bien común) viejo TCP).
¿Su transmisión debe ser de un solo sentido, remitente al receptor? Si ese es el caso (es decir, no es aceptable que el receptor envíe acuses de recibo o retransmite), entonces realmente no hay mucho que pueda hacer en este sentido. Una cosa que me viene a la mente: si está bien que el receptor no esté sincronizado por un tiempo, entonces el emisor podría enviar dos tipos de paquetes: uno con una imagen completa del valor actual de la estructura y una identificación etiqueta única, que se enviará al menos cada (digamos) 5 minutos (de manera realista, el receptor puede estar fuera de sincronización por hasta 15 minutos si pierde dos de estos "paquetes grandes"); uno con solo una actualización (diff) del último "paquete grande", que incluye la etiqueta única identificativa del paquete grande y (por ejemplo) una versión codificada en longitud de ejecución del XOR que menciona.
Por supuesto, una vez preparada la versión con longitud de ejecución, el servidor comparará su tamaño con el tamaño de la estructura completa, y solo enviará el tipo delta del paquete si los ahorros son sustanciales, de lo contrario podría ser envíe bien el paquete grande un poco antes de lo necesario (ganancias en confiabilidad). El recibido hará un seguimiento de la última etiqueta única de paquete grande que ha recibido y solo aplicará los deltas que pertenecen a ella (ayuda a que falten paquetes y paquetes entregados desordenados, dependiendo de lo sofisticado que desee hacer a su cliente).
La necesidad de versionar & c, dependiendo de qué signifique exactamente (los remitentes y receptores con diferentes ideas sobre cómo debería verse el diseño C de la estructura deben comunicarse con regularidad? ¿Cómo se comunican acerca de qué versiones conocen ambos? etc.), agregará todo un universo adicional de complicaciones, pero esa es realmente otra pregunta, y su pregunta central, tal como se resume en el título, ya es lo suficientemente grande ;-).
Si puede permitirse meta-mensajes ocasionales del receptor al remitente (acks o solicitudes de reenvío), entonces, dependiendo de los diversos parámetros numéricos en juego, puede diseñar diferentes estrategias. Sospecho que los ataques deberían ser bastante frecuentes para hacer mucho bien, así que una solicitud para reenviar un paquete grande (ya sea uno específicamente identificado o "lo que sea que tengas más fresco") puede ser la mejor meta-estrategia para eliminar el espacio de opciones (que de otra manera amenaza con explotar ;-). Si es así, entonces el remitente puede ignorar felizmente cualquier estrategia que el receptor esté utilizando para solicitar reenvíos de paquetes grandes, y usted puede experimentar en el lado del receptor con varias de esas estrategias sin necesidad de volver a desplegar el remitente también.
Es difícil ofrecer mucha más ayuda sin algunos detalles, es decir, al menos los números de bolas para todos los parámetros numéricos - tamaños de paquetes, frecuencias de envío, cuánto tiempo es tolerable para el emisor estar fuera de sincronización con el receptor, un conjunto de parámetros de red, etc., etc. Pero espero que este análisis y sugerencias algo genéricos sigan siendo útiles.
Supongo que depende de lo mucho que la los datos van a cambiar (1%? 10%? 50%?) y cuán regulares son los cambios (¿están en los mismos lugares o en todas partes?) –
Simplemente curioso: ¿por qué una estructura C en lugar de usar algo como XMLRPC, SOAP u otra comunicación mecanismos de unificación como DBUS? ¿Qué le pasará a la estructura cuando llegue al otro lado? – aneccodeal