时间服务器通讯协议

目录

第1章通讯协议    1

1.1 RFC-868    1

1.2 time/UDP    2

1.3 NTP    3

1.3.1 客户端给服务器发送请求    3

1.3.2 服务器给客户端的回复    5

1.3.3 网络延时    5

第1章通讯协议

通过访问时间服务器,就可以获得精准的时间。Windows7自带访问时间服务器的功能,如下图所示:

这里就存在一个问题了:如何才能获得时间服务器time.windows.com上的时间?这就需要了解时间服务器的通讯协议了。

1.1 RFC-868

使用RFC-868通讯协议,客户端获取时间的步骤为:

1、客户端使用TCP连接服务器的37号端口;

2、服务器给客户端发送一个时刻;

3、服务器立即断开TCP连接。及时断开TCP连接是为了更快的响应其他用户的时间询问请求。

这里关键的就是第2步——服务器给客户端返回的时刻格式。事实上,这个时间数据简单得就是一个4字节(32位)的无符号整数。如:


D7 C6 3D 77

这个整数0xD7C63D77(即高位在前,低位在后)表示1900年1月1日零时到当前UTC时刻的秒数。

1900年1月1日零时过1万秒后的UTC时刻是什么?这个有些困难,如果在Windows下编程,就可借助Windows API了。直接上VC++代码:


/****************************************************************\

转换时间:32位整数(1900年1月1日到当前时刻的秒数)==>年月日时分秒

uTime    [in]     1900年1月1日到当前时刻的秒数

tmSys    [out]     年月日时分秒

\****************************************************************/

void TIME_UINT32toSYSTEM(ULONG uTime,SYSTEMTIME&tmSys)

{

SYSTEMTIME        tmSys0;

memset(&tmSys0,0,sizeof(tmSys0));

tmSys0.wYear        =    1900;

tmSys0.wMonth        =    1;

tmSys0.wDay        =    1;

FILETIME            tmFile;

SystemTimeToFileTime(&tmSys0,&tmFile);

*(unsigned __int64*)&tmFile += uTime * 10000000I64;

FileTimeToSystemTime(&tmFile,&tmSys);

}

SystemTimeToFileTime(&tmSys0,&tmFile);将1900年1月1日0时0分0秒转换为FILETIME。FILETIME其实是一个8字节(64位)无符号整数,它表示1601年1月1日0时0分0秒到当前时刻的时间,单位:秒。

代码*(unsigned __int64*)&tmFile += uTime * 10000000I64将时间由1900年1月1日0时0分0秒向后增加了uTime * 10000000I64。乘以10000000I64是为了把单位由秒换算为秒。

代码FileTimeToSystemTime(&tmFile,&tmSys)把FILETIME转换为SYSTEMTIME,现在tmSys就是服务器发来的年月日时分秒格式的UTC时刻。

注意:32位无符号整数最大为0xFFFFFFFF,用它表示秒就意味着最多表示136年。也就是说:RFC-868通讯协议返回的时间数据用来表示1900年至2035年之间的时间是没有问题的,超出这个范围的时间就会有歧义。如:服务器返回时间0,它可以被解释为1900年,也可以被解释为2036年。

1.2 time/UDP

使用time/UDP通讯协议,客户端获取时间的步骤为:

1、客户端给服务器的37号端口发送UDP数据包,即请求时间的数据包(4字节的00H);

2、服务器获得请求时间的数据包后,会给客户端返回一个UDP数据包,该数据包里包含时刻。

这里关键的就是第2步——服务器给客户端返回的时刻格式。事实上,time/UDP协议获得的时刻数据包与RFC-868协议获得的时刻数据包格式完全相同。

注意:UDP通讯没有TCP通讯稳定,有可能会丢包。

1.3 NTP

RFC-868和time/UDP协议中,服务器发来的时刻都是通过网络的,一旦网络延时过大则客户端获得的服务器时刻将与实际会有较大的偏差。NTP可以缓解这一问题(并不能彻底解决)。

使用NTP通讯协议,客户端获取时间的步骤为:

1、客户端给服务器的123号端口发送UDP数据包,即请求时间的数据包;

2、服务器获得请求时间的数据包后,会给客户端返回一个UDP数据包,该数据包里包含时刻。

可见:NTP通讯协议与time/UDP通讯协议的执行步骤完全相同,所不同的仅仅是数据包格式。

1.3.1 客户端给服务器发送请求

涉及到的结构有两个,如下表所示:


#pragma pack(push,1)

//NTP数据包里的时刻

struct NtpTime

{

public:

unsigned long coarse; //时间(秒)的整数部分

unsigned long fine; //时间(秒)的小数部分

};

//NTP 数据包。长度为 48 字节

struct NtpPkg

