服务器时间校正

1,首先yum 安装本地ntpdate客户端,更新ntpdate cn.pool.ntp.org时使用

[root@localhost ~]# yum install ntpdate

2,使用 ntpdate cn.pool.ntp.org进行更新。

ntpdate cn.pool.ntp.org

3.查看是否校对成功

date
%title插图%num

内网环境集群主机的时间同步

场景描述

  • 内网主机之间时间不一致,需要作同步;主机多数不能连接外网,只有*少数几台能连接外网

系统环境

  • centos7
  • root权限

实施方案

  • 内网中一台主机A (如172.16.59.25)与外网互通,通过外网 NTP 服务器同步时间
  • 主机A对内网提供 NTP 服务
  • 内网其他机器通过主机A进行对时

实施过程

主机A设置

  1. # 安装NTP软件
  2. # 方式1
  3. yum -y install ntp
  4. # 方式2(严格按照顺序autogen->ntpdate->ntp)
  5. rpm -hiv autogen-libopts-5.18-5.el7.x86_64.rpm
  6. rpm -hiv ntpdate-4.2.6p5-18.el7.centos.x86_64.rpm
  7. rpm -hiv ntp-4.2.6p5-18.el7.centos.x86_64.rpm
  8. # 编辑NTP配置
  9. vim /etc/ntp.conf

ntp.conf 配置如下

  1. driftfile /var/lib/ntp/drift
  2. # 默认拒*客户端所有操作
  3. restrict default kod notrap nomodify nopeer noquery
  4. # 允许本地操作
  5. restrict 127.0.0.1
  6. restrict ::1
  7. # 允许该网段同步时间,但不可修改NTP服务器时间
  8. restrict 172.16.59.0 mask 255.255.255.0 nomodify
  9. # 用于NTPD的上级服务器、本机时钟的同步,以及时钟的层次stratum
  10. server cn.ntp.org.cn prefer
  11. server edu.ntp.org.cn iburst
  12. # 本机时间兜底
  13. server 127.127.1.0
  14. fudge 127.127.1.0 stratum 8
  15. includefile /etc/ntp/crypto/pw
  16. keys /etc/ntp/keys
  17. disable monitor
  1. # 编辑 ntpd 文件
  2. vim /etc/sysconfig/ntpd

ntpd 文件修改如下

  1. OPTIONS=“-u ntp:ntp -p /var/run/ntpd.pid”
  2. # BIOS时间也会跟随改变
  3. SYNC_HWCLOCK=yes
  1. # 查看状态
  2. systemctl status ntpd.service
  3. ntpstat
  4. # 重启服务
  5. systemctl restart ntpd.service
  6. # 开机启动
  7. systemctl enable ntpd.service

其他主机设置

  1. # 安装 ntpdate 软件
  2. # 方式1
  3. yum -y install ntp
  4. # 方式2(严格按照顺序autogen->ntpdate->ntp)
  5. rpm -hiv autogen-libopts-5.18-5.el7.x86_64.rpm
  6. rpm -hiv ntpdate-4.2.6p5-18.el7.centos.x86_64.rpm
  7. rpm -hiv ntp-4.2.6p5-18.el7.centos.x86_64.rpm
  8. # 编辑配置文件
  9. vi /etc/ntp.conf

ntp.conf配置如下

  1. driftfile /var/lib/ntp/drift
  2. # 默认拒*客户端所有操作
  3. restrict default kod notrap nomodify nopeer noquery
  4. # 禁止本身的server
  5. # server cn.ntp.org.cn prefer
  6. # server edu.ntp.org.cn iburst
  7. restrict 172.16.59.25
  8. restrict 127.0.0.1
  9. restrict ::1
  10. server 172.16.59.25
  11. # server 127.127.1.0
  12. # fudge 127.127.1.0 stratum 10
  13. includefile /etc/ntp/crypto/pw
  14. keys /etc/ntp/keys
  15. disable monitor
  1. # 编辑 ntpd 文件
  2. vim /etc/sysconfig/ntpd

ntpd 文件修改如下

  1. OPTIONS=“-u ntp:ntp -p /var/run/ntpd.pid”
  2. # BIOS时间也会跟随改变
  3. SYNC_HWCLOCK=yes

# 重启服务 systemctl restart ntpd.service # 开机启动 systemctl enable ntpd.service

过程总结

可能失败原因及分析

  • NTP 服务刚启动后,客户端无法同步时间,需等待几分钟才可以
  • 关闭或者设置防火墙,允许123端口
  • 网络上存在多个 NTP 服务器时,客户端切换同步源后需要重启
  • 如果本机与 NTP 服务器时间误差超过1000s,则同步失败。可以按照下面命令解决。
    1. # 更改时区为中国
    2. timedatectl set-timezone “Asia/Shanghai”
    3. # 与外网同步一次时间
    4. ntpdate cn.ntp.org.cn
    5. # 注意 ntpdate

stratum 的概念

  • 顶层是1,值为0时表示层数不明,层的值是累加的,比如 NTP 授时方向是 A -> B -> C,假设 A 的层值是3,那么B从A获取到时间层值为4,C从B获取到时间,C的层值被置为5。一般只有整个 NTP 系统*顶层的服务器stratum才设为1。
  • NTP 同步的方向是从stratum 值较小的节点向较大的节点传播,如果某个 NTP 客户端接收到 stratum 比自己还要大,那么 NTP 客户端认为自己的时间比接受到的时间更为精确,不会进行时间的更新。
  • 对于大部分 NTP 软件系统来说,服务启动后,stratum 值初始是0,一旦 NTP 服务获取到了时间,NTP 层次就设置为上级服务器 stratum +1。对于具备卫星时钟、原子钟的专业 NTP 设备,一般 stratum 值初始是1。

NTPD运行过程

  • NTPD 启动后,stratum 值初始是0,此时 NTPD 接收到 NTP 请求,回复 stratum 字段为0的 NTP 包,客户端接收后,发现 stratum 字段无效,拒*更新时间,造成时间更新失败。
  • 几分钟后,NTPD从上级服务器获取到了更新,设置了正确的 stratum,回复 stratum 字段为 n+1的 NTP 包,客户端接收后,确认 stratum 有效,成功进行时间更新。
  • 在 NTPD 上级服务器不可用的情况下,NTPD 将本机时钟服务模拟为一个上级 NTP 服务器,地址使用环回127.127.1.0。服务启动几分钟后,NTPD 从 127.127.1.0 更新了时钟,设置了有效的 stratum,客户端接收后,成功进行时间更新。

ntpd与ntpdate修改时间的区别

ntpd 不仅仅是时间同步服务器,他还可以做客户端与标准时间服务器进行同步时间,而且是平滑同步,并非ntpdate立即同步,在生产环境中慎用ntpdate,也正如此两者不可同时运行。

时钟的跃变,对于某些程序会导致很严重的问题。许多应用程序依赖连续的时钟——毕竟,这是一项常见的假定,即,取得的时间是线性的,一些操作,例如数据库事务,通常会地依赖这样的事实:时间不会往回跳跃。不幸的是,ntpdate调整时间的方式就是我们所说的”跃变“:在获得一个时间之后,ntpdate使用settimeofday设置系统时间,这有几个非常明显的问题:

*,这样做不安全。ntpdate的设置依赖于ntp服务器的安全性,攻击者可以利用一些软件设计上的缺陷,拿下ntp服务器并令与其同步的服务器执行某些消耗性的任务。由于ntpdate采用的方式是跳变,跟随它的服务器无法知道是否发生了异常(时间不一样的时候,唯一的办法是以服务器为准)。

第二,这样做不精确。一旦ntp服务器宕机,跟随它的服务器也就会无法同步时间。与此不同,ntpd不仅能够校准计算机的时间,而且能够校准计算机的时钟。

第三,这样做不够优雅。由于是跳变,而不是使时间变快或变慢,依赖时序的程序会出错(例如,如果ntpdate发现你的时间快了,则可能会经历两个相同的时刻,对某些应用而言,这是致命的)。

因而,唯一一个可以令时间发生跳变的点,是计算机刚刚启动,但还没有启动很多服务的那个时候。其余的时候,理想的做法是使用ntpd来校准时钟,而不是调整计算机时钟上的时间。

