WHY

在网络世界中, 各个计算机之间要想协同工作, 时间同步是一个十分重要的基础. 在计算机内部是有自己的时间的, 这个时间通过内部的晶体振荡器差生的固定频率, 来模拟时间流逝进行计算. 虽然频率十分稳定, 但也是有误差的, 虽然现在的工艺水平误差已经十分小了. (关于震荡的具体原理, 在此不表)

既然本地时间会产生误差, 那么就会造成两台服务器的时间不一致. 要消除不一致, 就需要有一个统一的时间标准, 然后大家都以这个标准为基准时间并对自己的本地时间进行校准, 既协调国际时(UTC), 关于这个时间是怎么来的, 不是本文讨论的重点.

好了, 现在, 在另一个地方, 有一个标准时间, 如何将这个标准时间通过网络同步到你的本地计算机呢? 如何在同步的过程中, 尽量消除网络延迟带来的影响呢?

HOW

如果直接进行网络请求, 然后拿到一个返回时间戳并修改本地时间可不可以呢? 显然不行. 别忘了, 包在网络中传输也是需要时间的, 这个请求从对方发出, 至到达本地计算机, 经过了多久你并不知道, 这中间的延迟会严重影响时间校准的结果.

OK, 现在遇到的问题就是网络延时了, 如果能够消除网络延迟, 就可以精准同步了, 但以现在的技术水平是做不到的. 既然延时无法消除, 如果我们能够知道这个延时的时间, 也可以通过计算消除延迟的影响.

包在网络中的传输大致如图:

其中各值如下:

  • C1: 客户端发出请求的本地时间
  • C2: 客户端接收到返回的本地时间
  • S1: 时间服务器接收到请求的服务器时间
  • S2: 时间服务器发出响应的服务器时间
  • SC1: 客户端发出请求时的服务器时间
  • SC2: 客户端接收到返回的服务器时间
  • CS1: 时间服务器收到请求时的本地时间
  • CS2: 时间服务器发出响应时的本地时间

我们现在的目的看起来很简单, 就是在接受到返回的时候, 将本地时间C2 校准为SC2. 首先要明确的是, C2SC2是不想等的, 否则二者时间相同就不需要校准了嘛.

首先, 我们本地知道的信息有: C1, C2, 可以令服务器在返回结果中, 告诉我们S1, S2. 并且, 我们假定网络中的延时是基本固定的, 既S1-C1=C2-S2.

好了, 现在已经成功的将其转换成了一道数学题. 是不是突然发现简单了许多? 步骤如下:

  • da = (C2 - C1) - (S2 - S1) # 总延时时长
  • d = da / 2 # 单次延时时长
  • SC1 = S1 - d
  • SC2 = SC1 + (C2 - C1)

如何? 很巧妙的将网络延时消除了.

以上, 就是时间同步ntp协议的内容了. 不过, 如此同步的时间也是有误差的, 首先上面就假设了往返的网络延时相同, 如果延时不对称, 则同步结果就会不准确, 而且, 协议跑在应用层, 从物理层到应用层之间的时延也会影响最终结果.

应用

我们在实际实际编程中, 经常会写入类似这样的代码:

$t1 = time();
// do someting...
$t2 = time();

如果, 在获取$t1变量后, 正巧进行了时间同步, 那么$t2有可能小于$t1, 岂不是很诡异. 不过还好, 有不同的同步方式供我们选择, 以下在Ubuntu系统上进行了测试.

  • ntp: 时间平滑过度, 保证本地时间递增, 一点点减少本地与远端的时间差.
  • ntpdate: 立即进行同步, 这种功能情况就可能出现上面$t2小于$t1的场景

不过, 在我的服务器Ubuntu 18上, 已经默认不再使用ntp工具了, 转而使用timedatectl, 其内部协议是一样的, 有关timedatectl的详细内容可以参考一下官网的说明: https://ubuntu.com/server/docs/network-ntp

