<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
<html><head><title>
Notes on Configuring NTP and Setting up a NTP Subnet
</title></head><body><h3>
Notes on Configuring NTP and Setting up a NTP Subnet
</h3><hr>

<p><h4>Introduction</h4>

<p>This document is a collection of notes concerning the use of xntpd
and related programs, and on coping with the Network Time Protocol (NTP)
in general. It is a major rewrite and update of an earlier document
written by Dennis Ferguson of the University of Toronto and includes
many changes and additions resulting from the NTP Version 3
specification and new implementation features. It supersedes the earlier
document, which should no longer be used for new configurations.

<p><code>xntpd</code> is a complete implementation of the NTP Version 3
specification, as defined in: Mills, D.L. Network Time Protocol (Version
3) specification, implementation and analysis. Network Working Group
Report RFC-1305, University of Delaware, March 1992, 113 pp. <a href =
"ftp://ftp.udel.edu/pub/people/mills/rfc/rfc1305/rfc1305a.ps">
(Abstract: PostScript)</a>, <a href =
"ftp://ftp.udel.edu/pub/people/mills/rfc/rfc1305/rfc1305b.ps"> (Body:
PostScript)</a>, <a href =
"ftp://ftp.udel.edu/pub/people/mills/rfc/rfc1305/rfc1305c.ps">
(Appendices: PostScript)</a>, with additional features planned for
future versions. It also retains compatibility with both NTP Version 2,
as defined in RFC-1119, and NTP Version 1, as defined in RFC-1059,
although this compatibility is sometimes strained and only
semiautomatic. In order to support in principle the ultimate precision
of about 232 picoseconds in the NTP specification, <code>xntpd</code>
uses no floating-point arithmetic and instead manipulates the 64-bit NTP
timestamps as unsigned 64-bit integers. <code>xntpd</code> fully
implements NTP Versions 2 and 3 authentication and a mode-6 control-
message facility. As extensions to the specification, a flexible
address-and-mask restriction facility has been included, along with a
private mode-7 control-message facility used to remotely reconfigure the
system and monitor a considerable amount of internal detail.

<p>The code is biased towards the needs of a busy time server with
numerous, often hundreds, of clients and other servers. Tables are
hashed to allow efficient handling of many associations, though at the
expense of additional overhead when the number of associations is small.
Many fancy features have been included to permit efficient management
and monitoring of a busy primary server, features which are probably
excess baggage for a high stratum client. In such cases, a stripped-down
version of the protocol, the Simple Network Time Protocol (SNTP) can be
used. SNTP and NTP servers and clients can interwork in most situations,
as described in: Mills, D.L. Simple Network Time Protocol (SNTP).
Network Working Group Report RFC-2030, University of Delaware, October
1996, 14 pp. <a href =
"ftp://ftp.udel.edu/pub/people/mills/rfc/rfc1769.txt"> (ASCII)</a>.

<p>The code was written with near demonic attention to details which can
affect precision and as a consequence should be able to make good use of
high performance, special purpose hardware such as precision oscillators
and radio clocks. The present code supports a number of radio clocks,
including those for the WWV, CHU, WWVB, MSF, DCF77, GOES and GPS radio
and satellite time services and USNO, ACTS and PTB modem time services.
The server methodically avoids the use of Unix-specific library routines
where possible by implementing local versions, in order to aid in
porting the code to perverse Unix and non-Unix platforms.

<p>While this implementation conforms in most respects to the NTP
specification RFC-1305, a number of improvements have been made which
are described in the conformance statement in the <a
href="biblio.html">Further Information and Bibliography</a> page. It has
been specifically tuned to achieve the highest accuracy possible on
whatever hardware and operating-system platform is available. In
general, its precision and stability are limited only by the
characteristics of the onboard clock source used by the hardware and
operating system, usually an uncompensated crystal oscillator. On modern
RISC-based processors connected directly to radio clocks via serial-
asynchronous interfaces, the accuracy is usually limited by the radio
clock and interface to the order of a millisecond or two. The code
includes special features to support a pulse-per-second (PPS) signal
generated by some radio clocks. When used in conjunction with a suitable
hardware level converter, the accuracy can be improved to a few tens of
microseconds. Further improvement is possible using an outboard,
stabilized frequency source, in which the accuracy and stability are
limited only by the characteristics of that source.

<p>The <code>xntp3</code> distribution includes, in addition to the
daemon itself (<code>xntpd</code>), several utility programs, including
two remote-monitoring programs (<a href = "ntpq.html">
<code>ntpq</code></a>, <a href = "xntpdc.html">
<code>xntpdc</code></a>), a remote clock-setting program similar to the
Unix rdate program (<code>ntpdate</code>), a traceback utility useful to
discover suitable synchronization sources (<code>ntptrace</code>), and
various programs used to configure the local platform and calibrate the
intrinsic errors. NTP has been ported to a large number of platforms,
including most RISC and CISC workstations and mainframes manufactured
today. Example configuration files for many models of these machines are
included in the <code>xntp3</code> distribution. While in most cases the
standard version of the implementation runs with no hardware or
operating-system modifications, not all features of the distribution are
available on all platforms. For instance, a special feature allowing Sun
workstations to achieve accuracies in the order of 100 microseconds
requires some minor changes and additions to the kernel and input/output
support.

<p>There are, however, several drawbacks to all of this.
<code>xntpd</code> is quite fat. This is rotten if your intended
platform for the daemon is memory limited. <code>xntpd</code> uses
<code>SIGIO</code> for all input, a facility which appears to not enjoy
universal support and whose use seems to exercise the parts of your
vendors' kernels which are most likely to have been done poorly. The
code is unforgiving in the face of kernel problems which affect
performance, and generally requires that you repair the problems in
order to achieve acceptable performance. The code has a distinctly
experimental flavour and contains features which could charitably be
termed failed experiments, but which have not been completely hacked
out. Much was learned from the addition of support for a variety of
radio clocks, with the result that this support could use some
rewriting.

<p><h4>How NTP Works</h4>

<p>The approach used by NTP to achieve reliable time synchronization
from a set of possibly unreliable remote time servers is somewhat
different than other protocols. In particular, NTP does not attempt to
synchronize clocks to each other. Rather, each server attempts to
synchronize to Universal Coordinated Time (UTC) using the best available
source and available transmission paths to that source. This is a fine
point which is worth understanding. A group of NTP-synchronized clocks
may be close to each other in time, but this is not a consequence of the
clocks in the group having synchronized to each other, but rather
because each clock has synchronized closely to UTC via the best source
it has access to. As such, trying to synchronize a set of clocks to a
set of servers whose time is not in mutual agreement may not result in
any sort of useful synchronization of the clocks, even if you don't care
about UTC. However, in networks isolated from UTC sources, provisions
can made to nominate one of them as a phantom UTC source.

