К счастью вопрос точного времени озаботил задолго до меня профессора Делаверского университета (University of Delaware) Дэвида Миллза (David Mills), который подарил миру реализацию сетевого протокола синхронизации времени (Network Time Protocol). На данный момент основной является четвертая версия (NTP v4) этого протокола.
Использование NTP позволяет обеспечить синхронизацию ваших часов с эталонными с точностью в несколько миллисекунд (существуют и наносекундные реализации, однако их использование обычно сопряжено с модификацией ядра операционной системы).
Рассмотрим использование NTP в системе FreeBSD (Linux).
Сначала необходимо скачать последнюю
версию исходных текстов пакета NTP с официального сайта http://www.ntp.org/.
Затем следует обычная процедура распаковки, компиляции и установки:
tar xvfz ntp-4.0.xx.tar.gz
cd
ntp-4.0.xx
./configure
make
make install (с правами
суперпользователя root)
Тем кто по тем или иным причинам желает обойтись без процедуры компиляции рекомендую скачать пакет в виде rpm (RedHat- подобные Linux), deb (Debian Linux) или pkg (FreeBSD) файла с ftp-сервера компании производителя вашей операционной системы. Настоятельно рекомендую всегда пользоваться самой последней версией пакета в целях снижения риска хакерской атаки (впрочем это выполнение этого правила желательно для любого программного обеспечения).
Существует два основных пути синхронизации времени: эпизодический (используется утилита ntpdate) и постоянный (используется демон ntpd). Следует заметить, что для успеха процедуры синхронизации времени требуются права суперпользователя root. Так же необходимо учесть использование протоколом NTP для синхронизации времени 123-го порта, который необходимо открыть для входящего и исходящего трафика (справедливости ради необходимо отметить, что использование утилиты ntpdate с ключом -u освобождает от этой необходимости).
Первый способ является единственно возможным при отсутствии постоянного подключения к Интернету, а так же не требует какого-либо конфигурирования. Однако недостатком этого метода является невысокая точность получаемого результата из-за нерегулярного запуска процедуры синхронизации.
Итак рассмотрим простой способ
синхронизации времени в момент установления PPP-соединения с
провайдером. Для этого в файл /etc/ppp/ip-up (в FreeBSD) или
/etc/ppp/ip-up.local (в современных версиях Linux) необходимо
добавить единственную строку:
ntpdate clepsydra.dec.com
Где
clepsydra.dec.com - URL сервера времени.
Публичных серверов точного времени в Интернете очень много. Большое количество адресов заслуживающих доверия, вместе с правилами их использования, опубликовано по адресам http://www.eecis.udel.edu/~mills/ntp/clock1.htm и http://www.eecis.udel.edu/~mills/ntp/clock2.htm. Эти списки постоянно дополняются и обновляются.
При выборе сервера для синхронизации, следует учесть время затрачиваемое на прохождение пакетов от сервера до вашей машины воспользовавшись утилитой ping. В общем случае чем меньше это время, тем выше будет точность синхронизации часов.
Оказывается автоматически получить точное время на часах вашего компьютера - достаточно просто. Однако если вы счастливый обладатель постоянного подключения к Интернету и у вас найдется 2-3 мегабайта свободной памяти, то можно воспользоваться вторым способом синхронизации времени при помощи демона ntpd, получив при этом гарантированную точность хода часов своего компьютера с максимальным отклонением от эталона в пределах десятка миллисекунд.
Для реализации этого способа
синхронизации времени необходимо создать конфигурационный файл
/etc/ntp.conf.
Пример файла /etc/ntp.conf:
# Список серверов
времени с указанием максимального и минимального интервала времени
запуска процесса синхронизации
server ntp.alaska.edu prefer
minpoll 8 maxpoll 16
server clepsydra.dec.com minpoll 8 maxpoll
16
server clock.isc.org minpoll 8 maxpoll 16
# Указание
ntpd в крайнем случае обращаться к встроенным часам
server
127.127.1.0
fudge 127.127.1.0 stratum 8
# Указание прав
доступа к серверу (по умолчанию "все запрещено")
restrict default
ignore
restrict 199.165.76.11 noquery
restrict 204.123.2.5
noquery
restrict 204.152.184.72 noquery
restrict 127.127.1.0
restrict 127.0.0.1
Запуск демона ntpd повлечет синхронизацию часов вашего компьютера с указанными серверами в автоматическом режиме с интервалом из указанного промежутка. Теперь за точность ваших часов можно ручаться.
Если к ваш компьютер подключен к
локальной сети, то вполне разумным будет сделать из него сервер
точного времени вашей локальной сети. Для этого в предыдущий пример
необходимо добавить следующее разрешение:
# Права доступа для
внутренней сети класса B 172.16.0.0/255.255.0.0
restrict
172.16.0.0 mask 255.255.0.0 noquery
Для синхронизации времени на
UNIX-машинах локальной сети целесообразно использовать утилиту
ntpdate, запуская ее при помощи демона cron несколько раз в сутки.
Для Windows-машин целесообразно использовать командный файл
следующего содержания:
net time /setsntp:my.ntp.server
net
time /set
Где my.ntp.server - DNS-имя вашего локального NTP сервера (вместо имени вполне подойдет и IP-адрес).
Что еще почитать:
Информации по
протоколу NTP в Интернете как ни странно не так уж и много, зачастую
она повторяют оригинальную документацию. Вот список источников
послуживших отправной точкой для данной статьи: