Saturday, October 25, 2008

你的窗户准时么?

前段时间主板CMOS电池没电了,操作系统显示的时间总是会出错。所幸在Ubuntu下进行Time Synchronization非常的容易,任何时候想要同步时间,只用运行一把ntpdate便可(也可以设置cron定时运行之)。


但是在Windows下滴童鞋就不那么幸运了,每次在Win下想要同步时间似乎都会出错,所以很多人也就直接放弃了。比如学校某位仁兄的电脑便是如此,时间“误差”已经达到了一天多之巨(请各位看此文滴资深物理老师莫提醒俺“误差”和“错误”的区别)。



  • 此文就是针对这个问题,提出解决方案——
    通过修改时间服务器(Time Server)和同步频率(Frequency of Synchronization),以达到CMOS电池没电后、依旧保持时间准确无误滴目的!


首先引入NTP(Network Time Protocol)协议,关于此协议较为详细的介绍可以参见NTP的wikipedia页面


The Network Time Protocol (NTP) is a protocol for distributing the Coordinated Universal Time (UTC) by means of synchronizing the clocks of computer systems over packet-switched, variable-latency data networks. NTP uses UDP port 123 as its transport layer. It is designed particularly to resist the effects of variable latency by using a jitter buffer.


可见NTP的目的是使得在基于分组交换的、不同延时环境的计算机网络中,各个clients能够和某些准确的time servers同步时间。也正是由于不同延时环境的存在,NTP的同步不可能达到完全准确,也不能保证每次同步都是高质量,但是已经相当不错了(依旧在不断发展中,比如当前正在开发过程中的NTPv5)——


NTP uses Marzullo's algorithm with the UTC time scale, including support for features such as leap seconds. NTPv4 can usually maintain time to within 10 milliseconds (1/100 s) over the public Internet, and can achieve accuracies of 200 microseconds (1/5000 s) or better in local area networks under ideal conditions.


如何?是不是很精确?误差控制在1秒内,咱们普通的个人家庭电脑用户也都可以承受了。好,理论部分的科普到此结束,其他的,例如clock stratum结构*nix平台的Y2038 problem(有图示在此)、NTP的当前发展方向,这里就不说了,有兴趣滴童鞋自己去翻wikipedia浏览一下吧。


进入针对Windows平台的实战部分(*nix用户参考此文档便可)。针对Vista平台的情况没有尝试,看官自行根据情况斟酌下咯。


|---------------------------------------------------------|
|---------------------------------------------------------|


Windows已经实现了NTP协议(应该是NTPv4),所以只需要选择一个速度较快的基于NTP的时间服务器更新便可。三种主要类型的时间同步服务器list链接:



我们选择第一个链接便可以了,要求更高精确度的童鞋可选择Secondary甚至是Primary时间服务器。作为亚洲用户,选择asia.pool.ntp.org便可。



  • 打开regedit,定位到“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers”,删除其中的两个几乎从来就连不上的时间服务器,新建一个字符串值,命名为“1”,数据为纯文本的“asia.pool.ntp.org”。“(默认)”的值修改成“1”,也就是表示在默认情况下使用你建立的这个服务器作为同步服务器。


OK,搞定了。试一试更新看看!成功了吧?



Windows默认的同步时间频率是7天,对于CMOS电池没电滴童鞋来说,这个时间可是太长了些,如何改短一点?



  • 定位到“HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\W32Time\TimeProviders\NtpClient”,有一个双字DWORD数据SpecialPollInterval,十进制数值是604800,也就是7天所对应的秒数。将其修改成为7200、也就是2小时的同步更新频率了。


ps.
NTP协议是最古老、也是生命力最强的互联网协议之一。整个协议层很复杂,有兴趣的同学可以下载代码研究之。

No comments:

Post a Comment