<p>NTP operates on the premise that there is one true standard time, and
that if several servers which claim synchronization to standard time
disagree about what that time is, then one or more of them must be
broken. There is no attempt to resolve differences more gracefully since
the premise is that substantial differences cannot exist. In essence,
NTP expects that the time being distributed from the root of the
synchronization subnet will be derived from some external source of UTC
(e.g., a radio clock). This makes it somewhat inconvenient (though by no
means impossible) to synchronize hosts together without a reliable
source of UTC to synchronize them to. If your network is isolated and
you cannot access other people's servers across the Internet, a radio
clock may make a good investment.

<p>Time is distributed through a hierarchy of NTP servers, with each
server adopting a <i>stratum</i> which indicates how far away from an
external source of UTC it is operating at. Stratum-1 servers, which are
at the top of the pile (or bottom, depending on your point of view),
have access to some external time source, usually a radio clock
synchronized to time signal broadcasts from radio stations which
explicitly provide a standard time service. A stratum-2 server is one
which is currently obtaining time from a stratum-1 server, a stratum-3
server gets its time from a stratum-2 server, and so on. To avoid long
lived synchronization loops the number of strata is limited to 15.

<p>Each client in the synchronization subnet (which may also be a server
for other, higher stratum clients) chooses exactly one of the available
servers to synchronize to, usually from among the lowest stratum servers
it has access to. This is, however, not always an optimal configuration,
for indeed NTP operates under another premise as well, that each
server's time should be viewed with a certain amount of distrust. NTP
really prefers to have access to several sources of lower stratum time
(at least three) since it can then apply an agreement algorithm to
detect insanity on the part of any one of these. Normally, when all
servers are in agreement, NTP will choose the best of these, where
"best" is defined in terms of lowest stratum, closest (in terms of
network delay) and claimed precision, along with several other
considerations. The implication is that, while one should aim to provide
each client with three or more sources of lower stratum time, several of
these will only be providing backup service and may be of lesser quality
in terms of network delay and stratum (i.e., a same-stratum peer which
receives time from lower stratum sources the local server doesn't access
directly can also provide good backup service).

<p>Finally, there is the issue of association modes. There are a number
of modes in which NTP servers can associate with each other, with the
mode of each server in the pair indicating the behaviour the other
server can expect from it. In particular, when configuring a server to
obtain time from other servers, there is a choice of two modes which may
be used. Configuring an association in symmetric-active mode (usually
indicated by a <code>peer</code> declaration in the configuration file)
indicates to the remote server that one wishes to obtain time from the
remote server and that one is also willing to supply time to the remote
server if need be. This mode is appropriate in configurations involving
a number of redundant time servers interconnected via diverse network
paths, which is presently the case for most stratum-1 and stratum-2
servers on the Internet today. Configuring an association in client mode
(usually indicated by a <code>server</code> declaration in the
configuration file) indicates that one wishes to obtain time from the
remote server, but that one is not willing to provide time to the remote
server. This mode is appropriate for file-server and workstation clients
that do not provide synchronization to other local clients. Client mode
is also useful for boot-date-setting programs and the like, which really
have no time to provide and which don't retain state about associations
over the longer term.

<p>Where the requirements in accuracy and reliability are modest, clients
can be configured to use broadcast and/or multicast modes. These modes
are not normally utilized by servers with dependent clients. The
advantage of these modes is that clients do not need to be configured
for a specific server, so that all clients operating can use the same
configuration file. Broadcast mode requires a broadcast server on the
same subnet, while multicast mode requires support for IP multicast on
the client machine, as well as connectivity via the MBONE to a multicast
server. Since broadcast messages are not propagated by routers, only
those broadcast servers on the same subnet will be used. There is at
present no way to select which of possibly many multicast servers will
be used, since all operate on the same group address.

<p>Where the maximum accuracy and reliability provided by NTP are needed,
clients and servers operate in either client/server or symmetric modes.
Symmetric modes are most often used between two or more servers
operating as a mutually redundant group. In these modes, the servers in
the group members arrange the synchronization paths for maximum
performance, depending on network jitter and propagation delay. If one
or more of the group members fail, the remaining members automatically
reconfigure as required. Dependent clients and servers normally operate
in client/server mode, in which a client or dependent server can be
synchronized to a group member, but no group member can synchronize to
the client or dependent server. This provides protection against
malfunctions or protocol attacks.

<p>Servers that provide synchronization to a sizeable population of
clients normally operate as a group of three or more mutually redundant
servers, each operating with three or more stratum-one or stratum-two
servers in client-server modes, as well as all other members of the
group in symmetric modes. This provides protection against malfunctions
in which one or more servers fail to operate or provide incorrect time.
The NTP algorithms have been specifically engineered to resist attacks
where some fraction of the configured synchronization sources accidently
or purposely provide incorrect time. In these cases a special voting
procedure is used to identify spurious sources and discard their data.

<p><h4>Configuring Your Subnet</h4>

<p>At startup time the <code>xntpd</code> daemon running on a host reads
the initial configuration information from a file, usually
<code>/etc/ntp.conf</code>, unless a different name has been specified
at compile time. Putting something in this file which will enable the
host to obtain time from somewhere else is usually the first big hurdle
after installation of the software itself, which is described in the <a
href="build.html">Building and Installing the Distribution</a> page. At
its simplest, what you need to do in the configuration file is declare
the servers that the daemon should poll for time synchronization. In
principle, no such list is needed if some other time server operating in
broadcast/multicast mode is available, which requires the client to
operate in a broadcastclient mode.

<p>In the case of a workstation operating in an enterprise network for a
public or private organization, there is often an administrative
department that coordinates network services, including NTP. Where
available, the addresses of appropriate servers can be provided by that
department. However, if this infrastructure is not available, it is
necessary to explore some portion of the existing NTP subnet now running
in the Internet. There are at present many thousands of time servers
running NTP in the Internet, a significant number of which are willing
to provide a public time-synchronization service. Some of these are
listed in the list of public time servers in the <a href =
"http://www.eecis.udel.edu/~ntp">NTP web page</a>. This page is updated
on a regular basis using information provided voluntarily by various
site administrators. There are other ways to explore the nearby subnet
using the <a href="ntptrace.html"><code>ntptrace</code></a> and <a
href="xntpdc.html"><code>xntpdc</code></a> programs.