NTPD 在和时间服务器的同步过程中,会把 BIOS 计时器的振荡频率偏差——或者说 Local Clock 的自然漂移(drift)——记录下来。这样即使网络有问题,本机仍然能维持一个相当精确的走时

RTC硬件时间相关命令

  1. clock –r 显示硬件时钟与日期
  2. clock –s 将系统时钟调整为与目前的硬件时钟一致。
  3. clock –w 将硬件时钟调整为与目前的系统时钟一致

查看和修改时间

  1. # 查看时间和日期
  2. date
  3. date -R
  4. timedatectl
  5. # 查看本月月历
  6. cal
  7. # 设置时间和日期
  8. # 例如:将系统日期设定成2019年11月3日的命令
  9. date -s 11/03/2019
  10. #将系统时间设定成下午5点55分55秒的命令
  11. date -s 17:55:55
  12. # 将当前时间和日期写入BIOS,避免重启后失效**
  13. hwclock -w
  14. # 修改时区
  15. tzselect

 

内网外网服务器时间同步解决方案

一.时间服务器(NTP)相关解释

网络时间协议NTP(Network Time Protocol)是用于互联网中时间同步的标准互联网协议。NTP的用途是把计算机的时间同步到某些时间标准。目前采用的时间标准是世界协调时UTC(Universal Time Coordinated)

二.时间服务器的重要性

在互联网上进行时间同步具有重要意义。随着互联网的发展和延伸到社会的各个方面,在其他的领域对时间同步也提出了多种要求,例如各种实时的网上交易、通信网络的时间配置、网络安全性设计、分布性的网络计算和处理、交通航班航路管理以及数据库文件管理和呼叫记录等多种涉及时间戳的应用,都需要精确、可靠和公认的时间。如果系统内某个服务器的时间有误差会造成交互失败有歧义,严重的将导致交易失败。由此可以看出NTP服务器的存在是不容置疑的。

三.内外网服务器时间同步方案

说明了时间同步的重要性后,需要根据实际情况来调整服务器的时间同步策略:

1. 如果每个服务器都可以有公网IP地址与外界通信,那简单的方式就是:每个服务器都可以配置与互联网上的时间服务器进行同步,达到每个内外网服务器系统时间的一致性。

2. 但是通常的情况是:在IDC托管的服务器只有前端WEB服务器对外通信,数据库,文件等服务器只是通过私网地址与前端WEB通信,形成整体的架构。

微博易的系统正是这种情况。

这个时候就需要整体系统内部有一台服务器来担当中介,具体是:将某台服务器配置成时间服务器(注:此服务器能直接同步互联网上的时间服务器),其他所有服务器都定时与这台服务器在内部进行时间同步,达到每个服务器的时间一致性。

四.方案图示

%title插图%num

五.时间服务器配置

1. 安装NTP软件

因为系统所用系统是CentOS就可以使用YUM方便的安装系统软件。

#yum  install  ntp

2. 编辑配置文件

备份一下原始配置文件:mv /etc/ntp.conf    /etc/ntp.conf-bk

vi  /etc/ntp.conf

添加如下内容

允许192.168.100.0 网段服务器进行同步,拒*其他服务器的同步

restrict 192.168.100.0 mask 255.255.255.0 nomodify
restrict 0.0.0.0 mask 0.0.0.0 nomodify notrap noquery notrust
restrict 127.0.0.1
restrict -6 ::1

外网时间服务器定义
server 0.centos.pool.ntp.org
server 1.centos.pool.ntp.org
server 2.centos.pool.ntp.org
server pool.ntp.org

fudge   127.127.1.0 stratum 10
driftfile /var/lib/ntp/drift

3. 启动NTP服务

service  ntpd s tart

4. 客户端配置

添加到计划任务中,每三十分钟同步一次
crontab  –e
30 * * * *   /usr/sbin/ntpdate  192.168.100.5

开机启动时的时间同步设置
echo  “/usr/sbin/ntpdate  192.168.100.5 ”>> /etc/rc.d/rc.local

5. 手动在其他服务器上同步时钟

