Python中的NTP时间同步

892 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

环境

  • ubuntu 18.04 64bit
  • python3
  • ntp 4.2.8p11

NTP简介

网络时间协议( Network Time Protocol,简称 NTP )是在数据网络潜伏时间可变的计算机系统之间通过分组交换进行时钟同步的一个网络协议。自1985年以来,NTP 是目前仍在使用的最古老的互联网协议之一。NTP 由特拉华大学的 David L. Mills 设计。

NTP 意图将所有参与计算机的协调世界时( UTC )时间同步到几毫秒的误差内。它使用 Marzullo 算法的修改版来选择准确的时间服务器,其设计旨在减轻可变网络延迟造成的影响。NTP 通常可以在公共互联网保持几十毫秒的误差,并且在理想的局域网环境中可以实现超过1毫秒的精度。不对称路由和拥塞控制可能导致100毫秒(或更高)的错误。

该协议通常描述为一种主从式架构,但它也可以用在点对点网络中,对等体双方可将另一端认定为潜在的时间源。发送和接收时间戳采用用户数据报协议( UDP )的通信端口123实现。这也可以使用广播或多播,其中的客户端在最初的往返校准交换后被动地监听时间更新。

当前协议为版本4( NTPv4 ),这是一个 RFC 5905 文档中的建议标准。它向下兼容指定于 RFC 1305 的版本 v3

安装ntpd

到站点ntp.org/downloads.h…下载最新版的 ntp 服务端的源码包

# 解压
tar xvf ntp-4.2.8p11.tar.gz

cd ntp-4.2.8p11

# 配置
./configure

# 编译
make

# 安装
sudo make install

启动服务

sudo ntpd

使用python进行时间同步

首先安装 ntplib 依赖库

sudo pip install ntplib

然后书写代码,如下

# -*- coding:utf-8 -*-
import datetime
import ntplib

client = ntplib.NTPClient()

# 向本地的ntp server发送请求,如果是其它主机,就填写对应的ip地址
response = client.request('127.0.0.1')
print(datetime.datetime.fromtimestamp(response.tx_time))

执行上述代码,程序输出

2020-09-28 10:29:23.110938

参考资料

  1. ntp.org/
  2. pypi.org/project/ntp…