<p>It is vital to carefully consider the issues of robustness and
reliability when selecting the sources of synchronization. Normally, not
less than three sources should be available, preferably selected to
avoid common points of failure. It is usually better to choose sources
which are likely to be "close" to you in terms of network topology,
though you shouldn't worry overly about this if you are unable to
determine who is close and who isn't. Normally, it is much more serious
when a server becomes faulty and delivers incorrect time than when it
simply stops operating, since an NTP-synchronized host normally can
coast for hours or even days without its clock accumulating serious
error approaching a second, for instance. Selecting at least three
sources from different operating administrations, where possible, is the
minimum recommended, although a lesser number could provide acceptable
service with a degraded degree of robustness.

<p>Normally, it is not considered good practice for a single workstation
to request synchronization from a primary (stratum-1) time server. At
present, these servers provide synchronization for hundreds of clients
in many cases and could, along with the network access paths, become
seriously overloaded if large numbers of workstation clients requested
synchronization directly. Therefore, workstations located in sparsely
populated administrative domains with no local synchronization
infrastructure should request synchronization from nearby stratum-2
servers instead. In most cases the keepers of those servers listed in
the NTP page provide unrestricted access without prior permission;
however, in all cases it is considered polite to notify the
administrator listed in the file upon commencement of regular service.
In all cases the access mode and notification requirements listed in the
file must be respected.

<p>In the case of a gateway or file server providing service to a
significant number of workstations or file servers in an enterprise
network it is even more important to provide multiple, redundant sources
of synchronization and multiple, diversity-routed, network access paths.
The preferred configuration is at least three administratively
coordinated time servers providing service throughout the administrative
domain including campus networks and subnetworks. Each of these should
obtain service from at least two different outside sources of
synchronization, preferably via different gateways and access paths.
These sources should all operate at the same stratum level, which is one
less than the stratum level to be used by the local time servers
themselves. In addition, each of these time servers should peer with all
of the other time servers in the local administrative domain at the
stratum level used by the local time servers, as well as at least one
(different) outside source at this level. This configuration results in
the use of six outside sources at a lower stratum level (toward the
primary source of synchronization, usually a radio clock), plus three
outside sources at the same stratum level, for a total of nine outside
sources of synchronization. While this may seem excessive, the actual
load on network resources is minimal, since the interval between polling
messages exchanged between peers usually ratchets back to no more than
one message every 17 minutes.

<p>The stratum level to be used by the local time servers is an
engineering choice. As a matter of policy, and in order to reduce the
load on the primary servers, it is desirable to use the highest stratum
consistent with reliable, accurate time synchronization throughout the
administrative domain. In the case of enterprise networks serving
hundreds or thousands of client file servers and workstations,
conventional practice is to obtain service from stratum-1 primary
servers such as listed in the NTP page. When choosing sources away from
the primary sources, the particular synchronization path in use at any
time can be verified using the <code>ntptrace</code> program included in
the <code>xntp3</code> distribution. It is important to avoid loops and
possible common points of failure when selecting these sources. Note
that, while NTP detects and rejects loops involving neighboring servers,
it does not detect loops involving intervening servers. In the unlikely
case that all primary sources of synchronization are lost throughout the
subnet, the remaining servers on that subnet can form temporary loops
and, if the loss continues for an interval of many hours, the servers
will drop off the subnet and free-run with respect to their internal
(disciplined) timing sources. After some period with no outside timing
source (currently one day), a host will declare itself unsynchronized
and provide this information to local application programs.

<p>In many cases the purchase of one or more radio clocks is justified,
in which cases good engineering practice is to use the configurations
described above anyway and connect the radio clock to one of the local
servers. This server is then encouraged to participate in a special
primary-server subnetwork in which each radio-equipped server peers with
several other similarly equipped servers. In this way the radio-equipped
server may provide synchronization, as well as receive synchronization,
should the local or remote radio clock(s) fail or become faulty.
<code>xntpd</code> treats attached radio clock(s) in the same way as
other servers and applies the same criteria and algorithms to the time
indications, so can detect when the radio fails or becomes faulty and
switch to alternate sources of synchronization. It is strongly advised,
and in practice for most primary servers today, to employ the
authentication or access-control features of the NTP specification in
order to protect against hostile intruders and possible destabilization
of the time service. Using this or similar strategies, the remaining
hosts in the same administrative domain can be synchronized to the three
(or more) selected time servers. Assuming these servers are synchronized
directly to stratum-1 sources and operate normally as stratum-2, the
next level away from the primary source of synchronization, for instance
various campus file servers, will operate at stratum 3 and dependent
workstations at stratum 4. Engineered correctly, such a subnet will
survive all but the most exotic failures or even hostile penetrations of
the various, distributed timekeeping resources.

<p>The above arrangement should provide very good, robust time service
with a minimum of traffic to distant servers and with manageable loads
on the local servers. While it is theoretically possible to extend the
synchronization subnet to even higher strata, this is seldom justified
and can make the maintenance of configuration files unmanageable.
Serving time to a higher stratum peer is very inexpensive in terms of
the load on the lower stratum server if the latter is located on the
same concatenated LAN. When justified by the accuracy expectations, NTP
can be operated in broadcast and multicast modes, so that clients need
only listen for periodic broadcasts and do not need to send anything.

<p>When planning your network you might, beyond this, keep in mind a few
generic don'ts, in particular:

<ul>

<li>Don't synchronize a local time server to another peer at the same
stratum, unless the latter is receiving time from lower stratum sources
the former doesn't talk to directly. This minimizes the occurrence of
common points of failure, but does not eliminate them in cases where the
usual chain of associations to the primary sources of synchronization
are disrupted due to failures.

<p><li>Don't configure peer associations with higher stratum servers.
Let the higher strata configure lower stratum servers, but not the
reverse. This greatly simplifies configuration file maintenance, since
there is usually much greater configuration churn in the high stratum
clients such as personal workstations.

<p><li>Don't synchronize more than one time server in a particular
administrative domain to the same time server outside that domain. Such
a practice invites common points of failure, as well as raises the
possibility of massive abuse, should the configuration file be
automatically distributed do a large number of clients.

</ul>

<p>There are many useful exceptions to these rules. When in doubt,
however, follow them.

<p><h4>Configuring Your Server or Client</h4>

<p>As mentioned previously, the configuration file is usually called
/etc/ntp.conf. This is an ASCII file conforming to the usual comment and
whitespace conventions. A working configuration file might look like (In
this and other examples, do not copy this directly.):

<pre>
     # peer configuration for host whimsy
     # (expected to operate at stratum 2)

     server rackety.udel.edu
     server umd1.umd.edu
     server lilben.tn.cornell.edu

     driftfile /etc/ntp.drift
</pre>

<p>(Note the use of host names, although host addresses in dotted-quad
notation can also be used. It is always preferable to use names rather
than addresses, since over time the addresses can change, while the
names seldom change.)