root@xen100 vm_backup_script]# /usr/sbin/ntpdate  192.168.100.5
28 Jul 17:30:59 ntpdate[19081]: adjust time server 192.168.100.5 offset -0.019476 sec

[root@xen100 vm_backup_script]# date
Sat Jul 28 17:31:02 CST 2012

局域网配置NTP服务器

我们在做工程中经常发现PC、摄像机、UPS等设备都有NTP时间这个选项,与此同时不配置的话,回经常发现时间不是统一,就如我们调出录像时发现有的时间段不统一,于是将其Server2003的NTP服务开启,客户端于此同步即可!!!

默认情况下,windows server 2003在非域控制器的情况只作为NTP的客户端工作,同时默认是与time.windows.com同步,于是通过windows自带的W32Time服务器配置NTP服务器,并需通过设定客户端来与服务器同步时间。

一、NTP服务器架设

1、运行regedit,打开注册表,修改键值HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time \TimeProviders\NtpServer内的Enabled设定为1,目的主要是启用NTP服务器的功能

2、将W32Time \Config\AnnounceFlags设定为5,目的是强制主机将其自身宣布为可靠的时间源(如果要使用Internet上的时间服务器,需要设定为默认a)

3、重启w32time服务

运行cmd,进入命令行界面输入

net stop w32time(停止w32time服务) ,

net start w32time(重启W32time服务)

4、到此为止我们的W32time服务器架设好了,接下了我们设置客户端同步。

二、NTP客户端设置及其同步

1、进入注册表修改

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient下的

SpecialPollInterval 值修改成十进制43200 (单位为秒,43200为12小时,该时间是客户端与服务器时间同步的间隔)

SpecialPollTimeRemaining 值修改成[时间同步服务器],0 如:192.168.3.101,0

2、到此为止客户端设定完成,可通过命令立即更新客户端时间,

w32tm /resync /nowait

也可以通过点击右下角时间,弹出【日期和时间】,点击Internet时间选项卡,选择更改设置,将其服务器192.168.3.101,点击立即更新!

注意:由于w32time服务使用的是123端口来同步时间,所以,还需要开通NTP服务连接外网的TCP和UDP的123端口

windows下面NTP服务器配置,局域网

NTP服务器介绍

NTP服务器【Network Time Protocol(NTP)】是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒)。

问题描述

在一个与外界网络隔离的局域网内需要搭建一个NTP服务器给该局域网内的其他设备使用。尝试了一些Windows下的NTP服务器小软件之后,*后查到了Windows默认带有NTP服务器,只是默认没有开启,我们可以通过修改注册表的方式打开Windows默认的NTP服务器。

Windows时间服务介绍

从Windows 2000起的所有Microsoft Windows版本都包括Windows时间服务(W32Time),其具有将计算机时钟同步到NTP服务器的能力。
W32Time服务*初是为实现Kerberos第五版的身份验证协议,它需要误差5分钟内正确时间值以防止重放攻击。Windows 2000和Windows XP中只实现了简单的NTP,并在几个方面违反了NTP第3版的标准。从Windows Server 2003和Windows Vista开始,已包括匹配完整NTP的实现。微软称W32Time服务不能可靠地将同步时间保持在1至2秒的范围内。如果需要更高的精度,微软建议使用其他NTP实现。
Windows Server 2016现在在某些操作条件下支持1ms的时间精度。

(Windows时间服务介绍 摘抄自 “网络时间协议 – 维基百科,自由的百科全书“)

Windows 下安装NTP服务器方法步骤描述

电脑环境:

1、VMware Workstation_full_12.1.0.exe,密码:jtkr
2、虚拟机作为NTP服务器:Windows 7 (64位)(VMware 12 pro下的Windows 7 虚拟机 )
3、物理机:Windows10教育版 64位 1803版本(操作系统版本:17134.48)

详细步骤:

1、在Windows 服务器下,按住“ windows+r ”打开“运行”对话框,输入regedit,点击“确定”打开注册表。

2、在注册表中依次展开:HKEY_LOCAL_MACHINE、SYSTEM、CurrentControlSet、Services、W32Time、TimeProviders、NtpServer,
在NtpServer项的右侧键值ENablied,将默认的0改为1,1为启用NTP服务器。

 

