gpt4 book ai didi

networking - 无需 NTP 的小尺寸时钟同步

转载 作者:行者123 更新时间:2023-12-03 21:33:38 28 4
gpt4 key购买 nike

我正在寻找一种简单的时钟同步协议(protocol),该协议(protocol)易于实现且占用空间小,并且在没有互联网连接的情况下也可以工作,因此可以用于例如在封闭的实验室网络中。需要明确的是,我不是在寻找可以仅用于排序事件的东西(如矢量时钟),而是可以使不同节点上的进程能够根据本地时钟同步它们的 Action 的东西。据我了解,这需要一个可以考虑时钟漂移的解决方案。可以假设存在 TCP/IP 或类似的相对低延迟的流连接。

最佳答案

免责声明:无论如何,我都不是 NTP 专家。只是一个业余爱好者在周末玩得开心。
我意识到您说过您不想要 NTP 实现,因为感知到的复杂性以及您的环境中可能无法使用 Internet NTP 服务器。
但是,简化的 NTP 查找可能很容易实现,如果您有本地 NTP 服务器,则可以实现良好的同步。
就是这样:
点评 RFC 5905
你会看到 NTP v4 数据包看起来像这样:

  • LI(2 位)
  • VN(3 位)- 使用 '100' (4)
  • 模式(3 位)
  • 层(8 位)
  • 轮询(8 位)
  • 精度(8 位)
  • 根延迟(32 位)
  • 根色散(32 位)
  • 引用 ID(32 位)
  • 引用时间戳(64 位)
  • 原始时间戳(64 位)
  • 接收时间戳(64 位)
  • 传输时间戳(64 位)
  • 扩展字段 1(变量)
  • 扩展字段 2(变量)
  • ...
  • key 标识符
  • 摘要(128 位)

  • 摘要不是必需的,因此形成有效的客户端请求非常容易。按照 RFC 中的指导,使用 LI = '00',VN = '100'(十进制 4),Mode = '011'(十进制 3)。
    用C#来说明:
    byte[] ntpData = new byte[48]
    Array.Clear(ntpData, 0, ntpData.Length);
    ntpData[0] = 0x23; // LI = 00, VN = 100, Mode = 011
    打开一个到目标服务器的套接字并将其发送过来。
    int ntpPort = 123;
    IPEndPoint target = new IPEndPoint(Dns.GetHostEntry(serverDnsName).AddressList[0], ntpPort);
    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    s.Connect(target);
    s.Send(ntpData);
    在响应中,当前时间将在传输时间戳中(字节 [40 - 48])。时间戳是 64 位无符号定点数。整数部分是前 32 位,小数部分是后 32 位。它表示自 1900 年 1 月 1 日 0h 以来的秒数。
    s.Receive(ntpData);
    s.Close();

    ulong intPart = 0;
    ulong fractPart = 0;

    for (int i = 0; i < 4; i++)
    intPart = (intPart << 8) | ntpData[40 + i];

    for (int i = 4; i < 8; i++)
    fractPart = (fractPart << 8) | ntpData[40 + i];
    要以(大约)秒的粒度更新时钟,请使用:自 0h Jan-1-1900 = intPart + (fractPart/2^32) 以来的秒数。 (我粗略地说是因为没有考虑网络延迟,我们在这里四舍五入)
    ulong seconds = intPart + (fractPart / 4294967296);

    TimeSpan ts = TimeSpan.FromTicks((long)seconds * TimeSpan.TicksPerSecond);

    DateTime now = new DateTime(1900, 1, 1);
    now = DateTime.SpecifyKind(now, DateTimeKind.Utc);
    now += ts;
    “now”现在是带有当前时间的 DateTime,以 UTC 为单位。
    虽然这可能无法回答您的问题,但希望它能让 NTP 不那么不透明。 =)

    关于networking - 无需 NTP 的小尺寸时钟同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5642946/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com