Ответ 1
(Это не алгоритм Марзулло, который используется только высокоуровневыми серверами для получения точного времени с использованием нескольких источников. Так обычный клиент получает время, используя только один сервер)
Прежде всего, отметки времени 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 может фактически определить, медленны или быстрые компьютерные часы, и автоматически настраивать их соответствующим образом, позволяя ему сохранять достаточно хорошее время, даже если оно позже отключено от сети. Вместе с усреднением ответов с сервера и применением более сложного мышления вы можете получить невероятно точное время.
Там, конечно, более правильная реализация, чем та, но суть ее.