计算机是如何进行时间同步的相关推荐

  1. 让计算机时间和网络时间同步,如何让电脑时间与北京时间同步?

    你的电脑时间不能与北京时间同步?是不是一重启电脑时间就不准了?请不要着急,本文将教你解决电脑时间出错问题,无需复杂的操作. 一.使用系统自带的时间同步功能 双击屏幕右下角的时间--进入"日期 ...

  2. 计算机网络的时间,计算机网络时间同步技术原理介绍

    1.前言 由计算机网络系统组成的分布式系统,若想协调一致进行:IT行业的"整点开拍"."秒杀"."Leader选举",通信行业的" ...

  3. 网络时间同步(卫星时钟同步系统)技术原理介绍

    网络时间同步(卫星时钟同步系统)技术原理介绍 网络时间同步(卫星时钟同步系统)技术原理介绍 1.前言 由计算机网络系统组成的分布式系统,若想协调一致进行:IT行业的"整点开拍".& ...

  4. 网络时间协议服务器检测,NTP(网络时间协议)【NTP时间同步服务器】

    网络时间协议(英语:Network Time Protocol,简称NTP)是在数据网络潜伏时间可变的计算机系统之间通过分组交换进行时钟同步的一个网络协议之一.NTP由特拉华大学David.Mills ...

  5. GPS时间同步系统揭秘各种时间同步方式

    GPS时间同步系统揭秘各种时间同步方式 GPS时间同步系统揭秘各种时间同步方式 1.前言 由计算机网络系统组成的分布式系统,若想协调一致进行:IT行业的"整点开拍"."秒 ...

  6. linux时间同步命令sntp,教你如何如何进行域内时间同步及时间常用命令总结

    域内各个服务器的时间保持一致,是一个很重要而又往往又容易被人忽略的问题,如果时间不同步或出现异常,往往会出现以下问题: 1. 服务器上应用程序Server端无法获取准确的日期,导致反馈给客户端的日期时 ...

  7. 北斗授时服务器(时钟系统)是如何完成时间同步的

    北斗授时服务器(时钟系统)是如何完成时间同步的 北斗授时服务器(时钟系统)是如何完成时间同步的 1.前言 由计算机网络系统组成的分布式系统,若想协调一致进行:IT行业的"整点开拍" ...

  8. ntp如何确认与服务器偏差_NTP时间同步服务器(NTP服务器)原理详解

    NTP时间同步服务器(NTP服务器)原理详解 NTP时间同步服务器(NTP服务器)原理详解 1.前言 由计算机网络系统组成的分布式系统,若想协调一致进行:IT行业的"整点开拍".& ...

  9. windows 2016 域服务器时间同步

    最近发现公司的域控制器和域内的计算机时间与internet上的时间不同步,老是慢几分钟. 解决办法: 设置NTP服务器,和外网时间同步.以下是设置步骤: 修改PDC主域控制器上同步Internet时间 ...

最新文章

  1. jsp中的basePath和path (绝对路径 相对路径)
  2. java类方法不可见_使java方法仅对特定类可见
  3. python格式化输出区别_python格式化输出的区别
  4. c语言中的switch语句中的break和continue的作用
  5. Twemproxy调研总结
  6. 45万年薪web前端工程师,给你一条“不归路”-系统的web前端学习路线
  7. java.lang.IllegalArgumentException 不合法的参数异常
  8. C++实现Behavioral - Observer模式 (转)
  9. 三方演化博弈复制动态方程matlab仿真(输入参数较多时)——matlab2016a版本
  10. IDEA2019安装及PJ
  11. 五子棋(人人对战、人机对战均可)
  12. [转载] 胡锡进:5000亿买一包爆米花 我不想让我的国家这样
  13. 人工智能相关概念整理
  14. FPGA学习日志——分频与降频divider
  15. CSAPP LAB4 键盘驱动程序的分析与修改(谢罪)
  16. 使用appium进行app自动化测试时遇到AppActivity设置正确但报Connect Appium Server Fail.A new session could not be created
  17. LAMP-Discuz
  18. 洪泰基金俞敏洪:创业24年,我的五点思考
  19. word标尺灰色_如何在Microsoft Word 2013中更改标尺测量单位
  20. 南邮离散数学试卷2023(含答案)

热门文章

  1. web处理高并发措施
  2. 现代软件工程讲义 个人项目和结对项目练习 地铁
  3. Linux中.rpm,Linux中rpm的使用
  4. hashmap扩容机制_图文并茂:HashMap经典详解!
  5. linux共享文件系统sy,Linux使用Samba实现文件共享
  6. javascript 校验 非空_Javascript的表单与验证-非空验证
  7. php json 循环输出html,我要用js从json文件中取值,并输出的html页面,有个问题
  8. mysql日期纬度表_mysql中生成时间维度表
  9. myeclipse怎么创建jframe类_创建型-建造者模式
  10. python基本判断语句_python基础4 - 判断(if)语句