3、再在注册表中依次展开:HKEY_LOCAL_MACHINE、SYSTEM、CurrentControlSet、Services、W32Time、Config
找到Config项右侧的AnnounceFlags。
把默认的10改为5,5的意思就是自身为可靠的时间源。

 

4、修改完以上之后关闭注册表编辑器,win7下 以管理员身份打开命令行如下图。Windows10则用Windows+X+A以管理员身份打开命令行。

5、在命令提示符中输入:net stop w32Time,回车
等待NTP服务停止。
然后再输入:net start w32Time,回车
启动NTP服务。

6、测试,局域网内windows电脑同步成功!

7、测试,在ubuntu虚拟机中,在终端输入命令“sudo ntpdate 192.168.10.241,”出现如下界面则同步成功!

参考资料

1、NTP服务器_百度百科
2、内网测试环境 NTP 服务器搭建
3、内网NTP服务器搭建
4、meinberg官网
5、NetTime 开源的Windows系统ntp软件
6、各种NTP SERVER平台软件测试与测试结果_百度文库
7、Windows 如何安装NTP服务器_百度经验
8、网络时间协议 – 维基百科,自由的百科全书
9、Network Time Protocol – Wikipedia
10、运行net start 命令时,提示发生系统错误5,拒*访问。 – Microsoft Community
11、cmd net start 服务 提示系统错误5 拒*访问怎么办?-CSDN论坛
12、怎么获得win7*高管理员权限
13、Win7命令提示符怎么以管理员方式打开
14、Win10系统同步Internet 时间出错的解决方法_百度经验
15、Ubuntu 14.04下时间同步的设置

windows 同步时间 cmd 命令

windows 同步时间 cmd 命令:
https://www.cnblogs.com/linkenpark/p/7776571.html

#{10.0.13.100} ntpserver,执行下面的命令后,会修改注册表的 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters\NtpServer 的值为 {10.0.13.100},0x8
C:\Users\Administrator>w32tm /config /manualpeerlist:{10.0.13.100},0x8 /syncfromflags:MANUAL
成功地执行了命令。
w32tm /config /manualpeerlist:10.0.13.100,0×8 /syncfromflags:MANUAL    #也可以不加双引号。同步局域网 ntp server

C:\Users\Administrator>net stop w32time
没有启动 Windows Time 服务。

请键入 NET HELPMSG 3521 以获得更多的帮助。

C:\Users\Administrator>net start w32time
Windows Time 服务正在启动 .
Windows Time 服务已经启动成功。

C:\Users\Administrator>w32tm /resync    #同步时间,会马上同步
将 resync 命令发送到本地计算机
此计算机没有重新同步,因为没有可用的时间数据。

C:\Users\Administrator>

服务器时间同步是一个容易被忽视的问题,但在企业级应用环境中,不同服务器之间的时间差很可能引发应用系统问题。Windows提供的w32tm程序可以用来设置时间同步服务器,其用法如下:
1、指定外部时间源并与之同步
w32tm /config /manualpeerlist:”210.72.145.44″ /syncfromflags:manual /reliable:yes /update
/manualpeerlist表示外部时间源服务器列表,多个服务器之间可用空格分隔,210.72.145.44是中国国家授时中心的时间服务器ip地址
/syncfromflags:manual表示与指定的外部时间源服务器列表中的服务器进行同步
/reliable:yes设置此计算机是一个可靠的时间源。此设置只对域控制器有意义。
/update向时间服务发出配置已更改的通知,使更改生效
2、显示本地时间与目的时间的时间差
w32tm /stripchart /computer:210.72.145.44 /samples:30 /dataonly
3、显示目前服务器指定的外部时间源
w32tm /query /source
4、恢复Windows Time Service的预设值
net stop w32time
w32tm /unregister
w32tm /register
net start w32time
在域环境中,只需设置根域控制器的外部时间源即可,其它服务器在添加进域中时将自动设置与域控制器时间同步。
改设置可解决域控制器的时间同步问题 如:Time-Service EventID:36
更多用法详见w32tm的帮助吧

