这次我们主要讲解一下daytime协议和时间协议相关服务的问题,让我们一起来了解一下daytime协议、时间协议的内容吧。在一个局域网中,许多系统都要求每台计算机能够保持时间的一致性,WIN2000系统提供了与主域服务器时间同步功能,即工作站只要登录到主域服务器,工作站系统的时间自动与主域服务器时间一致,但接下来的问题是我们如何使主域服务器的时间同步世界标准时间.如要获得世界标准时间,比较精确的做法是使用GPS卫星时钟获得毫秒级精度的标准时间,但这是要money的哦.如果我们在时间精度上只需要秒级的,又能够连接到Internet,则我们可以利用Internet上的标准时间服务器获得标准时间.
事实上在Internet上有三个不同的时间服务,每一个都由Request for Comment(RFC)定义为Internet日期时间标准.这三个标准分别为:RFC-867、RFC-868和RFC-1305.下面就先介绍RFC-867:
RFC867 Daytime协议(RFC867 Daytime Protocol)
本RFC规范了一个ARPA Internet community上的标准.在ARPA Internet上的所有主机应当采用和实现这个标准.
一个有用的测量和调试工具就是daytime协议服务.它的作用就是返回当前时间和日期,格式是字符串格式.
◆基于TCP的daytime服务
daytime服务是基于TCP的应用,服务器在TCP端口13侦听,一旦有连接建立就返回ASCII形式的日期和时间(接收到的任何数据被忽略),在传送完后关闭连接.
◆基于UDP的daytime协议服务
daytime服务也可以使用UDP协议,它的端口也是13,不过UDP是用数据报传送当前时间的.接收到的数据被忽略.
◆Daytime格式
对于daytime协议没有特定的格式,建议使用ASCII可打印字符,空格和回车换行符.daytime应该在一行上.
下面是两种流行的格式:
一种流行的格式是:Weekday, Month Day, Year Time-Zone
例子:Tuesday, February 22, 1982 17:37:43-PST
另一种流行的格式用于SMTP中:dd mmm yy hh:mm:ss zzz
例子:02 FEB 82 07:59:01 PST
注意:对于机器来说,有用的时间采用了时间协议(Time Protocol RFC-868)
接下来我们用VB程序实现通过RFC867协议设置我们自己的计算机系统时间,为使程序简化,程序未进行日期校正,只进行时间校正.在FORM1中添加1个Winsock控件,将下面代码剪贴到FORM1的代码窗体中即可:
Option Explicit
采用RFC867 Daytime协议获取标准时间例程
www.time.ac.cn为中科院国家授时中心,采用北京时间
时间格式:Mon Jul 26 09:58:57 2004
time.nist.gov为美国标准技术院,采用格灵威时间
- 时间格式:53212 04-07-26 02:00:12 50 0 0 488.3 UTC(NIST) *
- Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
- Dim NoSrv As Boolean
- Dim TimeFromNet
- Private Sub Form_Load()
- Winsock1.Protocol = sckTCPProtocol '采用TCP协议
- NetTime "www.time.ac.cn" '首先取中科院国家授时中心时间
- If NoSrv Or TimeFromNet = "" Then
若未取到中科院国家授时中心时间,则取美国标准技术院时间
- NetTime "time.nist.gov"
- If NoSrv Or TimeFromNet = "" Then
若不能取美国标准技术院时间,则报错
- MsgBox "检测不到网络标准时间服务器time.nist.gov!"
- Else
为使网络传输误差减小,第2次再取美国标准技术院时间
- NetTime "time.nist.gov"
- If TimeFromNet = "" Then
- MsgBox "网络标准时间服务器time.nist.gov超时!"
- Else
- TimeFromNet = Mid(TimeFromNet, 17, 8)
- TimeFromNet = TimeSerial((Hour(TimeFromNet) + 8) Mod 24, Minute(TimeFromNet), Second(TimeFromNet))
- Time = TimeFromNet '设置系统时间
- End If
- End If
- Else
为使网络传输误差减小,第2次再取中科院国家授时中心时间#p#
- NetTime "www.time.ac.cn"
- If TimeFromNet = "" Then
- MsgBox "网络标准时间服务器www.time.ac.cn超时!"
- Else
- Time = Mid(TimeFromNet, 12, 8) '设置系统时间
- End If
- End If
- End
- End Sub
关闭Winsock子程序
- Private Sub Winsock1_Close()
- If Winsock1.State <> sckClosed Then
- Winsock1.Close
- End If
- End Sub
Winsock接收数据事件
- Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
- TimeFromNet = String(bytesTotal, " ")
- Winsock1.GetData TimeFromNet, vbString, bytesTotal
- End Sub
Winsock出错事件
- Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
- NoSrv = True
- End Sub
从互联网上标准时间提供网站获取标准时间
- Private Sub NetTime(TimeSrv As String)
- NoSrv = False
- TimeFromNet = ""
- If Winsock1.State <> sckClosed Then Winsock1.Close
- Winsock1.RemoteHost = TimeSrv ' "www.time.ac.cn" 或 "time.nist.gov"
- Winsock1.RemotePort = 13
- Winsock1.LocalPort = 0
- Winsock1.Connect
- Do While TimeFromNet = "" '循环等待标准时间网站返回时间数据
- If NoSrv Then Exit Do '若Winsock出错,则跳出循环等待
- Sleep 55
- DoEvents
- Loop
- If Winsock1.State <> sckClosed Then Winsock1.Close
- End Sub
上面介绍了RFC-867标准和VB例程,显然RFC-867标准采用返回当前时间和日期的格式是字符串格式以及对于daytime协议没有特定的格式(例如:中科院国家授时中心为"Mon Jul 26 09:58:57 2004",而美国标准技术院为"53212 04-07-26 02:00:12 50 0 0 488.3 UTC(NIST)"),这2点似乎都不是太舒服,因此我们希望Internet上的标准时间服务器***能够返回具有标准格式的数字类型数据,其实RFC在制定RFC-867标准时已经考虑了我们的意见,因为他同时还推出了RFC-868标准,下面就介绍RFC-868:
RFC868 时间协议(RFC868 Time Protocol)
本RFC规范了一个ARPA Internet community上的标准.在ARPA Internet上的所有主机应当采用和实现这个标准.此协议提供了一个独立于站点的,机器可读的日期和时间信息.时间服务返回的是以秒数,是从1900年1月1日午夜到现在的秒数,天哪,也不小呢.设计这个协议的一个重要目的在于,网络上的许多主机并没有时间的观念,在分布式的系统上,我们可以想一想,北京的时间和东京的时间如何分呢?主机的时间往往可以人为改变,而且因为机器时钟内的误差而变得不一致,因此需要使用时间服务器通过选举方式得到网络时间,让服务器有一个准确的时间观念.不要小看时间,这对于一些以时间为标准的分布运行的程序简单是太重要了.
这个协议可以工作在TCP和UDP协议下.下面是通过TCP协议工作的时间协议的工作过程:这里S代表服务器,U代表客户.
S: 检测端口37
U: 连接到端口37
S: 以32位二进制数发送时间
U: 接收时间
U: 关闭连接
S: 关闭连接
服务器在端口37上监听连接.当连接建立后,服务器返回一个32位的时间值,然后关闭连接.这个过程也不难,如果服务器不能决定现在是什么时间,服务器会拒绝连接或不发送任何数据而直接关闭连接.