我有一个应用程序,它由许多在远程位置使用UDP客户端的系统组成。所有客户端都会将UDP数据包发送到中央位置进行处理。在我的应用程序中,重要的是让中心位置知道远程位置发送数据包的时间。
从设计的角度来看,假设中心位置可以在数据包到达时为其添加时间戳并将其用作“发送时间”,这是否“安全”?由于应用程序使用UDP,数据包应该要么立即到达,要么根本不到达?另一种选择是在每个远程位置设置某种时间同步。这样做的缺点是,我需要不断地确保时间同步在可能数百个远程位置中的每一个上工作。
我的问题是,在中央位置为UDP数据包添加时间戳以确定“发送时间”是否是一个潜在的缺陷。使用UDP是否可能遇到任何延迟?
发布于 2010-07-31 12:34:59
对于秒分辨率,您可以在收到数据包时使用时间戳,但您仍然需要使用序列号来阻止重新排序或重复的数据包。
这可以使您的远程站不那么复杂,因为它们不需要电池供电的时钟或同步技术。
对于毫秒级的分辨率,您需要计算往返时间(RTT),并使用该偏移量来计算接收器上的时钟。
除非您在受控环境中使用精确时间协议(PTP),否则永远不能信任远程主机的时钟。
发布于 2010-07-30 21:20:31
传输过程中始终存在延迟,并且UDP数据包既不能保证传输,也不能保证它们按顺序到达。
需要更多关于上下文的信息才能推荐更好的解决方案。
发布于 2010-07-30 21:37:16
一种选择是要求客户端时钟与外部原子时钟同步。为了确保这一点,并使您的UDP更健壮,服务器可以拒绝任何“延迟”到达的数据包(这是由服务器时钟和数据包时间戳的差异决定的)。
如果您的服务器正在out数据包,它可以向客户端报告它(可能)不同步,以便它可以重新同步自己。
如果你的服务器没有out数据包,你的整个方案很可能会因为丢弃或无序的数据包而失败。
https://stackoverflow.com/questions/3371730
复制相似问题