<p>This particular host is expected to operate as a client at stratum 2
by virtue of the <code>server</code> keyword and the fact that two of
the three servers declared (the first two) have radio clocks and usually
run at stratum 1. The third server in the list has no radio clock, but
is known to maintain associations with a number of stratum 1 peers and
usually operates at stratum 2. Of particular importance with the last
host is that it maintains associations with peers besides the two
stratum 1 peers mentioned. This can be verified using the
<code>ntpq</code> program mentioned above. When configured using the
<code>server</code> keyword, this host can receive synchronization from
any of the listed servers, but can never provide synchronization to
them.

<p>Unless restricted using facilities described later, this host can
provide synchronization to dependent clients, which do not have to be
listed in the configuration file. Associations maintained for these
clients are transitory and result in no persistent state in the host.
These clients are normally not visible using the <code>ntpq</code>
program included in the distribution; however, <code>xntpd</code>
includes a monitoring feature (described later) which caches a minimal
amount of client information useful for debugging administrative
purposes.

<p>A time server expected to both receive synchronization from another
server, as well as to provide synchronization to it, is declared using
the <code>peer</code> keyword instead of the <code>server</code>
keyword. In all other aspects the server operates the same in either
mode and can provide synchronization to dependent clients or other
peers. If a local source of UTC time is available, it is considered good
engineering practice to declare time servers outside the administrative
domain as <code>peer</code> and those inside as <code>server</code> in
order to provide redundancy in the global Internet, while minimizing the
possibility of instability within the domain itself. A time server in
one domain can in principle heal another domain temporarily isolated
from all other sources of synchronization. However, it is probably
unwise for a casual workstation to bridge fragments of the local domain
which have become temporarily isolated.

<p>Note the inclusion of a <code>driftfile</code> declaration. One of
the things the NTP daemon does when it is first started is to compute
the error in the intrinsic frequency of the clock on the computer it is
running on. It usually takes about a day or so after the daemon is
started to compute a good estimate of this (and it needs a good estimate
to synchronize closely to its server). Once the initial value is
computed, it will change only by relatively small amounts during the
course of continued operation. The <code>driftfile</code> declaration
indicates to the daemon the name of a file where it may store the
current value of the frequency error so that, if the daemon is stopped
and restarted, it can reinitialize itself to the previous estimate and
avoid the day's worth of time it will take to recompute the frequency
estimate. Since this is a desirable feature, a <code>driftfile</code>
declaration should always be included in the configuration file.

<p>An implication in the above is that, should xntpd be stopped for some
reason, the local platform time will diverge from UTC by an amount that
depends on the intrinsic error of the clock oscillator and the time
since last synchronized. In view of the length of time necessary to
refine the frequency estimate, every effort should be made to operate
the daemon on a continuous basis and minimize the intervals when for
some reason it is not running.

<p><h4>Xntp3 Versus Previous Versions</h4>

<p>There are several items of note when dealing with a mixture of
<code>xntp3</code> and previous distributions of NTP Version 2
(<code>xntpd</code>) and NTP Version 1 (<code>ntp3.4</code>). The
<code>xntp3</code> implementation conforms to the NTP Version 3
specification. As such, by default when no additional information is
available concerning the preferences of the peer, <code>xntpd</code>
claims to be version 3 in the packets that it sends.

<p>An NTP implementation conforming to a previous version specification
ordinarily discards packets from a later version. However, in most
respects documented in RFC-1305, The version 2 implementation is
compatible with the version-3 algorithms and protocol. The version 1
implementation contains most of the version-2 algorithms, but without
important features for clock selection and robustness. Nevertheless, in
most respects the NTP version are backwards compatible. The sticky part
here is that, when either version 2 or version 1 implementation receives
a packet claiming to be from a version-3 server, it discards it without
further processing. Hence there is a danger that in some situations
synchronization with previous versions will fail.

<p><code>xntpd</code> is aware of this problem. In particular, when
<code>xntpd</code> is polled first by a host claiming to be a previous
version 1 or version 2 implementation, <code>xntpd</code> claims to be a
version 1 or 2 implementation, respectively, in packets returned to the
poller. This allows <code>xntpd</code> to serve previous version clients
transparently. The trouble occurs when an previous version is to be
included in an <code>xntpd</code> configuration file. With no further
indication, <code>xntpd</code> will send packets claiming to be version
3 when it polls. To get around this, <code>xntpd</code> allows a
qualifier to be added to configuration entries to indicate which version
to use when polling. Hence the entries
<pre>
     # specify NTP version 1

     server mimsy.mil version 1     # server running ntpd version 1
     server apple.com version 2     # server running xntpd version 2
</pre>

<p>will cause version 1 packets to be sent to the host mimsy.mil and
version 2 packets to be sent to apple.com. If you are testing
<code>xntpd</code> against previous version servers you will need to be
careful about this. Note that, as indicated in the RFC-1305
specification, there is no longer support for the original NTP
specification, popularly called NTP Version 0.

<p><h4>Traffic Monitoring</h4>

<p><code>xntpd</code> handles peers whose stratum is higher than the
stratum of the local server and pollers using client mode by a fast path
which minimizes the work done in responding to their polls, and normally
retains no memory of these pollers. Sometimes, however, it is
interesting to be able to determine who is polling the server, and how
often, as well as who has been sending other types of queries to the
server.

<p>To allow this, <code>xntpd</code> implements a traffic monitoring
facility which records the source address and a minimal amount of other
information from each packet which is received by the server. This
feature is normally enabled, but can be disabled if desired using the
configuration file entry:

<pre>
     # disable monitoring feature

     disable monitor
</pre>

<p>The recorded information can be displayed using the
<code>xntpdc</code> query program, described briefly below.

<p><h4>Address-and-Mask Restrictions</h4>

<p>The address-and-mask configuration facility supported by
<code>xntpd</code> is quite flexible and general, but is not an integral
part of the NTP Version 3 specification. The major drawback is that,
while the internal implementation is very nice, the user interface is
not. For this reason it is probably worth doing an example here.
Briefly, the facility works as follows. There is an internal list, each
entry of which holds an address, a mask and a set of flags. On receipt
of a packet, the source address of the packet is compared to each entry
in the list, with a match being posted when the following is true:

<pre>
     (source_addr & mask) == (address & mask)
</pre>

<p>A particular source address may match several list entries. In this
case the entry with the most one bits in the mask is chosen. The flags
associated with this entry are used to control the access.

