> For the complete documentation index, see [llms.txt](https://antons-organization-1.gitbook.io/administrirovanie-linux/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://antons-organization-1.gitbook.io/administrirovanie-linux/servisy-linux/protokol-ntp.md).

# Протокол NTP

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

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

Он использует [алгоритм пересечения](https://en.wikipedia.org/wiki/Intersection_algorithm) , модифицированную версию [алгоритма Марзулло](https://en.wikipedia.org/wiki/Marzullo%27s_algorithm) , для выбора серверов точного времени и предназначен для смягчения последствий переменной задержки сети.&#x20;

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

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

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

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

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

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

Для достижения максимальной точности предпочтительна постоянная работа программного обеспечения 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](https://en.wikipedia.org/wiki/GNSS) (включая [GPS](https://en.wikipedia.org/wiki/Global_Positioning_System) ) или другие [радиочасы](https://en.wikipedia.org/wiki/Radio_clock) , или [PTP](https://en.wikipedia.org/wiki/Precision_Time_Protocol)-синхронизированные часы. Они генерируют очень точный импульс в секунду , который запускает прерывание и отметку времени на подключенном компьютере. Устройства уровня 0 также известны как эталонные часы. NTP-серверы не могут объявить себя stratum 0. Поле stratum, установленное в 0 в пакете NTP, указывает на неуказанный stratum.&#x20;

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

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

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

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

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

Алгоритмы NTP на каждом компьютере взаимодействуют, чтобы построить [остовное дерево](https://en.wikipedia.org/wiki/Spanning_tree) кратчайшего пути [Беллмана-Форда](https://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm) , чтобы свести к минимуму накопленную задержку в оба конца до серверов уровня 1 для всех клиентов.

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

<br>

| Refid | Clock Source                                                                                       |
| ----- | -------------------------------------------------------------------------------------------------- |
| GOES  | <p>Геосинхронный орбитальный спутник окружающей среды<br></p>                                      |
| GPS   | [спутниковая система навигации](https://en.wikipedia.org/wiki/Global_Positioning_System)           |
| GAL   | Система позиционирования [Галилео](https://en.wikipedia.org/wiki/Galileo_\(satellite_navigation\)) |
| PPS   | <p>Общее количество импульсов в секунду<br></p>                                                    |
| 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, которые говорят клиенту прекратить отправку запросов, чтобы сервер мог отдохнуть.&#x20;

Некоторые примеры: **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&#x20;

**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 году.[ ](https://en.wikipedia.org/wiki/Network_Time_Protocol#cite_note-F7zIq-64)Реализация спонсировалась Linux Foundation.
* **systemd-timesyncd** — это клиент SNTP, встроенный в systemd . Он используется Debian , начиная с версии «Bookworm»[ ](https://en.wikipedia.org/wiki/Network_Time_Protocol#cite_note-66)и нижестоящей Ubuntu.