{

char            Flag;

char            PeerClockStratum;

char            PeerPollingInterval;

char            PeerClockPrecision;

long            RootDelay;

unsigned long    ClockDispersion;

char            ReferenceClock[4];

NtpTime        ReferenceClockUpdateTime;

NtpTime        OriginateTimeStamp;

NtpTime        ReceiveTimeStamp;

NtpTime        TransmitTimeStamp;

};

#pragma pack(pop)

给服务器发送的数据包,其实就是一个NtpPkg。其发送代码如下


#define STRATUM    0

#define POLL        4

#define PREC        -6

NtpPkg np;

memset(&np,0,sizeof(np));

int LI = 0;     //闰秒表示

int VN = 3; //版本号NTPv1请设置为1,NTPv2设置为2……

int Mode = 3; //3表示客户端发送给服务端

np.Flag    =    (LI << 6) | (VN << 3) | Mode;

SYSTEMTIME tmSys;

GetSystemTime(&tmSys);

np.OriginateTimeStamp.coarse = TIME_SYSTEMtoUINT32(tmSys);

np.PeerClockStratum        =    STRATUM;

np.PeerPollingInterval        =    POLL;

np.PeerClockPrecision    =    PREC;

np.RootDelay            =    1<<16;

np.ClockDispersion        =    1<<16;

np.RootDelay            =    htonl(np.RootDelay);

np.ClockDispersion        =    htonl(np.ClockDispersion);

m_pSocketUdp->Write((const char*)&np,sizeof(np),...);

说明:

1、最关键的代码就是m_pSocketUdp->Write((const char*)&np,sizeof(np),...);这行代码把结构NtpPkg的实例np发送给服务器;

2、NtpPkg里如下成员变量的字节数大于1,要特别注意字节顺序:

RootDelay、ClockDispersion、ReferenceClockUpdateTime、OriginateTimeStamp、ReceiveTimeStamp、TransmitTimeStamp

发送到网络或从网络接收时,它们都是高位在前,低位在后的。而Windows里,字节顺序恰恰相反。因此,发送结构前,需要调用htonl函数,把这些成员变量的字节顺序逆一下序。接收网络数据时,也需要调用ntohl函数再次逆序;

3、OriginateTimeStamp表示客户端发送请求时的本机时刻。这个不需要特别精确。它是NtpTime类型的数据,NtpTime其实是一个定点数,它表示1900年1月1日0时0分0秒至当前UTC时刻的秒数。coarse是秒数的整数部分,fine是秒数的小数部分。秒数的计算可按下式进行:

1.3.2 服务器给客户端的回复

服务器给客户端的回复也是一个NtpPkg结构。注意在Windows下,需要把RootDelay、ClockDispersion、ReferenceClockUpdateTime、OriginateTimeStamp、ReceiveTimeStamp、TransmitTimeStamp的字节顺序逆序。

比较重要的数据是ReceiveTimeStamp。如果客户端对时间的精确度要求不高,可以把它所代表的UTC时刻当做当前时刻,校准本机时间。如果客户端对时间的精确度要求很高,而且需要知道网络延迟时间,则需要进行如下的计算。

1.3.3 网络延时

做如下假定:

1、客户端发送数据包给服务器时,其本机时刻为T1;

2、服务器接收到数据包时的UTC时刻为T2,即NtpPkg里的ReceiveTimeStamp;

3、服务器发送数据包给客户端的UTC时刻为T3,即NtpPkg里的TransmitTimeStamp;

4、客户端接收到服务器传来的数据包时,本机时刻为T4;

5、客户端发送数据至服务器接收到数据,耗时为

6、服务器发送数据至客户端接收到数据,耗时为

7、客户端本机时刻与UTC时刻相差,即UTC时刻=本机时刻+

根据上面的假定,可以列出两个方程:

说明:用来把客户端本机时刻转换为UTC时刻。

上面有两个方程,但是却有三个未知数:。只有增加一个方程后才能求出未知数。现在,只能假定,即数据在客户端和服务端相互传输时其耗时相同。

求解如下方程组

可得

网络总延时

根据上面的数学公式,可以计算出网络延迟和客户端时间偏差。如下图所示:

客户端可以根据校准本机时间。

时间: 2024-08-06 19:27:59

时间服务器通讯协议的相关文章

OPC协议解析-OPC客户端与服务器通讯解析

1      OPC服务器 OPC服务器, 是指按照OPC基金组织规定的OPC规范群开发的软件驱动.OPC服务器作为中间媒介负责从数据源读取数据再跟另外一端的客户端通信.在 OPC客户端/服务器 的结构图中, 通信的发起端是, 也只能是OPC客户端.客户端和服务器的对话是双向的, 也就是说, 客户端既可以从服务器读出也可以向服务器写入. TOPC基金会定义了四种不同类型的OPC服务器.他们分别是: OPC数据访问服务器(OPC DA) – 它基于 OPC数据访问规范, 是一种为实时数据通讯特别定

信息安全系统设计基础实验五:通讯协议设计

北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级:52.53 姓名:王思亓 赵阳林 学号:20135205 20135334 成绩: 指导教师:娄嘉鹏 实验日期:2015.11.24 实验密级: 预习程度: 实验时间:15:30—18:00 仪器组次: 必修/选修:必修 实验序号: 实验名称:通讯协议设计 实验目的与要求:1.掌握在ARM开发板实现一个简单的WEB服务器的过程.2.学习在ARM开发板上的SOCKET网络编程.3.学习Linux下的signal()函

时间服务器:NTP服务器

GMT时间 经度为零的地点在英国『格林威治』这个城市所在的纵剖面上 格林威治时间为标准时间 (Greenwich Mean Time, GMT 时间) 格林威治以东的区域时间是比较快的(+小时) 因此中国在东八区本地时间 (local time) 会比 GMT 时间快 8 小时 (GMT + 8) 1880 年代的时间标准是以 GMT 时间为主 夏季节约时间(daylight savings) 在夏天的时候,白天的时间会比较长,所以为了节约用电, 因此在夏天的时候某些横跨两个时区的地区会将他们的

NTP时间服务器

网络时间协议NTP(Network Time Protocol)是用于互联网中时间同步的标准互联网协议.NTP的用途是把计算机的时间同步到某些时间标准.目前采用的时间标准是世界协调时UTC(Universal Time Coordinated).NTP的主要开发者是美国特拉华大学的David L. Mills教授. NTP对于我们个人来说有什么用呢,简单的讲,当你的计算机时间不准确了,你可以接入到互联网,从网上同步一下时间,看多方便. 对于企业来说,当你有成百上千的计算机,都不能直接连接互联网,

信息安全系统设计基础实验五:通讯协议设计 20135211李行之 20135216刘蔚然

北京电子科技学院(BESTI) 实 验 报 告 封面 课程:信息安全系统设计基础 班级:1352 姓名:(按贡献大小排名)李行之 刘蔚然 学号:(按贡献大小排名)20135211 20135216 成绩: 指导教师:娄嘉鹏 实验日期:2015.12.1 实验密级: 预习程度: 实验时间:15:30—17:30 仪器组次:11 必修/选修:必修 实验序号:5 实验名称: 通讯协议设计 实验目的与要求:  1.学习使用 socket 进行通讯编程的过程,了解一个实际的网络通讯应用程序整体设计,阅读H

信息安全系统设计基础 实验五:通讯协议设计 20135327郭皓 20135329 李海空

北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全设计基础                         班级:1353 姓名:郭皓 李海空 学号:20135327  20135329 成绩:             指导教师:娄嘉鹏        实验日期:2015.11.24 实验密级:         预习程度:         实验时间:15:30~18:00 仪器组次:          必修/选修:            实验序号:5 实验名称: 

【涨姿势】带u了解即时通讯协议的昨天与今天

涨姿势咯,话说了解关于IM 姿势滴小伙伴请举手!说你呢,快把手举起来.大家都知道今天的移动互联网和以往的互联网已经发生了翻天覆地滴改变,最主要的改变莫过于网络环境的变化了.辣么,这个改变对于 IM 最底层滴即时通讯协议又有啥米影响呢?   答案在介里: 以往的互联网时代,即时通讯的网络类型较为单一,表现为通过网线或者WiFi进行连接,网络环境固定且稳定.到了移动互联网时代,网络环境变得更加复杂与不稳定,首先表现为使用者网络类型不统一,如2G.3G.4G.WIFI等:其次,多变的地理环境,用户将随

实验五:通讯协议设计

北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础               班级:1453班 姓名:彭垚                 学号:20145317 成绩:            指导教师:娄嘉鹏           实验日期:2016.11.16 实验密级:        预习程度:               实验时间10:00-12:00 仪器组次:         必修/选修:必修             实验序号:五 实验名

[涨姿势] 带 u 了解即时通讯协议的昨天与今天

涨姿势咯,话说了解关于 IM 姿势滴小伙伴请举手!说你呢,快把手举起来.大家都知道今天的移动互联网和以往的互联网已经发生了翻天覆地滴改变,最主要的改变莫过于网络环境的变化了.辣么,这个改变对于 IM 最底层滴即时通讯协议又有啥米影响呢? 答案在介里: 以往的互联网时代,即时通讯的网络类型较为单一,表现为通过网线或者 WiFi 进行连接,网络环境固定且稳定.到了移动互联网时代,网络环境变得更加复杂与不稳定,首先表现为使用者网络类型不统一,如 2G . 3G . 4G . WIFI 等:其次,多变的