I’m looking for a simple clock synchronization protocol that would be easy to implement with small footprint and that would work also in the absence of internet connection, so that it could be used e.g. within closed laboratory networks. To be clear, I’m not looking for something that can be used just to order events (like vector clocks), but something that would enable processes on different nodes to synchronize their actions based on local clocks. As far as I understand, this would require a solution that can take clock drift into account. Presence of TCP/IP or similar relatively low-latency stream connections can be assumed.
I’m looking for a simple clock synchronization protocol that would be easy to implement
Share
Disclaimer: I’m not an NTP expert by any means. Just a hobbyist having fun on the weekend.
I realize you said you didn’t want an NTP implementation, because of the perceived complexity and because an Internet NTP server may not be available in your environment.
However, an simplified NTP look-up may be easy to implement, and if you have a local NTP server you can achieve good synchronization.
Here’s how:
Review RFC 5905
You’ll see NTP v4 packets look something like:
The digest is not required, so forming a valid client request is very easy. Following the guidance in the RFC, use LI = ’00’, VN = ‘100’ (decimal 4), Mode = ‘011’ (decimal 3).
Using C# to illustrate:
Open a socket to your target server and send it over.
In the response, the current time will be in the Transmit Timestamp (bytes [40 – 48]). Timestamps are 64-bit unsigned fixed-point numbers. The integer part is the first 32 bits, the fractional part is the last 32 bits. It represents the number of seconds since 0h on Jan-1-1900.
To update the clock with (roughly) second granularity, use: # of seconds since 0h Jan-1-1900 = intPart + (fractPart / 2^32). (I say roughly because network latency isn’t accounted for, and we’re rounding down here)
"now" is now a DateTime with the current time, in UTC.
While this might not answer your question, hopefully it makes NTP a little less opaque. =)