This repository has been archived by the owner on Sep 9, 2021. It is now read-only.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Запуск сервера:
python ntp_server 127.0.0.1 123
NTP (англ. Network Time Protocol — протокол сетевого времени) — сетевой протокол для синхронизации внутренних часов компьютера с использованием сетей с переменной латентностью.
Суть работы:
Клиент имеет собственное локальное время и формирует NTP-пакет, в котором указывает Vesion_number (1-4), Mode (client=3) и Transmit. В поле Transmit клиент кладёт своё локальное время при отправке.
Сервер получает запрос и формирует ответный NTP-пакет. В поле Originate сервер копирует время, записанное клиентом в Transmit, в поле Receive записывает время получения им пакета, в поле Transmit - время отправки ответного пакета клиенту.
В итоге, у клиента оказывается 4 времени: время отправки им запроса (Originate), время получения запроса сервером (Receive), время отправки ответа сервером (Transmit) и время получения ответа клиентом (Arrive), которое смотрится в момент прихода ответа от сервера.
Корректировка времени на клиенте происходит следующим образом:
(Arrive − Originate) − (Transmit − Receive), где (Transmit − Receive) - время на обработку пакета на сервере, (Arrive − Originate) - время, прошедшее с момента отправки пакета клиентом до момента получения им ответа от сервера.
Но пакет шёл сначала от клиента к серверу, а затем обратно, поэтому для нахождения времени в пути в одну сторону,
полученное значение делится на два. Итоговое время пакета в пути в одну сторону:
((Arrive − Originate) − (Transmit − Receive))/2
Receive − Originate - время пакета в пути от клиента к серверу =
= Receive − Originate − ((Arrive − Originate) − (Transmit − Receive))/2=
= (Receive − Originate − Arrive − Transmit)/2
Формат NTP-пакета:
LI - Leap Indicator - информация о секунде коррекции
VN - Version Number - номер версии NTP (1-4)
Mode - режим работы отправителя пакета (3 - клиент, 4 - сервер)
Stratum - Количестве слоёв между сервером и эталонными часами (1 - сервер берёт информацию прямо с эталонных часов)
Poll - интервал, с которым предполагается взаимодействие. Клиент вписывает, с каким интервалом он будет опрашивать сервер, сервер - интервал, с которым он предполагает, что его будут опрашивать, log2(сек)
Precision - точность системных часов, log2(сек)
Root delay - время, за которое показания часов доходят до NTP-сервера (число секунд с плавающей точкой)
Root dispersion - разброс показаний часов NTP-сервера (число секунд с плавающей точкой)
Reference Identifier - id источника времени сервера. Если сервер берёт информацию напрямую с эталонных часов, то здесь содержится код этих часов, иначе - адрес сервера, с которого берётся время.
Reference Timestamp - последнее время на сервере
Originate Timestamp - время отправки запроса на сервер
Receive Timestamp - время получения запроса сервером
Transmit Timestamp - время отправки ответа с сервера