<p>In the current implementation the flags always add restrictions. In
effect, an entry with no flags set leaves matching hosts unrestricted.
An entry can be added to the internal list using a <code>restrict</code>
declaration. The flags associated with the entry are specified
textually. For example, the <code>notrust</code> flag indicates that
hosts matching this entry, while treated normally in other respects,
shouldn't be trusted to provide synchronization even if otherwise so
enabled. The <code>nomodify</code> flag indicates that hosts matching
this entry should not be allowed to do run-time configuration. There are
many more flags, see the <a href = "xntpd.html"> <code>xntpd</code> -
Network Time Protocol (NTP) daemon </a> page.
<p>Now the example. Suppose you are running the server on a host whose
address is 128.100.100.7. You would like to ensure that run time
reconfiguration requests can only be made from the local host and that
the server only ever synchronizes to one of a pair of off-campus servers
or, failing that, a time source on net 128.100. The following entries in
the configuration file would implement this policy:

<pre>
     # by default, don't trust and don't allow modifications

     restrict default notrust nomodify

     # these guys are trusted for time, but no modifications allowed

     restrict 128.100.0.0 mask 255.255.0.0 nomodify
     restrict 128.8.10.1 nomodify
     restrict 192.35.82.50 nomodify

     # the local addresses are unrestricted

     restrict 128.100.100.7
     restrict 127.0.0.1
</pre>

<p>The first entry is the default entry, which all hosts match and hence
which provides the default set of flags. The next three entries indicate
that matching hosts will only have the <code>nomodify</code> flag set
and hence will be trusted for time. If the mask isn't specified in the
<code>restrict</code> keyword, it defaults to 255.255.255.255. Note that
the address 128.100.100.7 matches three entries in the table, the
default entry (mask 0.0.0.0), the entry for net 128.100 (mask
255.255.0.0) and the entry for the host itself (mask 255.255.255.255).
As expected, the flags for the host are derived from the last entry
since the mask has the most bits set.

<p>The only other thing worth mentioning is that the
<code>restrict</code> declarations apply to packets from all hosts,
including those that are configured elsewhere in the configuration file
and even including your clock pseudopeer(s), if any. Hence, if you
specify a default set of restrictions which you don't wish to be applied
to your configured peers, you must remove those restrictions for the
configured peers with additional <code>restrict</code> declarations
mentioning each peer separately.

<p><h4>Authentication</h4>

<p><code>xntpd</code> supports the optional authentication procedure
specified in the NTP Version 2 and 3 specifications. Briefly, when an
association runs in authenticated mode, each packet transmitted has
appended to it a 32-bit key ID and a 64/128-bit cryptographic checksum
of the packet contents computed using either the Data Encryption
Standard (DES) or Message Digest (MD5) algorithms. Note that, while
either of these algorithms provide sufficient protection from message-
modification attacks, distribution of the former algorithm
implementation is restricted to the U.S. and Canada, while the latter
presently is free from such restrictions. With either algorithm the
receiving peer recomputes the checksum and compares it with the one
included in the packet. For this to work, the peers must share at least
one encryption key and, furthermore, must associate the shared key with
the same key ID.
<p>This facility requires some minor modifications to the basic packet
processing procedures, as required by the specification. These
modifications are enabled by the <code>enable authenticate</code> configuration
declaration. In particular, in authenticated mode, peers which send
unauthenticated packets, peers which send authenticated packets which
the local server is unable to decrypt and peers which send authenticated
packets encrypted using a key we don't trust are all marked
untrustworthy and unsuitable for synchronization. Note that, while the
server may know many keys (identified by many key IDs), it is possible
to declare only a subset of these as trusted. This allows the server to
share keys with a client which requires authenticated time and which
trusts the server, but which is not trusted by the server. Also, some
additional configuration language is required to specify the key ID to
be used to authenticate each configured peer association. Hence, for a
server running in authenticated mode, the configuration file might look
similar to the following:

<pre>
     # peer configuration for 128.100.100.7
     # (expected to operate at stratum 2)
     # fully authenticated this time

     peer 128.100.49.105 key 22 # suzuki.ccie.utoronto.ca
     peer 128.8.10.1 key 4    # umd1.umd.edu
     peer 192.35.82.50 key 6  # lilben.tn.cornell.edu


     authenticate yes         # enable authentication
     keys /usr/local/etc/ntp.keys  # path for key file
     trustedkey 1 2 14 15     # define trusted keys
     requestkey 15            # key (7) for accessing server variables
     controlkey 15            # key (6) for accessing server variables

     authdelay 0.000094       # authentication delay (Sun4c/50 IPX)
</pre>

<p>There are a couple of previously unmentioned things in here. The
<code>authenticate yes</code> line enables authentication processing,
while the <code>keys /usr/local/etc/ntp.keys</code> specifies the path
to the keys file (see below and the <code>xntpd</code> document page for
details of the file format). The <code>trustedkey</code> declaration
identifies those keys that are known to be uncompromised; the remainder
presumably represent the expired or possibly compromised keys. Both sets
of keys must be declared by key identifier in the <code>ntp.keys</code>
file described below. This provides a way to retire old keys while
minimizing the frequency of delicate key-distribution procedures. The
<code>requestkey 15</code> line establishes the key to be used for mode-
6 control messages as specified in RFC-1305 and used by the
<code>ntpq</code> utility program, while the <code>controlkey 15</code>
establishes the key to be used for mode-7 private control messages used
by the <code>xntpdc</code> utility program. These keys are used to
prevent unauthorized modification of daemon variables.

<p>The <code>authdelay</code> declaration is an estimate of the amount
of processing time taken between the freezing of a transmit timestamp
and the actual transmission of the packet when authentication is enabled
(i.e. more or less the time it takes for the DES or MD5 routine to
encrypt a single block), and is used as a correction for the transmit
timestamp. This can be computed for your CPU by the <a href =
"authspeed.html"> <code>authspeed</code> </a> program included in the
distribution. The usage is illustrated by the following:

<pre>
     # for DES keys

     authspeed -n 30000 auth.samplekeys
     # for MD5 keys

     authspeed -mn 30000 auth.samplekeys
</pre>

<p>Additional utility programs included in the <code>./authstuff</code>
directory can be used to generate random keys, certify implementation
correctness and display sample keys. As a general rule, keys should be
chosen randomly, except possibly the request and control keys, which
must be entered by the user as a password.

<p>The <code>ntp.keys</code> file contains the list of keys and
associated key IDs the server knows about (for obvious reasons this file
is better left unreadable by anyone except root). The contents of this
file might look like:

<pre>
     # ntp keys file (ntp.keys)

     1    N    29233E0461ECD6AE    # des key in NTP format
     2    M    RIrop8KPPvQvYotM    # md5 key as an ASCII random string
     14   M    sundial             # md5 key as an ASCII string
     15   A    sundial             # des key as an ASCII string

     # the following 3 keys are identical

     10   A    SeCReT
     10   N    d3e54352e5548080
     10   S    a7cb86a4cba80101