windows下ntp时间校对

网上下的没法用。找了个老外弄的,在win7+管理员权限工作正常。

下面的代码放在头文件中:

  1. #define ReverseEndianInt(x) ((x) = \
  2. ((x)&0xff000000) >> 24 |\
  3. ((x)&0x00ff0000) >> 8 |\
  4. ((x)&0x0000ff00) << 8 |\
  5. ((x)&0x000000ff) << 24)
  6. /**
  7. * NTP Fixed-Point Timestamp Format.
  8. * From [RFC 5905](http://tools.ietf.org/html/rfc5905).
  9. */
  10. struct Timestamp
  11. {
  12. unsigned int seconds; /**< Seconds since Jan 1, 1900. */
  13. unsigned int fraction; /**< Fractional part of seconds. Integer number of 2^-32 seconds. */
  14. /**
  15. * Reverses the Endianness of the timestamp.
  16. * Network byte order is big endian, so it needs to be switched before
  17. * sending or reading.
  18. */
  19. void ReverseEndian() {
  20. ReverseEndianInt(seconds);
  21. ReverseEndianInt(fraction);
  22. }
  23. /**
  24. * Convert to time_t.
  25. * Returns the integer part of the timestamp in unix time_t format,
  26. * which is seconds since Jan 1, 1970.
  27. */
  28. time_t to_time_t()
  29. {
  30. return (seconds ((70 * 365 + 17) * 86400))&0x7fffffff;
  31. }
  32. };
  33. /**
  34. * A Network Time Protocol Message.
  35. * From [RFC 5905](http://tools.ietf.org/html/rfc5905).
  36. */
  37. struct NTPMessage
  38. {
  39. unsigned int mode :3; /**< Mode of the message sender. 3 = Client, 4 = Server */
  40. unsigned int version :2; /**< Protocol version. Should be set to 3. */
  41. unsigned int leap :2; /**< Leap seconds warning. See the [RFC](http://tools.ietf.org/html/rfc5905#section-7.3) */
  42. unsigned char stratum; /**< Servers between client and physical timekeeper. 1 = Server is Connected to Physical Source. 0 = Unknown. */
  43. unsigned char poll; /**< Max Poll Rate. In log2 seconds. */
  44. unsigned char precision; /**< Precision of the clock. In log2 seconds. */
  45. unsigned int sync_distance; /**< Round-trip to reference clock. NTP Short Format. */
  46. unsigned int drift_rate; /**< Dispersion to reference clock. NTP Short Format. */
  47. unsigned char ref_clock_id[4]; /**< Reference ID. For Stratum 1 devices, a 4-byte string. For other devices, 4-byte IP address. */
  48. Timestamp ref; /**< Reference Timestamp. The time when the system clock was last updated. */
  49. Timestamp orig; /**< Origin Timestamp. Send time of the request. Copied from the request. */
  50. Timestamp rx; /**< Recieve Timestamp. Reciept time of the request. */
  51. Timestamp tx; /**< Transmit Timestamp. Send time of the response. If only a single time is needed, use this one. */
  52. /**
  53. * Reverses the Endianness of all the timestamps.
  54. * Network byte order is big endian, so they need to be switched before
  55. * sending and after reading.
  56. *
  57. * Maintaining them in little endian makes them easier to work with
  58. * locally, though.
  59. */
  60. void ReverseEndian() {
  61. ref.ReverseEndian();
  62. orig.ReverseEndian();
  63. rx.ReverseEndian();
  64. tx.ReverseEndian();
  65. }
  66. /**
  67. * Recieve an NTPMessage.
  68. * Overwrites this object with values from the recieved packet.
  69. */
  70. int recv(int sock)
  71. {
  72. int ret = ::recv(sock, (char*)this, sizeof(*this), 0);
  73. ReverseEndian();
  74. return ret;
  75. }
  76. /**
  77. * Send an NTPMessage.
  78. */
  79. int sendto(int sock, struct sockaddr_in* srv_addr)
  80. {
  81. ReverseEndian();
  82. int ret = ::sendto(sock, (const char*)this, sizeof(*this), 0, (sockaddr*)srv_addr, sizeof(*srv_addr));
  83. ReverseEndian();
  84. return ret;
  85. }
  86. /**
  87. * Zero all the values.
  88. */
  89. void clear()
  90. {
  91. memset(this, 0, sizeof(*this));
  92. }
  93. };

