Протокол NTP

Network Time Protocol ( NTP ) — это сетевой протокол для синхронизации часов между компьютерными системами по сетям передачи данных с коммутацией пакетов и переменной задержкой . Действующий с 1985 года, NTP является одним из старейших интернет-протоколов, используемых в настоящее время. NTP был разработан Дэвидом Л. Миллсом из Делавэрского университета .

NTP предназначен для синхронизации всех участвующих компьютеров с точностью до нескольких миллисекунд по всемирному координированному времени (UTC).

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

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

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

Реализации отправляют и получают временные метки с использованием протокола пользовательских дейтаграмм (UDP) на порту номер 123/UDP.

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

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

Текущий протокол — версия 4 (NTPv4), которая обратно совместима с версией 3.

Для достижения максимальной точности предпочтительна постоянная работа программного обеспечения NTP в режиме системной службы. В семействе операционных систем Microsoft Windows — это служба W32Time, Linux — демон Ntpd или chronyd.

Часовые слои (Stratum)

NTP использует иерархическую полууровневую систему источников времени. Каждый уровень этой иерархии называется stratum, и ему присваивается номер, начинающийся с нуля, для эталонных часов наверху. Сервер, синхронизированный с сервером слоя n , работает в слое n + 1. Число представляет собой расстояние от эталонных часов и используется для предотвращения циклических зависимостей в иерархии. Stratum не всегда является показателем качества или надежности; обычно можно найти источники времени stratum 3, которые имеют более высокое качество, чем другие источники времени stratum 2. Краткое описание stratum'ов 0, 1, 2 и 3 приведено ниже.

Stratum 0 - это высокоточные устройства хронометража, такие как атомные часы , GNSS (включая GPS ) или другие радиочасы , или PTP-синхронизированные часы. Они генерируют очень точный импульс в секунду , который запускает прерывание и отметку времени на подключенном компьютере. Устройства уровня 0 также известны как эталонные часы. NTP-серверы не могут объявить себя stratum 0. Поле stratum, установленное в 0 в пакете NTP, указывает на неуказанный stratum.

Statum 1 - это компьютеры, системное время которых синхронизировано с точностью до нескольких микросекунд с подключенными к ним устройствами уровня 0. Серверы уровня 1 могут обмениваться данными с другими серверами уровня 1 для проверки работоспособности и резервного копирования. Их также называют первичными серверами времени.

Stratum 2 - это компьютеры, синхронизированные по сети с серверами уровня 1. Часто компьютер уровня 2 запрашивает несколько серверов уровня 1. Компьютеры 2-го уровня могут также обмениваться данными с другими компьютерами 2-го уровня, чтобы обеспечить более стабильное и надежное время для всех устройств в группе одноранговых узлов.

Stratum 3 - это компьютеры, синхронизированные с серверами уровня 2. Они используют те же алгоритмы пиринга и выборки данных, что и stratum 2, и сами могут выступать в качестве серверов для компьютеров stratum 4 и так далее.

Верхний предел для stratum'а равен 15;

Уровень 16 используется для указания того, что устройство не синхронизировано.

Алгоритмы NTP на каждом компьютере взаимодействуют, чтобы построить остовное дерево кратчайшего пути Беллмана-Форда , чтобы свести к минимуму накопленную задержку в оба конца до серверов уровня 1 для всех клиентов.

Помимо stratum, протокол способен идентифицировать источник синхронизации для каждого сервера с точки зрения эталонного идентификатора (refid).

RefidClock Source

GOES

Геосинхронный орбитальный спутник окружающей среды

GPS

GAL

Система позиционирования Галилео

PPS

Общее количество импульсов в секунду

IRIG

Группа междиапазонного приборостроения

WWVB

НЧ-радиостанция WWVB Форт Коллинз, Колорадо 60 кГц

DCF

НЧ-радиостанция DCF77 Майнфлинген, Германия 77,5 кГц

HBG

НЧ-радиостанция HBG Prangins, HB 75 кГц (прекратила работу)

MSF

НЧ-радиостанция MSF Anthorn, Великобритания 60 кГц

JJY

НЧ-радиостанция JJY Фукусима, JP 40 кГц, Сага, JP 60 кГц

LORC

СВ-радиостанция Loran-C, 100 кГц

TDF

СВ-радиостанция Allouis, FR 162 кГц

CHU

КВ-радиостанция CHU Оттава, Онтарио

WWV

КВ-радио WWV Форт-Коллинз, Колорадо

WWVH

КВ-радио WWVH Кауаи, Гавайи

NIST

телефонный модем NIST

ACTS

телефонный модем NIST

USNO

телефонный модем USNO

PTB

Немецкий телефонный модем стандарта времени PTB

MRS

(Неофициальные) несколько справочных источников

GOOG

(Неофициальный) Google Refid используется серверами Google NTP как time4.google.com

Для серверов уровня 2 и ниже refid представляет собой закодированную форму IP-адреса вышестоящего сервера времени. Для IPv4 это просто 32-битный адрес; для IPv6 это будут первые 32 бита хэша MD5 исходного адреса. Refid служат для обнаружения и предотвращения временных петель первой степени.

Поле refid заполняется словами состояния в случае пакетов KoD, которые говорят клиенту прекратить отправку запросов, чтобы сервер мог отдохнуть.

Некоторые примеры: INIT (инициализация), STEP (шаговое изменение времени) и RATE (клиент запрашивает слишком быстро). Выходные данные программы могут дополнительно использовать коды, не переданные в пакете, для указания на ошибку, например, XFAC для указания на отключение сети.

