4、网络同步基础:NTP 时间同步协议、局域网内搭建 NTP 服务器、客户端配置与验证

多屏同步调试,说白了就是让几块屏幕的画面“对齐”。但你想过没有——如果每块屏幕的系统时间都不一样,那所谓的“同步”就是个笑话。

我刚开始做多屏项目时,就踩过这个坑。两台显示器,一台快了两秒,一台慢了三秒,结果播放动画时怎么看怎么别扭。后来才发现,问题出在时间基准上。

所以这一章,咱们先把时间这个基础打牢。核心工具就是 NTP(Network Time Protocol)。

4.1 NTP 时间同步协议:它是怎么工作的?

NTP 的全称是 Network Time Protocol,网络时间协议。它的目标很简单:让网络里的设备时间尽可能一致。

但实现起来,比你想的复杂一点。

NTP 采用 分层架构,也叫 Stratum 层级。每一层都从上一层获取时间,然后向下层提供服务。

核心概念:Stratum 层级

  • Stratum 0:原子钟、GPS 时钟等硬件设备。精度最高,但一般不直接连网络。
  • Stratum 1:直接与 Stratum 0 同步的服务器。比如 pool.ntp.org 的顶级服务器。
  • Stratum 2:从 Stratum 1 同步。我们局域网里搭建的 NTP 服务器,通常就在这一层。
  • Stratum 3 及以下:继续向下级联。层级越深,精度越低。

NTP 同步时,会计算网络延迟和时钟偏移。它不只是一次性对时,而是持续微调。所以时间会越来越准。

我个人习惯,在局域网里至少搭一个 Stratum 2 的 NTP 服务器。这样所有设备都从同一个源对时,误差能控制在 1 毫秒以内。

NTP 分层同步架构 Stratum 0 原子钟 / GPS Stratum 1 公共 NTP 服务器 Stratum 2 局域网 NTP 服务器 客户端 A 客户端 B 客户端 C 层级越低(数字越小),时间精度越高。局域网内建议用 Stratum 2 作为统一时间源。

4.2 局域网内搭建 NTP 服务器

好,理论讲完了。咱们直接上手。

我以 Ubuntu 20.04/22.04 为例。其他 Linux 发行版大同小异。

4.2.1 安装 NTP 服务

sudo apt update
sudo apt install ntp -y

装完以后,NTP 服务会自动启动。你可以检查一下状态:

sudo systemctl status ntp

如果看到 active (running),说明安装成功。

4.2.2 配置 NTP 服务器

配置文件在 /etc/ntp.conf。我建议先备份原文件:

sudo cp /etc/ntp.conf /etc/ntp.conf.bak

然后编辑它:

sudo vim /etc/ntp.conf

核心配置项就几个:

配置项 说明 示例
server 指定上游 NTP 服务器 server ntp.aliyun.com iburst
restrict 访问控制规则 restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
driftfile 时钟漂移记录文件 driftfile /var/lib/ntp/ntp.drift

我个人习惯的配置模板:

# 上游服务器(国内推荐阿里云或腾讯云)
server ntp.aliyun.com iburst
server ntp.tencent.com iburst

# 允许局域网客户端同步(假设网段是 192.168.1.0/24)
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

# 本地时钟作为备用
server 127.127.1.0
fudge 127.127.1.0 stratum 10

# 默认限制
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1

小提示:iburst 参数会让 NTP 在启动时快速发送几个同步包,缩短首次同步时间。建议加上。

4.2.3 重启服务并验证

sudo systemctl restart ntp
sudo systemctl enable ntp

查看同步状态:

ntpq -p

你会看到类似这样的输出:

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp.aliyun.com  .GPS.            1 u   23   64  377   28.123   -2.456   0.789
+ntp.tencent.com .GPS.            1 u   12   64  377   32.456   -1.234   0.654

看到 * 号了吗?那表示当前同步的服务器。有它就对了。

注意:如果 reach 列一直是 0,说明网络不通或配置有误。检查防火墙是否放行了 UDP 123 端口。

4.3 客户端配置与验证

服务器搭好了,客户端怎么连?

其实更简单。客户端可以是 Windows、macOS、Linux,甚至是一些嵌入式设备。

4.3.1 Linux 客户端

同样安装 NTP 服务,但配置文件中只指向你的局域网服务器:

# 编辑 /etc/ntp.conf
server 192.168.1.100 iburst  # 替换成你的 NTP 服务器 IP

# 注释掉其他 server 行
# server ntp.aliyun.com iburst

重启服务:

sudo systemctl restart ntp
ntpq -p

如果看到 *192.168.1.100,说明同步成功。

4.3.2 Windows 客户端

Windows 自带时间同步功能。设置路径:

  1. 打开 控制面板 → 日期和时间
  2. 点击 Internet 时间 选项卡
  3. 点击 更改设置
  4. 在 服务器 栏输入你的 NTP 服务器 IP
  5. 点击 立即更新

或者用命令行:

w32tm /config /manualpeerlist:"192.168.1.100" /syncfromflags:manual /reliable:yes /update
w32tm /resync

4.3.3 macOS 客户端

macOS 在 系统偏好设置 → 日期与时间 里,取消勾选“自动设置日期与时间”,然后手动输入服务器地址。

或者用命令行:

sudo systemsetup -setnetworktimeserver 192.168.1.100
sudo systemsetup -setusingnetworktime on

4.4 验证同步精度

同步完了,怎么知道准不准?

我常用的方法:

  • Linux:ntpq -p 看 offset 列,单位是毫秒。绝对值越小越好。
  • Windows:w32tm /query /status 查看 偏移量。
  • 通用方法:在所有设备上同时执行 date +%s.%N,对比输出。

精度参考:

  • 局域网内 NTP 同步:误差通常 < 1ms
  • 公网 NTP 同步:误差通常 5-50ms
  • 多屏同步调试要求:建议 < 5ms

我曾经在一个项目中,用局域网 NTP 把 8 台设备的时钟误差控制在 0.3ms 以内。多屏播放 60fps 的视频,画面完全对齐。嗯,那种感觉真的很爽。

4.5 常见问题与避坑

最后,分享几个我踩过的坑:

坑 1:防火墙没放行 UDP 123

NTP 使用 UDP 123 端口。服务器和客户端都要放行。不然同步会失败。

坑 2:时间跳变太大

如果客户端时间与服务器相差超过 1000 秒,NTP 默认不会自动调整。需要手动设置:sudo ntpdate 192.168.1.100 先强制同步一次。

坑 3:虚拟机时间漂移

虚拟机里的时钟容易漂移。我建议在宿主机和虚拟机上都跑 NTP 客户端,双重保障。

我的习惯:每次搭建多屏调试环境,第一件事就是搭 NTP 服务器。时间基准统一了,后面所有同步工作才有意义。别嫌麻烦,这一步省不了。