</pre>

<p>In the keys file the first token on each line indicates the key ID,
the second token the format of the key and the third the key itself.
There are four key formats. An <code>A</code> indicates a DES key
written as a 1-to-8 character string in 7-bit ASCII representation, with
each character standing for a key octet (like a Unix password). An
<code>S</code> indicates a DES key written as a hex number in the DES
standard format, with the low order bit (LSB) of each octet being the
(odd) parity bit. An <code>N</code> indicates a DES key again written as
a hex number, but in NTP standard format with the high order bit of each
octet being the (odd) parity bit (confusing enough?). An <code>M</code>
indicates an MD5 key written as a 1-to-31 character ASCII string in the
<code>A</code> format. Note that, because of the simple tokenizing
routine, the characters <code>' ', '#', '\t', '\n'</code> and
<code>'\0'</code> can't be used in either a DES or MD5 ASCII key.
Everything else is fair game, though. Key 0 (zero) is used for special
purposes and should not appear in this file.

<p>The big trouble with the authentication facility is the keys file. It
is a maintenance headache and a security problem. This should be fixed
some day. Presumably, this whole bag of worms goes away if/when a
generic security regime for the Internet is established.

<p><h4>Query Programs</h4>

<p>Three utility query programs are included with the distribution,
<code>ntpq</code>, <code>ntptrace</code> and <code>xntpdc</code>.
<code>ntpq</code> is a handy program which sends queries and receives
responses using NTP standard mode-6 control messages. Since it uses the
standard control protocol specified in RFC-1305, it may be used with NTP
Version 2 and Version 3 implementations for both Unix and Fuzzball, but
not Version 1 implementations. It is most useful to query remote NTP
implementations to assess timekeeping accuracy and expose bugs in
configuration or operation.
<p><code>ntptrace</code> can be used to display the current
synchronization path from a selected host through possibly intervening
servers to the primary source of synchronization, usually a radio clock.
It works with both version 2 and version 3 servers, but not version 1.

<p><code>xntpdc</code> is a horrid program which uses NTP private mode-7
control messages to query local or remote servers. The format and
contents of these messages are specific to this version of
<code>xntpd</code> and some older versions. The program does allow
inspection of a wide variety of internal counters and other state data,
and hence does make a pretty good debugging tool, even if it is
frustrating to use. The other thing of note about <code>xntpdc</code> is
that it provides a user interface to the run time reconfiguration
facility. See the respective document pages for details on the use of
these programs.

<p><h4>Run-Time Reconfiguration</h4>

<p><code>xntpd</code> was written specifically to allow its
configuration to be fully modifiable at run time. Indeed, the only way
to configure the server is at run time. The configuration file is read
only after the rest of the server has been initialized into a running
default-configured state. This facility was included not so much for the
benefit of Unix, where it is handy but not strictly essential, but
rather for dedicated platforms where the feature is more important for
maintenance. Nevertheless, run time configuration works very nicely for
Unix servers as well.

<p>Nearly all of the things it is possible to configure in the
configuration file may be altered via NTP mode-7 messages using the
<code>xntpdc</code> program. Mode-6 messages may also provide some
limited configuration functionality (though the only thing you can
currently do with mode-6 messages is set the leap-second warning bits)
and the <code>ntpq</code> program provides generic support for the
latter. The leap bits that can be set in the <code>leap_warning</code>
variable (up to one month ahead) and in the <code>leap_indication</code>
variable have a slightly different encoding than the usual
interpretation:

<pre>
        Value           Action

         00             The daemon passes the leap bits of its
                        synchronisation source (usual mode of operation)

        01/10   A leap second is added/deleted

         11             Leap information from the synchronization source
                        is ignored (thus LEAP_NOWARNING is passed on)
</pre>

<p>Mode-6 and mode-7 messages which would modify the configuration of
the server are required to be authenticated using standard NTP
authentication. To enable the facilities one must, in addition to
specifying the location of a keys file, indicate in the configuration
file the key IDs to be used for authenticating reconfiguration commands.
Hence the following fragment might be added to a configuration file to
enable the mode-6 (ntpq) and mode-7 (xntpdc) facilities in the daemon:

<pre>     # specify mode-6 and mode-7 trusted keys

     requestkey 65535    # for mode-7 requests
     controlkey 65534    # for mode-6 requests
</pre>
<p>If the <code>requestkey</code> and/or the <code>controlkey</code>
configuration declarations are omitted from the configuration file, the
corresponding run-time reconfiguration facility is disabled.

<p>The query programs require the user to specify a key ID and a key to
use for authenticating requests to be sent. The key ID provided should
be the same as the one mentioned in the configuration file, while the
key should match that corresponding to the key ID in the keys file. As
the query programs prompt for the key as a password, it is useful to
make the request and control authentication keys typeable (in ASCII
format) from the keyboard.

<p><h4>Name Resolution</h4>

<p><code>xntpd</code> includes the capability to specify host names
requiring resolution in <code>peer</code> and <code>server</code>
declarations in the configuration file. However, in some outposts of the
Internet, name resolution is unreliable and the interface to the Unix
resolver routines is synchronous. The hangups and delays resulting from
name-resolver clanking can be unacceptable once the NTP server is
running (and remember it is up and running before the configuration file
is read). However, it is advantageous to resolve time server names,
since their addresses are occasionally changed.

<p>In order to prevent configuration delays due to the name resolver,
the daemon runs the name resolution process in parallel with the main
daemon code. When the daemon comes across a <code>peer</code> or
<code>server</code> entry with a non-numeric host address, it records
the relevant information in a temporary file and continues on. When the
end of the configuration file has been reached and one or more entries
requiring name resolution have been found, the server runs the name
resolver from the temporary file. The server then continues on normally
but with the offending peers/servers omitted from its configuration.

<p>As each name is resolved, it configures the associated entry into the
server using the same mode-7 run time reconfiguration facility that
<code>xntpdc</code> uses. If temporary resolver failures occur, the
resolver will periodically retry the requests until a definite response
is received. The program will continue to run until all entries have
been resolved.

<p><h4>Dealing with Frequency Tolerance Violations (<code>tickadj</code>
and Friends)</h4>

<p>The NTP Version 3 specification RFC-1305 calls for a maximum
oscillator frequency tolerance of +-100 parts-per-million (PPM), which
is representative of those components suitable for use in relatively
inexpensive workstation platforms. For those platforms meeting this
tolerance, NTP will automatically compensate for the frequency errors of
the individual oscillator and no further adjustments are required,
either to the configuration file or to various kernel variables.