调用:

  1. WSADATA wsaData;
  2. DWORD ret = WSAStartup(MAKEWORD(2,0), &wsaData);
  3. char *host = “pool.ntp.org”; /* Don’t distribute stuff pointing here, it’s not polite. */
  4. //char *host = “time.nist.gov”; /* This one’s probably ok, but can get grumpy about request rates during debugging. */
  5. NTPMessage msg;
  6. /* Important, if you don’t set the version/mode, the server will ignore you. */
  7. msg.clear();
  8. msg.version = 3;
  9. msg.mode = 3 /* client */;
  10. NTPMessage response;
  11. response.clear();
  12. int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  13. sockaddr_in srv_addr;
  14. memset(&srv_addr, 0, sizeof(srv_addr));
  15. dns_lookup(host, &srv_addr); /* Helper function defined below. */
  16. msg.sendto(sock, &srv_addr);
  17. response.recv(sock);
  18. time_t t = response.tx.to_time_t();
  19. char *s = ctime(&t);
  20. printf(“The time is %s.”, s);
  21. WSACleanup();
  1. int dns_lookup(const char *host, sockaddr_in *out)
  2. {
  3. struct addrinfo *result;
  4. int ret = getaddrinfo(host, “ntp”, NULL, &result);
  5. for (struct addrinfo *p = result; p; p = p->ai_next)
  6. {
  7. if (p->ai_family != AF_INET)
  8. continue;
  9. memcpy(out, p->ai_addr, sizeof(*out));
  10. }
  11. freeaddrinfo(result);
  12. }

/*

**time_t转SYSTEMTIME

*/

SYSTEMTIME TimetToSystemTime(time_t t)

{

FILETIME ft;

SYSTEMTIME pst;

LONGLONG nLL = Int32x32To64(t, 10000000) + 116444736000000000;

ft.dwLowDateTime = (DWORD)nLL;

ft.dwHighDateTime = (DWORD)(nLL >> 32);

FileTimeToSystemTime(&ft, &pst);

return pst;

}

 

Windows ntp详解

ntp配置和时间同步
在命令提示符中执行如下命令,重启服务:
C:\>net stop w32time
C:\>net start w32time

设置NTP服务器地址
以管理员身份打开命令提示符,请依次单击
「开始」–“所有程序”–“附件”–右键单击“命令提示符”–“以管理员身份运行” ,如果出现“用户帐户控制”对话框,请确认所显示的是您要执行的操作,然后单击“继续”。在命令提示符下键入以下命令(PeerList 是以逗号分隔的DNS 名称或时间源IP 地址列表):
C:\> w32tm /config /syncfromflags:MANUAL /manualpeerlist:”168.1.2.3,0×08 168.4.5.6,0×08″ /update
C:\> w32tm /resync /rediscover

完成后输入以下命令查看当前时间服务器设置:
C:\> w32tm /query /peers

启动自动时间同步服务
修改Windows Time服务为自启动:
进入服务管理器,将Windows Time调整为 “自动(延迟启动)”

修改完毕后需重启Windows Time服务。
也可在命令提示符中键入以下命令,重启服务:

C:\>net stop w32time
C:\>net start w32time

可以进入命令行模式,查看当前Windows Time服务运行情况:
C:\>w32tm /query /status

配置Windows为NTP服务器

建议使用 ntpd for windows,这是一个ntp的windows版,操作和linux相似

下载:https://www.meinbergglobal.com/english/sw/ntp.htm#ntp_nt

目前版本是ntp-4.2.8p7,经测试可以在win7上使用。

1、下载安装,都很简单,下一步完成。

2、配置,基本和linux差不多,安装应用目录

%title插图%num

点击Edit Ntp Configuration,进行ntp配置,参考linux配置

#默认拒*所有来源的任何访问
restrict default noquery nopeer nomodify notrap  
restrict -6 default noquery nopeer nomodify notrap  
 
