Как протокол сетевого времени работает?

Просто, потому что никто еще еще не сказал волшебные слова: это пустой оператор объединения. Это определяется в разделе 7.12 из спецификация языка .

C# 3.0, Это очень удобно, особенно из-за способа, которым это работает, когда это используется многократно в выражении. Выражение формы:

a ?? b ?? c ?? d

даст результат выражения a, если это будет непустым, иначе попробуйте b, иначе попробуйте c, иначе попробуйте d. Это закорачивает в каждой точке.

кроме того, если тип d является не допускающим NULL-значения, тип целого выражения является не допускающим NULL-значения также.

41
задан Waylon Flinn 4 August 2009 в 15:13
поделиться

4 ответа

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

Прежде всего, временные метки NTP сохраняются в секундах с 1 января 1900 г. 32 бита для количества секунд и 32 бита для долей секунды.

Синхронизация сложна. Клиент сохраняет метку времени (скажем, A) (все значения указаны в секундах), когда он отправляет запрос. Сервер отправляет ответ, состоящий из «истинного» времени, когда он получил пакет (назовите это X), и «истинного» времени, когда он будет передавать пакет (Y). Клиент получит этот пакет и зарегистрирует время его получения (B).

NTP предполагает, что время, проведенное в сети, одинаково для отправки и получения. При достаточном количестве интервалов в нормальных сетях это должно быть так. Мы знаем, что общее время прохождения от отправки запроса до получения ответа составило BA секунд. Мы хотим удалить время, которое сервер потратил на обработку запроса (YX), оставив только время обхода сети, так что это BA- (YX). Поскольку мы предполагаем, что время обхода сети симметрично, время, необходимое для получения ответа от сервера клиенту, составляет [BA- (YX)] / 2. Итак, мы знаем, что сервер отправил свой ответ в момент Y, и нам потребовалось [BA- (YX)] / 2 секунды, чтобы этот ответ дошел до нас.

Таким образом, истинное время, когда мы получили ответ, - Y + [ BA- (YX)] / 2 секунды. Вот как работает NTP.

Пример (в целых секундах, чтобы упростить вычисления):

  • Клиент отправляет запрос в «неправильное» время 100. A = 100.
  • Сервер получает запрос в «истинное» время 150. X = 150.
  • Сервер работает медленно, поэтому он не отправляет ответ до «истинного» времени 160. Y = 160.
  • Клиент получает запрос в «неправильное» время 120. B = 120.
  • Клиент определяет, что время, затрачиваемое на сеть, составляет BA- (YX) = 120-100- (160-150) = 10 секунд
  • Клиент предполагает, что время, необходимое для получения ответа от сервера клиенту, равно 10/2 = 5 секунд.
  • Клиент добавляет это время к «истинному» времени, когда сервер отправил ответ, чтобы оценить, что он получил ответ в «истинное» время 165 секунд.
  • Теперь клиент знает, что ему нужно чтобы добавить 45 секунд к его часам.

В правильной реализации клиент все время работает как демон. В течение длительного периода времени с множеством выборок NTP может фактически определить, являются ли часы компьютера медленными или быстрыми, и автоматически настроить их соответствующим образом, позволяя ему поддерживать достаточно хорошее время, даже если он позже будет отключен от сети. Вместе с усреднением ответов от сервера и применением более сложного мышления вы можете получить невероятно точное время.

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

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

Конечно, для правильной реализации есть еще кое-что, но это суть.

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

Конечно, для правильной реализации есть еще кое-что, но это суть.

92
ответ дан 27 November 2019 в 00:23
поделиться
  1. Клиент NTP запрашивает все свои NTP сервера, который час.
  2. Разные серверы дадут разные ответы, с разной степенью уверенности, потому что запросы будут принимать разные суммы времени на поездку от клиента до сервер и обратно.
  3. Алгоритм Марзулло найдет наименьшее диапазон значений времени в соответствии с все предоставленные ответы.
  4. Вы можете быть более уверены в точности ответа от этого алгоритма, чем от ответа от любого отдельного сервера времени, потому что пересечение нескольких наборов, вероятно, будет содержать меньше элементов, чем любой отдельный набор.
  5. Чем больше серверов вы запрашиваете, тем больше ограничений у вас будет на возможный ответ, и тем точнее будут ваши часы.
6
ответ дан 27 November 2019 в 00:23
поделиться

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

0
ответ дан 27 November 2019 в 00:23
поделиться

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

-2
ответ дан 27 November 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: