浅谈daytime协议和时间协议

网络 网络管理
这里我们针对daytime协议的内容进行一下简单的介绍。首先我们针对这个协议的概念进行了分析,之后对于时间协议的内容也做了介绍。

这次我们主要讲解一下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为美国标准技术院,采用格灵威时间

  1. 时间格式:53212 04-07-26 02:00:12 50 0 0 488.3 UTC(NIST) *  
  2. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)  
  3. Dim NoSrv As Boolean  
  4. Dim TimeFromNet  
  5. Private Sub Form_Load()  
  6. Winsock1.Protocol = sckTCPProtocol '采用TCP协议  
  7. NetTime "www.time.ac.cn" '首先取中科院国家授时中心时间  
  8. If NoSrv Or TimeFromNet = "" Then 

若未取到中科院国家授时中心时间,则取美国标准技术院时间

  1. NetTime "time.nist.gov"  
  2. If NoSrv Or TimeFromNet = "" Then 

若不能取美国标准技术院时间,则报错

  1. MsgBox "检测不到网络标准时间服务器time.nist.gov!"  
  2. Else 

为使网络传输误差减小,第2次再取美国标准技术院时间

  1. NetTime "time.nist.gov" 
  2. If TimeFromNet = "" Then  
  3. MsgBox "网络标准时间服务器time.nist.gov超时!" 
  4. Else  
  5. TimeFromNet = Mid(TimeFromNet, 17, 8)  
  6. TimeFromNet = TimeSerial((Hour(TimeFromNet) + 8) Mod 24, Minute(TimeFromNet), Second(TimeFromNet))  
  7. Time = TimeFromNet '设置系统时间  
  8. End If  
  9. End If  
  10. Else 

为使网络传输误差减小,第2次再取中科院国家授时中心时间#p#

  1. NetTime "www.time.ac.cn" 
  2. If TimeFromNet = "" Then  
  3. MsgBox "网络标准时间服务器www.time.ac.cn超时!" 
  4. Else  
  5. Time = Mid(TimeFromNet, 12, 8) '设置系统时间  
  6. End If  
  7. End If  
  8. End  
  9. End Sub 

关闭Winsock子程序

  1. Private Sub Winsock1_Close()  
  2. If Winsock1.State <> sckClosed Then  
  3. Winsock1.Close  
  4. End If  
  5. End Sub 

Winsock接收数据事件

  1. Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)  
  2. TimeFromNet = String(bytesTotal, " ")  
  3. Winsock1.GetData TimeFromNet, vbString, bytesTotal  
  4. End Sub 

Winsock出错事件

  1. 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)  
  2. NoSrv = True  
  3. End Sub 

从互联网上标准时间提供网站获取标准时间

  1. Private Sub NetTime(TimeSrv As String)  
  2. NoSrv = False  
  3. TimeFromNet = "" 
  4. If Winsock1.State <> sckClosed Then Winsock1.Close  
  5. Winsock1.RemoteHost = TimeSrv ' "www.time.ac.cn" 或 "time.nist.gov" 
  6. Winsock1.RemotePort = 13  
  7. Winsock1.LocalPort = 0  
  8. Winsock1.Connect  
  9. Do While TimeFromNet = "" '循环等待标准时间网站返回时间数据  
  10. If NoSrv Then Exit Do '若Winsock出错,则跳出循环等待  
  11. Sleep 55  
  12. DoEvents  
  13. Loop  
  14. If Winsock1.State <> sckClosed Then Winsock1.Close  
  15. 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位的时间值,然后关闭连接.这个过程也不难,如果服务器不能决定现在是什么时间,服务器会拒绝连接或不发送任何数据而直接关闭连接.

责任编辑:佟健 来源: hi.baidu.com
相关推荐

2010-09-10 14:25:00

Daytime协议

2011-08-03 15:51:48

Objective-C 协议 委托

2011-08-24 09:56:13

网络协议BOOTP协议TFTP协议

2010-07-30 15:04:02

协议配置

2010-06-12 17:07:17

TCP IP协议

2022-09-28 11:09:38

自动化产品工业协议

2023-03-06 08:42:45

KCP移动开发

2010-06-09 14:42:21

UDP协议TCP协议

2010-07-05 16:51:25

NetBIOS协议

2010-07-12 17:13:12

SNMP协议管理

2012-09-03 09:16:50

多层次个别分层数据中心网络

2010-07-02 09:28:18

IP交换机GSMP协议IFMP协议

2010-09-17 14:49:18

Ethereal网络协

2010-09-08 15:06:26

蓝牙协议栈

2009-12-14 17:32:46

路由选择协议

2010-07-28 16:07:30

NFS协议pNFS

2011-12-06 09:32:19

2010-07-07 17:56:21

2010-06-12 17:28:35

协议封装

2010-09-09 15:25:35

网络协议
点赞
收藏

51CTO技术栈公众号