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 毫秒以内。
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 自带时间同步功能。设置路径:
- 打开 控制面板 → 日期和时间
- 点击 Internet 时间 选项卡
- 点击 更改设置
- 在 服务器 栏输入你的 NTP 服务器 IP
- 点击 立即更新
或者用命令行:
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 服务器。时间基准统一了,后面所有同步工作才有意义。别嫌麻烦,这一步省不了。