2010-07-30 9 views
5

Tengo una aplicación que consiste en numerosos sistemas que utilizan clientes UDP en ubicaciones remotas. Todos los clientes envían paquetes UDP a una ubicación central para su procesamiento. En mi aplicación, es crítico que la ubicación central sepa a qué hora el paquete fue enviado por la ubicación remota.UDP Delay Potential

Desde una perspectiva de diseño, ¿sería "seguro" suponer que la ubicación central podría marcar el tiempo de los paquetes a medida que llegan y usarlos como el "tiempo enviado"? Dado que la aplicación usa UDP, ¿los paquetes deberían llegar inmediatamente o no llegar? La otra opción sería configurar algún tipo de sincronización de tiempo en cada ubicación remota. La desventaja de esto es que entonces tendría que asegurar continuamente que la sincronización de tiempo funciona en cada uno de los cientos de ubicaciones remotas.

Mi pregunta es si la marca de tiempo de los paquetes UDP en la ubicación central para determinar el "tiempo de envío" es una falla potencial. ¿Es posible experimentar cualquier retraso con UDP?

+3

¿Qué precisión necesita que sea? ¿Hasta el minuto? ¿Segundo? ¿Milisegundo? –

+1

Bajar al segundo. – Mike

+1

No sé nada sobre la programación de la red, así que lo estoy lanzando como una opción, pero me pregunto si podría suponer que hay un retraso y compensarlo fácilmente. Algo así como un procedimiento de handshake ... así que cuando un cliente remoto se conecta a la ubicación central, recibe un pin 1000 veces y usted mantiene un Dictionary ? Estoy seguro de que no es una gran solución, pero parece mucho mejor que suponer que no hay demoras. – NickHalden

Respuesta

3

Para la resolución de segundos puede utilizar el sellado de tiempo de cuando recibe el paquete, pero aún necesita usar un número de secuencia para bloquear paquetes reordenados o duplicados.

Esto puede hacer que sus estaciones remotas sean menos complejas ya que no necesitarán un reloj con batería de respaldo ni técnicas de sincronización.

Para una resolución de milisegundos, le conviene calcular el tiempo de ida y vuelta (RTT) y usar ese desplazamiento en el reloj del receptor.

A menos que esté utilizando el protocolo de tiempo de precisión (PTP) en un entorno controlado, nunca podrá confiar en el reloj de los hosts remotos.

+0

"A menos que esté utilizando el protocolo de tiempo de precisión (PTP) en un entorno controlado, nunca podrá confiar en el reloj de los hosts remotos". Esta es precisamente la razón por la que comencé a usar el tiempo del host para sellar cada paquete. Incluso con todos mis hosts remotos usando NTP, hay derivas de tiempo que equivalen a unos pocos segundos. – Mike

1

Siempre hay un retraso en la transmisión, y los paquetes UDP no tienen entrega garantizada ni se garantiza que lleguen en secuencia.

Necesitaría más información sobre el contexto para recomendar una solución mejor.

0

Una opción sería requerir que los relojes del cliente estén sincronizados con un reloj atómico externo. Para garantizar esto, y para hacer su UDP más robusto, el servidor puede rechazar cualquier paquete que llegue "tarde" (como lo determina la diferencia en el reloj del servidor - también sincronizado externamente - y la marca de tiempo del paquete).

Si su servidor está descargando paquetes, puede informar al cliente que está (posiblemente) fuera de sincronización para que pueda volver a sincronizarse.

Si su servidor no está descargando paquetes, su esquema completo probablemente fallará de todos modos debido a paquetes caídos o fuera de orden.