What’s NTP (Network Time Protocol)
This post is about NTP Software implementations actually, but I have to write some words about NTP. NTP is an angle for financial applications, actually some of services such as banking services are very depended to clock synchronizations protocols. NTP is an ancient thing, it is more than 30 years old and even older than Windows 7 and Windows XP.
NTP was designed by David L. Mills of the University of Delaware. I should thank the man more than Steve Jobs!
NTP is intended to synchronize all participating computers to within a few milliseconds of Coordinated Universal Time(UTC). It uses the intersection algorithm, a modified version of Marzullo’s algorithm, to select accurate time servers and is designed to mitigate the effects of variable network latency. NTP can usually maintain time to within tens of milliseconds over the public Internet, and can achieve better than one millisecond accuracy in local area networks under ideal conditions. Asymmetric routes and network congestion can cause errors of 100 ms or more.
The protocol is usually described in terms of a client-server model, but can as easily be used in peer-to-peer relationships where both peers consider the other to be a potential time source. Implementations send and receive timestamps using the User Datagram Protocol (UDP) on port number 123. They can also use broadcasting or multicasting, where clients passively listen to time updates after an initial round-trip calibrating exchange. NTP supplies a warning of any impending leap second adjustment, but no information about local time zones or daylight saving time is transmitted.
The current protocol is version 4 (NTPv4), which is a proposed standard as documented in RFC 5905. It is backward compatible with version 3, specified in RFC 1305.
You can also see my presentation about NTP and how it does work at SlideShare:
The NTP reference implementation, along with the protocol, has been continuously developed for over 20 years. Backwards compatibility has been maintained as new features have been added. It contains several sensitive algorithms, especially to discipline the clock, that can misbehave when synchronized to servers that use different algorithms. The software has been ported to almost every computing platform, including personal computers. It runs as a daemon called ntpd under Unix or as a service under Windows. Reference clocks are supported and their offsets are filtered and analysed in the same way as remote servers, although they are usually polled more frequently.
Software Implementations
NTP Implementations
NTP (RFC 5905):
- The NTP Reference Implementation from The NTP Project at the University of Delaware. Includes a Simple NTP (SNTP) client.
- Windows Port of NTPD: Free Windows port of The NTP Reference Implementation from http://www.ntp.org with an easy-to-use installer
- NTPsec a hardened implementation derived from NTP Classic, Dave Mills’s original.
- Chrony: Chronyd implements the NTP protocol and can act as either a client or a server.
Simple NTP (SNTP) Implementations
SNTP (RFC 4330):
- OpenNTPD: A portable Simple NTPD implementation by the OpenBSD group
- clockspeed: A simplest available and secure suite of NTP/SNTP client, clock skew eliminator, and precise time synchronization server and client
- dntpd: A simple client ntpd in DragonFly BSD
- ConnMan: ConnMan contains an NTP implementation.
- BusyBox, since version 1.16.2, has included an SNTP client and server based on OpenNTP.
- systemd-timesyncd: A linux and systemd specific client implementation of SNTP.
NTP Software Implementations Comparison
The below comparison is between NTPD, Chrony and OpenNTPD.
The ntpd program is an operating-system daemon that sets and maintains a computer system’s system time in synchronization with Internet-standard time servers. It is a complete implementation of the Network Time Protocol (NTP) version 4, but retains compatibility with versions 1, 2, and 3 as defined by RFC 1059, RFC 1119, and RFC 1305, respectively. ntpd performs most computations in 64-bit floating point arithmetic and uses 64-bit fixed point operations only when necessary to preserve the ultimate precision, about 232 picoseconds. While ordinary workstations and networks cannot achieve the ultimate precision as of 2015, future processors and networks may require it.
OpenNTPD, In 2004, Henning Brauer presented OpenNTPD, an NTP implementation with a focus on security and encompassing a privilege separated design. Whilst it is aimed more closely at the simpler generic needs of OpenBSD users, it also includes some protocol security improvements whilst still being compatible with existing NTP servers. It was originally designed for OpenBSD but has a portable version available and that has been made available as a package in Linux package repositories.
Chrony comes by default in Red Hat distributions and is available in the Ubuntu repositories. Chrony is aimed at ordinary computers, which are unstable, go into sleep mode or have intermittent connection to the Internet. Chrony is also designed for virtual machines, a much more unstable environment. It is characterized by low resource consumption (cost) and supports PTPas well as NTP. It has two main components: chronyd, a daemon that is executed when the computer starts, and chronyc, a command line interface to the user for its configuration. It has been evaluated as very safe and with just a few incidents, its advantage is the versatility of its code, written from scratch to avoid the complexity of code. Chrony is written under GNU General Public License version 2, was created by Richard Curnow in 1997 with others along time and is currently maintained by Miroslav Lichvar, development supported by Red Hat Software.
Feature Comparison
Basic Features
|
chrony |
ntp |
openntpd |
Supported systems |
Linux, FreeBSD, NetBSD, Solaris, macOS |
Linux, FreeBSD, NetBSD, OpenBSD, Solaris, macOS, Windows, … |
Linux, FreeBSD, NetBSD, OpenBSD, Solaris, macOS |
License |
GPLv2 |
MIT + BSD |
BSD |
Programming language |
C |
C |
C |
Size of stripped daemon binary in default configuration on Linux x86-64 |
210 KB |
840 KB |
87 KB |
Time Sources
|
chrony |
ntp |
openntpd |
NTP |
Yes |
Yes |
Yes |
Reference clocks |
Yes |
Yes |
Yes |
Manual input |
Yes |
No |
No |
Source Tracking
|
chrony |
ntp |
openntpd |
Fixed sample filtering |
Yes |
Yes |
Yes |
Adaptive sample filtering |
Yes |
No |
No |
Sample weighting |
Yes |
No |
No |
Frequency tracking |
Yes |
No |
No |
Restore state from file |
Yes |
No |
No |
Source Selection
|
chrony |
ntp |
openntpd |
Nonrandom selection |
Yes |
Yes |
Yes |
Falseticker detection |
Yes |
Yes |
No |
Clustering |
No |
Yes |
No |
Offset combining |
Yes |
Yes |
No |
Frequency combining |
Yes |
N/A |
N/A |
Minimum number of sources |
1 (configurable) |
1 (configurable) |
1 |
Clock Discipline
|
chrony |
ntp |
openntpd |
Independent phase and frequency control |
Yes |
No |
Yes |
Allowed random update interval (e.g. intermittent connection) |
Yes |
No |
Yes |
Step threshold |
Infinity (configurable) |
0.128 s (configurable) |
N/A |
Limited number of steps |
Yes (configurable) |
No |
Yes |
Panic threshold |
Infinity (configurable) |
1000 s (configurable) |
N/A |
Maximum slew rate |
System specific (Linux: 100000 ppm, FreeBSD, NetBSD, macOS: 5000 ppm, Solaris: 32500 ppm) (configurable) |
500 ppm |
System specific (Linux: 500 ppm, FreeBSD, NetBSD: 5000 ppm, Solaris: 65000 ppm) |
Restore frequency from file |
Yes |
Yes |
Yes |
Limited wakeups (power saving) |
Yes |
No |
Yes |
Temperature compensation |
Yes |
No |
No |
NTP Modes
|
chrony |
ntp |
openntpd |
Server (mode 4) |
Yes |
Yes |
Yes |
Client (mode 3) |
Yes |
Yes |
Yes |
Persistent symmetric |
Yes |
Yes |
No |
Ephemeral symmetric |
No |
Yes |
No |
Broadcast server |
Yes |
Yes |
No |
Broadcast client |
No |
Yes |
No |
Multicast server |
No |
Yes |
No |
Multicast client |
No |
Yes |
No |
Manycast server |
No |
Yes |
No |
Manycast client |
No |
Yes |
No |
Interleaved server |
Yes |
No |
No |
Interleaved client |
Yes |
? |
No |
Interleaved symmetric |
Yes |
Yes |
No |
Interleaved broadcast |
No |
Yes |
No |
NTP Client
|
chrony |
ntp |
openntpd |
Multiple servers per name (pool) |
Yes |
Yes |
Yes |
Fixed delay-based sample filtering |
Yes |
Yes |
Yes |
Adaptive delay-based sample filtering |
Yes |
No |
No |
Estimation of asymmetric jitter |
Yes |
No |
No |
KoD RATE handling |
Yes |
Yes |
No |
Ready for next NTP era (year 2036) |
Yes |
Yes |
No |
Extra timestamp validation |
No |
No |
Yes (HTTPS date) |
Configurable port number |
Yes |
No |
No |
NTP Server
|
chrony |
ntp |
openntpd |
Protocol version |
NTPv4 |
NTPv4 |
SNTPv4 |
Root dispersion/delay accumulation |
Yes |
Yes |
No |
Adaptive dispersion rate |
Yes |
No |
N/A |
Restricted access |
Yes |
Yes |
No |
Response rate limiting |
Yes |
Yes |
No |
Local reference |
Yes |
Yes |
No |
Orphan mode |
Yes |
Yes |
No |
Served time not fixed to local time |
Yes |
No |
Yes |
Time smoothing |
Yes |
N/A |
No |
Configurable port number |
Yes |
No |
No |
NTP Authentication
|
chrony |
ntp |
openntpd |
Symmetric key |
Yes |
Yes |
No |
Autokey (insecure) |
No |
Yes |
No |
Network Time Security |
N/A |
N/A |
N/A |
MS-SNTP via Samba |
Yes |
Yes |
No |
MAC hash functions |
MD5, SHA-1, SHA-2, … |
MD5, SHA-1, SHA-2, AES-CMAC, … |
N/A |
NTP Pool
|
chrony |
ntp |
openntpd |
Number of used servers |
By DNS, max 4 (configurable) |
10 (configurable) |
By DNS |
Replace unreachable |
Yes |
Yes |
No |
Replace falsetickers |
Yes |
Yes |
N/A |
NTP Poll Control
|
chrony |
ntp |
openntpd |
Polling interval |
64-1024 s (configurable) |
64-1024 s (configurable) |
5-1500 s |
Minimum configurable polling interval |
1/64 s |
8 s |
N/A |
Randomization |
Yes |
Yes |
Yes |
Burst |
Yes |
Yes |
No |
Interval independent from other sources |
Yes |
Yes |
No |
Aware of jitter |
Yes |
Yes |
No |
User-controlled polling |
Yes |
No |
No |
NTP Timestamping
|
chrony |
ntp |
openntpd |
Kernel RX timestamping |
Yes |
Yes |
Yes |
Kernel TX timestamping |
Yes (Linux) |
No |
No |
Hardware RX timestamping |
Yes (Linux) |
No |
No |
Hardware TX timestamping |
Yes (Linux) |
No |
No |
Reference Clock
|
chrony |
ntp |
openntpd |
System drivers |
PPS, PTP clock (Linux) |
PPS |
Timedelta sensors (OpenBSD) |
Interfaces for 3rd party drivers |
SHM, SOCK |
SHM |
None |
Number of HW-specific drivers |
0 |
> 30 |
0 |
Sample filtering |
Yes |
Yes |
Yes |
Real-Time Clock (RTC)
|
chrony |
ntp |
openntpd |
Time initialization from RTC |
Yes (Linux) |
No |
No |
RTC drift tracking |
Yes (Linux) |
No |
No |
RTC trimming |
Yes (Linux) |
No |
No |
Kernel RTC synchronization |
Yes (Linux, macOS) |
Yes (Linux) |
Yes (Linux) |
Restore time from file w/o RTC |
Yes |
No |
No |
Leap Seconds
|
chrony |
ntp |
openntpd |
Clock correction modes |
system, step, slew, ignore |
system, step, ignore |
ignore |
Majority of sources required to agree on leap |
Yes |
Yes |
No |
Additional leap second source |
system tzdata |
leapfile |
N/A |
Server leap smear |
Yes (quadratic) |
Yes (cosine) |
N/A |
Accepted on |
Jun 30 / Dec 31 |
any day |
any day |
Applied on |
Jun 30 / Dec 31 |
last day of any month |
N/A |
Announced on |
Jun 30 / Dec 31 |
last day of any month |
any day |
Run-time Management
|
chrony |
ntp |
openntpd |
Local monitoring |
Yes |
Yes |
Yes |
Local configuration |
Yes |
Yes |
No |
Remote monitoring |
Yes |
Yes |
No |
Remote configuration |
No (chrony >= 2.2) |
Yes |
No |
Restricted access |
Yes |
Yes |
N/A |
Security
|
chrony |
ntp |
openntpd |
Root privileges dropping (in all processes) |
Yes (Linux) |
Yes (Linux, NetBSD, Solaris) |
No |
Privilege separation |
Yes (FreeBSD, NetBSD, macOS, Solaris) |
No |
Yes |
System call filter (seccomp, pledge) |
Yes (Linux) |
Yes (Linux) |
Yes (OpenBSD) |
Random NTP client source port |
Yes |
No |
Yes |
Fully random transmit timestamp in client packets |
Yes |
No |
Yes |
Sub-second randomization of polling interval |
Yes |
No |
No |
Connected NTP client sockets |
Yes |
No |
Yes |
NTP server port disabled by default |
Yes |
No |
Yes |
Remote management disabled by default |
N/A |
No |
N/A |
Remote management port separate from NTP |
Yes |
No |
N/A |
No traffic amplification in management protocol |
Yes |
No |
N/A |
Non-blocking response rate limiting |
Yes |
No |
N/A |
Summary of Comparison of Chrony and NTPD
Things Chrony Can Do Better Than NTP
- Chrony can perform usefully in an environment where access to the time reference is intermittent. NTP needs regular polling of the reference to work well.
- Chrony can usually synchronize the clock faster and with better time accuracy.
- Chrony quickly adapts to sudden changes in the rate of the clock (e.g. due to changes in the temperature of the crystal oscillator). NTP may need a long time to settle down again.
- Chrony can perform well even when the network is congested for longer periods of time.
- Chrony in the default configuration never steps the time to not upset other running programs. NTP can be configured to never step the time too, but in that case it has to use a different means of adjusting the clock (daemon loop instead of kernel discipline), which may have a negative effect on accuracy of the clock.
- Chrony can adjust the rate of the clock in a larger range, which allows it to operate even on machines with broken or unstable clock (e.g. in some virtual machines).
- Chrony is smaller, it uses less memory and it wakes up the CPU only when necessary, which is better for power saving.
Things Chrony Can Do That NTP Can’t
- Chrony supports hardware time-stamping on Linux, which allows extremely accurate synchronization on local networks.
- Chrony provides support for isolated networks whether the only method of time correction is manual entry (e.g. by the administrator looking at a clock). Chrony can look at the errors corrected at different updates to work out the rate at which the computer gains or loses time, and use this estimate to trim the computer clock subsequently.
- Chrony provides support to work out the gain or loss rate of the real-time clock, i.e. the clock that maintains the time when the computer is turned off. It can use this data when the system boots to set the system time from a corrected version of the real-time clock. These real-time clock facilities are only available on Linux, so far.
Things NTP Can Do That Chrony Can’t
- NTP supports all operating modes from RFC 5905, including broadcast, multicast, and manycast server/client. However, the broadcast and multicast modes are inherently less accurate and less secure (even with authentication) than the ordinary server/client mode, and should generally be avoided.
- NTP supports the Autokey protocol (RFC 5906) to authenticate servers with public-key cryptography. Note that the protocol has been shown to be insecure and it will be probably replaced with an implementation of the Network Time Security (NTS) specification.
- NTP has been ported to more operating systems.
- NTP includes a large number of drivers for various hardware reference clocks. Chrony requires other programs (e.g. gpsd or ntp-refclock) to provide reference time via the SHM or SOCK interface.
See Also
[Script]: Check Time Synchronization with Host on Virtual Machines – PowerCLI