NTP同步过程 联系客服

发布时间 : 星期四 文章NTP同步过程更新完毕开始阅读d48bf96df111f18583d05a88

6.2 传输过程

除了client mode with a broadcast server和sever mode in all cases,当peer计时器衰减到零,开始执行传输过程。前者是不会发送信息的,后者只会对接收到信息作出响应时才会发送信息。

begin transmit procedure

初始化packet buffer,复制数据变量,skew的值是计算累积skew-error必须的

pkt.peeraddr ←peer.hostaddr; /* copy system and peer variables */

pkt.peerport ←peer.hostport; pkt.hostaddr ←peer.peeraddr; pkt.hostport ←peer.peerport; pkt.leap ←sys.leap;

pkt.version ←NTP.VERSION; pkt.mode ←peer.mode; pkt.stratum ←sys.stratum; pkt.poll ←peer.hostpoll;

pkt.precision ←sys.precision; pkt.rootdelay ←sys.rootdelay;

if(sys.leap = 112or (sys.clock – sys.reftime) > NTP.MAXAGE) skew ←NTP.MAXSKEW; else

skew ← ?(sys.clock ?sys.reftime);

pkt.rootdispersion ← sys.rootdispersion + (1 <

pkt.xmt用来验证回复,所以需要保证值得准确性,此外还需要注意时间戳的复制顺序,以确保不会迅速的衰落。

pkt.org ← peer.org; /* copy timestamps */ pkt.rec ← peer.rec;

pkt.xmt ← sys.clock; peer.xmt ← pkt.xmt;

在鉴权实现后,进行加密的呼叫。如果鉴权是允许的,鉴权器的加密的延迟会是同步迅速衰落,所以在实现的时候需要用一个系统状态变量(NTP协议中未规定)包含着计算得到的加密延迟的补偿来修正本地时间戳。

#ifdef(authentication implemented) /* see Appendix C */ call encrypt; #endef send packet;

可达性寄存器每次向左移一比特,用0表示空位。若寄存器全是0,则呼叫clear procedure清空clock filter并重新选择同步源。如果这个连接没有由初始化过程进行配置,这个连接遣散。

peer.reach ← peer.reach <<1; /* update reachability */ if(peer.reach =0 and peer.config =0) begin demobilize association; exit; Endif

如果在先前的两个轮询间隔中,有效数据在filter register中移动的至少一位,有效数据计数器增加。 否则有效数据计数器和poll间隔都将衰落。时候选择进程会呼叫进行重新选择同步源。

if(peer.reach & 6 ≠0) /* test two low-order bits (shifted) */ if(peer.valid

else peer.hostpoll ←peer.hostpoll +1; else begin

peer.valid ←peer.valid ?1; /* nothing heard */ peer.hostpoll ←peer.hostpoll ?1);

call clock-filter(0, 0, NTP.MAXDISPERSE);

call clock-select; /* select clock source */ endif call poll-update;

end transmit procedure;

NOTE:

广播服务器直接响应client with 包含着正确信息的pkt.org和pkt.rec。其他情况下服务器知识纯粹的广播本地时间with pkt.org,且pkt.rec设为0;

6.3 接收进程

一个NTP信息一被接收,该进程就会被执行。该进程使得接收到的信息变得有效,解释变量模式并呼叫其他进程来过滤数据,选择同步源。

如果数据中的版本标志与当前版本不匹配,则丢弃该数据。

如果同附录B中描述的NTP的控制信息被应用了,且数据的模式是6,control-message进程被呼叫。来源和目的地的IP和UDP头的网络地址和ports和相应的peer相匹配。

begin receive procedure

if(pkt.version ≠NTP.VERSION) exit; #ifdef(control messages implemented)

if(pkt.mode = 6) call control-message; #endef

for(all associations) /* access control goes here */ match addresses and ports to associations; if(no matching association)

call receive-instantiation procedure; /* create association */ 在鉴权完成后呼叫解密过程

#ifdef(authentication implemented) /* see Appendix C */

call decrypt; #endef

如果packet mode 是非零的使用如下步骤的模式的值, 否则这个peer 是一个旧的版本a模式的值由3.3节确定。

if(pkt.mode = 0) /* for compatibility with old versions */ mode ←(see Section 3.3); else

mode ←pkt.mode;

case(mode, peer.hostmode) /* see Table 5 */ 如果数据被丢弃或者连接终止,若先前没有配置

error: if(peer.config = 0) demobilize association; /* see no evil */ break;

如果接收到的数据头和数据是有效的,呼叫clock-update进程来跟新时间,如果这个连接是先前没有配置的则弃置。

recv: call packet; /* process packet */

if(valid header) begin /* if valid header, update local clock */ peer.reach ←peer.reach |1; if(valid data) call clock-update; endif else

if(peer.config =0) demobilize association; break;

发射数据的进程中会及时的回复消息,如果先前没有配置,连接终止 xmit: call packet; /* process packet */

peer.hostpoll ←peer.peerpoll; /* send immediate reply */ call poll-update; call transmit;

if(peer.config = 0) demobilize association; break;

跟新时钟的呼叫进程如下:

pkt: call packet; /* process packet */

if(valid header) begin /* if valid header, update local clock */ peer.reach ←peer.reach |1; if(valid data) call clock-update; endif

else if(peer.config =0)begin

peer.hostpoll ←peer.peerpoll; /* send immediate reply */ call poll-update; call transmit;

demobilize association; endif endcase

end receive procedure;

6.4 Packet Procedure

该进程主要是为了检查信息的有效性,计算延迟/补偿,呼叫其他进程来过滤数据和选择同步源。

Test1:要求传输的时间戳与同一个peer接收的上一个时间戳不匹配,否则这个信息可能是一个旧的数据

Text2:要求originate timestamp与发送给同一个peer的上一个时间戳匹配,否则这个信息可能不在序列中/虚假的。

begin packet procedure

peer.rec ←sys.clock ; /* capture receive timestamp */ if(pkt.mode ≠5) begin

test1 ← (pkt.xmt ≠ peer.org); /* test 1 */

test2 ← (pkt.org =peer.xmt); /* test 2 */ endif

else begin

pkt.org ←peer.rec; /* fudge missing timestamps */ pkt.rec ←pkt.xmt;

test1 ← true; /* fake tests */ test2 ← true; endif

peer.org ←pkt.xmt; /* update originate timestamp */ peer.peerpoll ←pkt.poll; /* adjust poll interval */ call poll-update(peer.hostpoll);

Test3:要求originate and receive timestamps都不为0,否则表示连接没有同步上或者丢失了可达性。

test3 ← (pkt.org ≠0 andpkt.rec ≠0); /* test 3 */