<p>However, in the case of certain notorious platforms, in particular
Sun 4.1.1 systems, the 100-ppm tolerance is routinely violated. In such
cases it may be necessary to adjust the values of certain kernel
variables; in particular, <code>tick</code> and
<code><code>tickadj</code></code>. The variable <code>tick</code> is the
increment in microseconds added to the system time on each interval-
timer interrupt, while the variable <code><code>tickadj</code></code> is
used by the time adjustment code as a slew rate, in microseconds per
tick. When the time is being adjusted via a call to the system routine
<code>adjtime()</code>, the kernel increases or reduces tick by
<code><code>tickadj</code></code> microseconds per tick until the
specified adjustment has been completed. Unfortunately, in most Unix
implementations the tick increment must be either zero or plus/minus
exactly <code><code>tickadj</code></code> microseconds, meaning that
adjustments are truncated to be an integral multiple of
<code><code>tickadj</code></code> (this latter behaviour is a
misfeature, and is the only reason the <code><code>tickadj</code></code>
code needs to concern itself with the internal implementation of
<code><code>tickadj</code></code> at all). In addition, the stock Unix
implementation considers it an error to request another adjustment
before a prior one has completed.

<p>Thus, to make very sure it avoids problems related to the roundoff,
the xntpd daemon reads the values of <code>tick</code> and
<code><code>tickadj</code></code> from the kernel when it starts. It
then ensures that all adjustments given to <code>adjtime()</code> are an
even multiple of <code><code>tickadj</code></code> microseconds and
computes the largest adjustment that can be completed in the adjustment
interval (using both the value of <code>tick</code> and the value of
<code><code>tickadj</code></code>) so it can avoid exceeding this limit.

<p>Unfortunately, the value of <code><code>tickadj</code></code> set by
default is almost always too large for <code>xntpd</code>. NTP operates
by continuously making small adjustments to the clock, usually at one-
second intervals. If <code><code>tickadj</code></code> is set too large,
the adjustments will disappear in the roundoff; while, if
<code><code>tickadj</code></code> is too small, NTP will have difficulty
if it needs to make an occasional large adjustment. While the daemon
itself will read the kernel's values of these variables, it will not
change the values, even if they are unsuitable. You must do this
yourself before the daemon is started using the
<code><code>tickadj</code></code> program included in the
<code>./util</code> directory of the distribution. Note that the latter
program will also compute an optimal value of
<code><code>tickadj</code></code> for NTP use based on the kernel's
value of <code>tick</code>.

<p>The <code><code>tickadj</code></code> program can reset several other
kernel variables if asked. It can change the value of <code>tick</code>
if asked. This is handy to compensate for kernel bugs which cause the
clock to run with a very large frequency error, as with SunOS 4.1.1
systems. It can also be used to set the value of the kernel
<code>dosynctodr</code> variable to zero. This variable controls whether
to synchronize the system clock to the time-of-day clock, something you
really don't want to be happen when <code>xntpd</code> is trying to keep
it under control.

<p>In order to maintain reasonable correctness bounds, as well as
reasonably good accuracy with acceptable polling intervals,
<code>xntpd</code> will complain if the frequency error is greater than
100 PPM. For machines with a value of <code>tick</code> in the 10-ms
range, a change of one in the value of <code>tick</code> will change the
frequency by about 100 PPM. In order to determine the value of
<code>tick</code> for a particular CPU, disconnect the machine from all
sources of time (<code>dosynctodr</code> = 0) and record its actual time
compared to an outside source (eyeball-and-wristwatch will do) over a
day or more. Multiply the time change over the day by 0.116 and add or
subtract the result to tick, depending on whether the CPU is fast or
slow. An example call to <code><code>tickadj</code></code> useful on
SunOS 4.1.1 is:

<pre>
     <code>tickadj</code> -t 9999 -a 5 -s
</pre>

<p>which sets tick 100 PPM fast, <code><code>tickadj</code></code> to 5
microseconds and turns off the clock/calendar chip fiddle. This line can
be added to the <code>rc.local</code> configuration file to
automatically set the kernel variables at boot time.
<p>All this stuff about diddling kernel variables so the NTP daemon will
work is really silly. If vendors would ship machines with clocks that
kept reasonable time and would make their <code>adjtime()</code> system
call apply the slew it is given exactly, independent of the value of
<code>tickadj</code>, all this could go away. This is in fact the case
on current SunOS 5.3 systems.

<p><h4>Tuning Your Subnet</h4>

<p>There are several parameters available for tuning the NTP subnet for
maximum accuracy and minimum jitter. One of these is the
<code>prefer</code> configuration declaration described in <a href =
"prefer.html"> Mitigation Rules and the <code>prefer</code> Keyword </a>
documentation page. When more than one eligible server exists, the NTP
clock-selection and combining algorithms act to winnow out all except
the "best" set of servers using several criteria based on differences
between the readings of different servers and between successive
readings of the same server. The result is usually a set of surviving
servers that are apparently statistically equivalent in accuracy, jitter
and stability. The population of survivors remaining in this set depends
on the individual server characteristics measured during the selection
process and may vary from time to time as the result of normal
statistical variations. In LANs with high speed RISC-based time servers,
the population can become somewhat unstable, with individual servers
popping in and out of the surviving population, generally resulting in a
regime called <i>clockhopping</i>.

<p>When only the smallest residual jitter can be tolerated, it may be
convenient to elect one of the servers at each stratum level as the
preferred one using the keyword <code>prefer</code> on the configuration
declaration for the selected server:

<pre>
     # preferred server declaration

     peer rackety.udel.edu prefer    # preferred server
</pre>

<p>The preferred server will always be included in the surviving
population, regardless of its characteristics and as long as it survives
preliminary sanity checks and validation procedures.

<p>The most useful application of the <code>prefer</code> keyword is in
high speed LANs equipped with precision radio clocks, such as a GPS
receiver. In order to insure robustness, the hosts need to include
outside peers as well as the GPS-equipped server; however, as long as
that server is running, the synchronization preference should be that
server. The keyword should normally be used in all cases in order to
prefer an attached radio clock. It is probably inadvisable to use this
keyword for peers outside the LAN, since it interferes with the
carefully crafted judgement of the selection and combining algorithms.

<p><h4>Provisions for Leap Seconds and Accuracy Metrics</h4>

