(Это не алгоритм Марзулло. Он используется только высокослойными серверами для получения действительно точного времени, используя несколько источников. Это то, как обычный клиент получает время, используя только один сервер)
Прежде всего, отметки времени NTP хранятся в секундах с 1 января 1900 года. 32 бита для количества секунд и 32 бита для доли секунды.
Синхронизация сложная. Клиент сохраняет метку времени (скажем, A) (все эти значения в секундах), когда он отправляет запрос. Сервер отправляет ответ, состоящий из «истинного» времени, когда он получил пакет (назовите это X), и «истинного» времени, когда он будет передавать пакет (Y). Клиент получит этот пакет и зарегистрирует время его получения (B).
NTP предполагает, что время, проведенное в сети, одинаково для отправки и получения. Через достаточные интервалы по нормальным сетям, это должно быть в среднем так. Мы знаем, что общее время прохождения от отправки запроса до получения ответа составляло B-A секунд. Мы хотим убрать время, которое сервер потратил на обработку запроса (Y-X), оставив только время обхода сети, так что это B-A- (Y-X). Поскольку мы предполагаем, что время обхода сети симметрично, время, которое потребовалось для ответа от сервера к клиенту, составляет [B-A- (Y-X)] / 2. Таким образом, мы знаем, что сервер отправил свой ответ в момент времени Y, и нам потребовалось [B-A- (Y-X)] / 2 секунды, чтобы получить этот ответ.
Таким образом, истинное время, когда мы получили ответ, составляет Y + [B-A- (Y-X)] / 2 секунды. И так работает NTP.
Пример (в полных секундах, чтобы упростить математику):
- Клиент отправляет запрос в «неправильное» время 100. A = 100.
- Сервер получает запрос в «истинное» время 150. X = 150.
- Сервер работает медленно, поэтому он не отправляет ответ до «истинного» времени 160. Y = 160.
- Клиент получает запрос в «неправильное» время 120. B = 120.
- Клиент определяет время, проведенное в сети: B-A- (Y-X) = 120-100- (160-150) = 10 секунд
- Клиент предполагает, что время, необходимое для получения ответа от сервера к клиенту, составляет 10/2 = 5 секунд.
- Клиент добавляет это время к «истинному» времени, когда сервер отправил ответ, чтобы оценить, что он получил ответ в «истинное» время 165 секунд.
- Клиент теперь знает, что ему нужно добавить 45 секунд к своим часам.
В правильной реализации клиент все время работает как демон. В течение длительного периода времени со многими сэмплами NTP может фактически определить, являются ли часы компьютера медленными или быстрыми, и автоматически настроить их соответствующим образом, позволяя ему сохранять разумное время, даже если он впоследствии отключен от сети. Вместе с усреднением ответов от сервера и применением более сложного мышления вы можете получить невероятно точное время.
Конечно, правильная реализация - это нечто большее, но в этом суть.