# allow status queries and everything else from localhost 
# 允许本地访问
restrict 127.0.0.1 
restrict -6 ::1 

# if you need to allow access from a remote host, you can add lines like this: 
# restrict <IP OF REMOTE HOST> 
# 设置自己需要访问的网段地址
restrict 10.102.145.0 mask 255.255.255.0 nomodify
restrict 10.20.0.0 mask 255.255.0.0 nomodify

# Use drift file 
driftfile "C:\Program Files (x86)\NTP\etc\ntp.drift"

# your local system clock, could be used as a backup
# (this is only useful if you need to distribute time no matter how good or bad it is)
# 按自己需求增加上层NTP服务器
server 0.centos.pool.ntp.org prefer
server 1.centos.pool.ntp.org
server 2.centos.pool.ntp.org
server us.npt.org.cn 

# but it should operate at a high stratum level to let the clients know and force them to
# use any other timesource they may have.
fudge 127.127.1.0 stratum 10

# End of generated ntp.conf --- Please edit this to suite your needs

使用菜单中的Restart Ntp Server 重启服务。

使用Quick NTP Status查看NTP服务的状态,其实就是 watch ntpq -p;如果如下图,基本就成功了

%title插图%num%title插图%num

然后就是你的服务器端设置了。

下面再说下一些术语解释:

# 1. 关于权限设定部分
#   权限的设定主要以 restrict 这个参数来设定,主要的语法为:
#   restrict IP mask netmask_IP parameter
#   其中 IP 可以是软件地址,也可以是 default ,default 就类似 0.0.0.0
#   至于 paramter 则有:
#   ignore :关闭所有的 NTP 联机服务
#   nomodify:表示 Client 端不能更改 Server 端的时间参数,不过,

#   Client 端仍然可以透过 Server 端来进行网络校时。
#   notrust :该 Client 除非通过认证,否则该 Client 来源将被视为不信任网域
#   noquery :不提供 Client 端的时间查询

#   notrap :不提供trap这个远程事件登入

#  如果 paramter 完全没有设定,那就表示该 IP (或网域)“没有任何限制”

restrict default nomodify notrap noquery # 关闭所有的 NTP 要求封包
restrict 127.0.0.1    #这是允许本级查询

#在192.168.0.1/24网段内的服务器就可以通过这台NTP Server进行时间同步了
restrict 192.168.0.1 mask 255.255.255.0 nomodify

# 2. 上层主机的设定
#  要设定上层主机主要以 server 这个参数来设定,语法为:
#  server [IP|HOST Name] [prefer]
#  Server 后面接的就是我们上层 Time Server 啰!而如果 Server 参数
#  后面加上 perfer 的话,那表示我们的 NTP 主机主要以该部主机来作为
#  时间校正的对应。另外,为了解决更新时间封包的传送延迟动作,
#  所以可以使用 driftfile 来规定我们的主机
#  在与 Time Server 沟通时所花费的时间,可以记录在 driftfile
#  后面接的文件内,例如下面的范例中,我们的 NTP server 与
#  cn.pool.ntp.org联机时所花费的时间会记录在 /etc/ntp/drift文件内
server 0.pool.ntp.org

server 1.pool.ntp.org

注:windows原生的做ntp服务不是很稳定,建议重要环境不要使用,不然要死翘翘

1. 修改注册表项

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer

Enabled 设定为 1(默认0)

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\

AnnounceFlags 设定为 5 (默认 10)

2. 禁用防火墙或设置例外,UDP 123端口。

3. 运行 services.msc,将Windows Time服务设置成自动(延迟启动)

 

网络设备(如cisco、h3c交换机……)不能正常同步NTP服务器时间:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\LocalClockDispersion
值修改为0 (默认为0x0000000a)

python中的传值和传引用

和其他语言不一样,传递参数的时候,python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值’来传递对象。

python一般内部赋值变量的话,都是传个引用变量,和C语言的传地址的概念差不多。可以用id()来查询内存地址

如果a=b的话, a和b的地址是相同的;如果只是想拷贝,那么就得用 a=b[:]。

!!!注意这一点,这可是可以引起重大错误的。。。