<p><code>xntpd</code> understands leap seconds and will attempt to take
appropriate action when one occurs. In principle, every host running
xntpd will insert a leap second in the local timescale in precise
synchronization with UTC. This requires that the leap-warning bits be
activated some time prior to the occurrence of a leap second at the
primary (stratum 1) servers. Subsequently, these bits are propagated
throughout the subnet depending on these servers by the NTP protocol
itself and automatically implemented by <code>xntpd</code> and the time-
conversion routines of each host. The implementation is independent of
the idiosyncrasies of the particular radio clock, which vary widely
among the various devices, as long as the idiosyncratic behavior does
not last for more than about 20 minutes following the leap. Provisions
are included to modify the behavior in cases where this cannot be
guaranteed. While provisions for leap seconds have been carefully
crafted so that correct timekeeping immediately before, during and after
the occurrence of a leap second is scrupulously correct, stock Unix
systems are mostly inept in responding to the available information.
This caveat goes also for the maximum-error and statistical-error bounds
carefully calculated for all clients and servers, which could be very
useful for application programs needing to calibrate the delays and
offsets to achieve a near-simultaneous commit procedure, for example.
While this information is maintained in the <code>xntpd</code> data
structures, there is at present no way for application programs to
access it. This may be a topic for further development.

<p><h4>Clock Support Overview</h4>

<p><code>xntpd</code> was designed to support radio (and other external)
clocks and does some parts of this function with utmost care. Clocks are
treated by the protocol as ordinary NTP peers, even to the point of
referring to them with an (invalid) IP host address. Clock addresses are
of the form 127.127.<i>t.u</i>, where <i>t</i> specifies the particular
type of clock (i.e., refers to a particular clock driver) and <i>u</i>
is a unit number whose interpretation is clock-driver dependent. This is
analogous to the use of major and minor device numbers by Unix and
permits multiple instantiations of clocks of the same type on the same
server, should such magnificent redundancy be required.

<p>Because clocks look much like peers, both configuration file syntax
and run time reconfiguration commands can be used to control clocks in
the same way as ordinary peers. Clocks are configured via
<code>server</code> declarations in the configuration file, can be
started and stopped using xntpdc and are subject to address-and-mask
restrictions much like a normal peer, should this stretch of imagination
ever be useful. As a concession to the need to sometimes transmit
additional information to clock drivers, an additional configuration
file is available: the  <code>fudge</code> statement. This enables one
to specify the values of two time quantities, two integral values and two
flags, the use of which is dependent on the particular clock driver. For
example, to configure a PST radio clock which can be accessed through
the serial device <code>/dev/pst1</code>, with propagation delays to WWV
and WWVH of 7.5 and 26.5 milliseconds, respectively, on a machine with
an imprecise system clock and with the driver set to disbelieve the
radio clock once it has gone 30 minutes without an update, one might use
the following configuration file entries:

<pre>
     # radio clock fudge fiddles

     server 127.127.3.1
     fudge 127.127.3.1 time1 0.0075 time2 0.0265
     fudge 127.127.3.1 value2 30 flag1 1
</pre>

<p>Additional information on the interpretation of these data with
respect to various radio clock drivers is given in the <a href =
"refclock.html"> Reference Clock Drivers </a> document page and in the
individual driver documents accessible via that page.

<p><h4>Towards the Ultimate Tick</h4>

<p>This section considers issues in providing precision time
synchronization in NTP subnets which need the highest quality time
available in the present technology. These issues are important in
subnets supporting real-time services such as distributed multimedia
conferencing and wide-area experiment control and monitoring.
<p>In the Internet of today synchronization paths often span continents
and oceans with moderate to high variations in delay due to traffic
spasms. NTP is specifically designed to minimize timekeeping jitter due
to delay variations using intricately crafted filtering and selection
algorithms; however, in cases where these variations are as much as a
second or more, the residual jitter following these algorithms may still
be excessive. Sometimes, as in the case of some isolated NTP subnets
where a local source of precision time is available, such as a PPS
signal produced by a calibrated cesium clock, it is possible to remove
the jitter and retime the local clock oscillator of the NTP server. This
has turned out to be a useful feature to improve the synchronization
quality of time distributed in remote places where radio clocks are not
available. In these cases special features of the distribution are used
together with the PPS signal to provide a jitter-free timing signal,
while NTP itself is used to provide the coarse timing and resolve the
seconds numbering.

<p>Most available radio clocks can provide time to an accuracy in the
order of milliseconds, depending on propagation conditions, local noise
levels and so forth. However, as a practical matter, all clocks can
occasionally display errors significantly exceeding nominal
specifications. Usually, the algorithms used by NTP for ordinary network
peers, as well as radio clock "peers" will detect and discard these
errors as discrepancies between the disciplined local clock oscillator
and the decoded time message produced by the radio clock. Some radio
clocks can produce a special PPS signal which can be interfaced to the
server platform in a number of ways and used to substantially improve
the (disciplined) clock oscillator jitter and wander characteristics by
at least an order of magnitude. Using these features it is possible to
achieve accuracies in the order of 100 microseconds with a fast RISC-
based platform.

<p>There are three ways to implement PPS support, depending on the radio
clock model, platform model and serial line interface. These are
described in detail in the application notes mentioned in the <a
href="index.html">The Network Time Protocol (NTP) Distribution </a>
document page. Each of these requires circuitry to convert the TTL
signal produced by most clocks to the EIA levels used by most serial
interfaces. The <a href = "gadget.html"> Gadget Box PPS Level Converter
and CHU Modem </a> document page describes a device designed to do this.
Besides being useful for this purpose, this device includes an
inexpensive modem designed for use with the Canadian CHU time/frequency
radio station.

<p>In order to select the appropriate implementation, it is important to
understand the underlying PPS mechanism used by xntpd. The PPS support
depends on a continuous source of PPS pulses used to calculate an offset
within +-500 milliseconds relative to the local clock. The serial
timecode produced by the radio or the time determined by NTP in absence
of the radio is used to adjust the local clock within +-128 milliseconds
of the actual time. As long as the local clock is within this interval
the PPS support is used to discipline the local clock and the timecode
used only to verify that the local clock is in fact within the interval.
Outside this interval the PPS support is disabled and the timecode used
directly to control the local clock.

<p><h4>Parting Shots</h4>

<p>There are several undocumented programs which can be useful in
unusual cases. They can be found in the <code>./clockstuff</code> and
<code>./authstuff</code> directories of the distribution. One of these
is the <code>propdelay</code> program, which can compute high frequency
radio propagation delays between any two points whose latitude and
longitude are known. The program understands something about the
phenomena which allow high frequency radio propagation to occur, and
will generally provide a better estimate than a calculation based on the
great circle distance. Other programs of interest include
<code>clktest</code>, which allows one to exercise the generic clock
line discipline, and <code>chutest</code>, which runs the basic
reduction algorithms used by the daemon on data received from a serial
port.

<hr><address>David L. Mills (mills@udel.edu)</address></body></html>