IANA ведет реестр имен источников refid и кодов KoD. Неофициальные задания все еще могут появляться.

Временные метки

Используемые NTP 64-битные двоичные временные метки с фиксированной запятой состоят из 32-битной части для секунд и 32-битной части для доли секунды, что дает шкалу времени, которая обновляется каждые 2^32 секунды (136 лет) и теоретическое разрешение 2^-32 секунды (233 пикосекунды). В NTP используется эпоха 1 января 1900 года. Таким образом, первый перенос произойдет 7 февраля 2036 года.

NTPv4 вводит 128-битный формат даты: 64 бита для секунд и 64 бита для долей секунды. Наиболее значащие 32 бита этого формата — это номер эры, который в большинстве случаев устраняет двусмысленность переноса. По словам Миллса, «64-битного значения дроби достаточно, чтобы определить количество времени, которое требуется фотону, чтобы пройти мимо электрона со скоростью света. 64-битного значения секунды достаточно, чтобы обеспечить однозначное представление времени, пока Вселенная не померкнет».

Программные реализации

Эталонная реализация

Эталонная реализация NTP, как и сам протокол, непрерывно развивается уже более 20 лет. При добавлении новых функций поддерживается обратная совместимость. Протокол содержит несколько чувствительных алгоритмов, в частности, для дисциплинирования часов, которые могут вести себя некорректно при синхронизации с серверами, использующими другие алгоритмы. Программа была перенесена практически на все вычислительные платформы, включая персональные компьютеры. Оно запускается как демон ntpd под Unix или как служба под Windows. Поддерживаются эталонные часы, смещения которых фильтруются и анализируются так же, как и на удаленных серверах, хотя обычно они опрашиваются чаще. Данная реализация прошла аудит в 2017 году, в результате которого было обнаружено 14 потенциальных проблем безопасности.

Windows Time (W32Time)

Все версии Microsoft Windows, начиная с Windows 2000, включают в себя службу Windows Time (W32Time), которая имеет возможность синхронизировать часы компьютера с NTP-сервером.

Изначально W32Time была реализована для целей протокола аутентификации Kerberos версии 5, который требовал, чтобы время было в пределах 5 минут от правильного значения для предотвращения атак воспроизведения. Версия в Windows 2000 и Windows XP реализует только SNTP и нарушает некоторые аспекты стандарта NTP версии 3.

Начиная с Windows Server 2003 и Windows Vista, W32Time стал совместим со значительным подмножеством NTPv3. Microsoft утверждает, что W32Time не может надежно поддерживать синхронизацию времени с точностью до одной секунды. Если требуется более высокая точность, Microsoft рекомендует использовать более новую версию Windows или другую реализацию NTP.

Начиная с версии Windows 10 1607 и Windows Server 2016, W32Time может быть настроен на достижение точности времени 1 с, 50 мс или 1 мс при определенных условиях работы.

OpenNTPD

В 2004 году Хеннинг Брауэр из OpenBSD представил OpenNTPD - реализацию NTPv3/SNTPv4 с акцентом на безопасность и разграничением привилегий. Несмотря на то, что она в большей степени ориентирована на более простые общие потребности пользователей OpenBSD, она также включает в себя некоторые улучшения в области безопасности протокола, сохраняя при этом совместимость с существующими NTP-серверами. Более простая кодовая база жертвует точностью, считая ее ненужной в данном случае. Портативная версия доступна в репозиториях пакетов для Linux.

NTPsec

NTPsec - это форк эталонной реализации, который был систематически усилен с точки зрения безопасности. Точка форка была выбрана в июне 2015 г. в ответ на серию компромиссов в 2014 г. Первый релиз был выпущен в октябре 2017 г. Благодаря удалению небезопасных функций, удалению поддержки устаревшего оборудования и удалению поддержки устаревших вариантов Unix, NTPsec удалось сократить 75% исходной кодовой базы, что облегчило аудит оставшейся части. Аудит кода, проведенный в 2017 году, выявил восемь проблем безопасности, в том числе две, которых не было в исходной эталонной реализации, но при этом NTPsec не страдал от восьми других проблем, которые остались в эталонной реализации.

chrony

chrony - независимая реализация NTP, в основном спонсируемая компанией Red Hat, которая использует ее в качестве программы времени по умолчанию в своих дистрибутивах. Будучи написанной с нуля, chrony имеет более простую кодовую базу, что позволяет повысить безопасность и снизить потребление ресурсов. Однако она не идет на компромисс в точности, а во многих случаях синхронизируется быстрее и лучше, чем эталонная ntpd. Она достаточно универсальна для обычных компьютеров, которые работают нестабильно, переходят в спящий режим или имеют прерывистое соединение с Интернетом. Он также предназначен для виртуальных машин - более нестабильной среды.

Chrony был оценен как "надежный", с небольшим количеством инцидентов. Он способен достичь повышенной точности при LAN-соединениях, используя аппаратную временную метку на сетевом адаптере. Поддержка Network Time Security (NTS) была добавлена в версии 4.0.

chrony доступен под GNU General Public License версии 2, был создан Ричардом Курновым в 1997 году и в настоящее время поддерживается Мирославом Личваром

Другие реализации

  • Ntimed был запущен Полом-Хеннингом Кампом из FreeBSD в 2014 году и заброшен в 2015 году. Реализация спонсировалась Linux Foundation.

  • systemd-timesyncd — это клиент SNTP, встроенный в systemd . Он используется Debian , начиная с версии «Bookworm» и нижестоящей Ubuntu.

Last updated