发布时间 : 星期四 文章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 */