Как работает протокол сетевого времени? - PullRequest
38 голосов
/ 04 августа 2009

Запись в Википедии не содержит подробностей, а RFC слишком плотный. Кто-нибудь здесь знает, в общих чертах, как работает NTP?

Я ищу обзор, который объясняет, как алгоритм Марзулло (или его модификация) используется для преобразования временной метки на сервере в метку времени на клиенте. В частности, какой механизм используется для получения точности, которая в среднем составляет 10 мс, когда эта связь происходит по сети с очень изменчивой задержкой, которая часто в несколько раз больше.

Ответы [ 4 ]

86 голосов
/ 05 августа 2009

(Это не алгоритм Марзулло. Он используется только высокослойными серверами для получения действительно точного времени, используя несколько источников. Это то, как обычный клиент получает время, используя только один сервер)

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

Конечно, правильная реализация - это нечто большее, но в этом суть.

6 голосов
/ 05 августа 2009
  1. Клиент NTP запрашивает все свои NTP серверы, который час.
  2. Разные серверы дадут разные ответы, с разным уровнем доверия, потому что запросы будут занимать разные суммы времени для поездки от клиента до сервер и обратно.
  3. Алгоритм Марзулло найдет наименьшее диапазон значений времени в соответствии с все ответы предоставлены.
  4. Вы можете быть более уверены в точности ответа этого алгоритма, чем в любом отдельном сервере времени, поскольку пересечение нескольких наборов, вероятно, будет содержать меньше элементов, чем любой отдельный набор.
  5. Чем больше серверов вы запрашиваете, тем больше у вас будет ограничений на возможный ответ, и тем точнее будут ваши часы.
0 голосов
/ 05 августа 2009

Если вы используете временные метки для принятия решения о заказе, определенное время может не быть необходимым. Вместо этого вы могли бы использовать ламповые часы , которые менее болезненны, чем синхронизация сети. Он может сказать вам, что пришло «первым», но не точную разницу во времени. Неважно, что на самом деле показывают часы компьютера.

0 голосов
/ 04 августа 2009

Хитрость в том, что некоторые пакеты быстрые, а быстрые пакеты дают вам жесткие ограничения по времени.

...