我有一个应用程序,它包含许多在远程位置使用UDP客户端的系统。所有客户端都将UDP数据包发送到中央位置进行处理。在我的应用程序中,中心位置知道远程位置发送数据包的时间至关重要。
从设计的角度来看,假设中心位置可以在数据包到达时对数据包加时间戳并将其用作“发送时间”,这是否“安全”?由于应用程序使用UDP,数据包应该立即到达还是不到达?另一种选择是在每个远程位置设置某种时间同步。这样做的缺点是,我需要不断确保时间同步对每个潜在的数百个远程位置起作用。
我的问题是,是否在中央位置加密UDP数据包以确定“发送时间”是一个潜在的缺陷。使用UDP可能会遇到任何延迟吗?
答案 0 :(得分:3)
对于秒分辨率,您可以在收到数据包时使用时间戳,但仍需要使用序列号来阻止重新排序或重复数据包。
这可以使您的远程站不那么复杂,因为它们不需要电池供电的时钟或同步技术。
对于毫秒分辨率,您需要计算往返时间(RTT)并将该偏移量用于接收器上的时钟。
除非您在受控环境中使用精确时间协议(PTP),否则您永远不会信任远程主机的时钟。
答案 1 :(得分:1)
传输总是有延迟,UDP数据包没有保证传输,也不保证按顺序到达。
需要有关上下文的更多信息才能推荐更好的解决方案。
答案 2 :(得分:0)
一种选择是要求客户端时钟与外部原子钟同步。为了确保这一点,并使UDP更加健壮,服务器可以拒绝任何“迟到”的数据包(由服务器时钟的差异决定 - 也是外部同步的 - 以及数据包时间戳)。
如果您的服务器正在寻找数据包,它可以向客户端报告(可能)不同步,以便它可以重新同步。
如果你的服务器没有收集数据包,那么你的整个方案都会因为丢弃或丢失有序数据包而失败。