Телекоммуникационные технологии. Том 1

       

Процедура передачи


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

Нижеприведенный фрагмент программы инициализирует пакетный буфер и копирует пакетные переменные.

pkt.peeraddr

/* копирование системных и партнерских переменных */

pkt.peerport

pkt.hostaddr

pkt.hostport

pkt.leap

pkt.version

pkt.mode

pkt.stratum



pkt.poll

pkt.precision

pkt.rootdelay

if (sys.leap = 112 or (sys.clock - sys.reftime) > ntp.maxage)

skew

else

skew j (sys.clock - sys.reftime);

{pkt.rootdispersion

pkt.refid

pkt.reftime

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

pkt.org

/* копирование временных меток */

pkt.rec

pkt.xmt

peer.xmt

Регистр доступности сдвигается на одну позицию влево, в освободившийся разряд записывается нуль. Если все биты регистра равны нулю, вызывается процедура очистки (clear procedure) для обнуления фильтра часов и выбора, если необходимо, нового источника синхронизации. Если ассоциация не была сконфигурирована при инициализации, то она ликвидируется.

peer.reach

/* актуализация доступности */

if (peer.reach = 0 and peer.config =0)

begin

ликвидируем ассоциацию;

exit;

endif

Если корректные данные введены в сдвиговый регистр фильтра хотя бы раз за время предыдущих двух периодов рассылки (младший бит peer.reach равен 1), счетчик корректных данных увеличивается на 1. После восьми таких удачных периодов интервал рассылки увеличивается. Процедура выбора часов вызывается, если необходимо заменить источник синхронизации.

if (peer.reach & 6 ? 0) /* Проверка младших двух бит */
if (peer.valid << ntp.shift) /* получены корректные данные */

peer.valid <- peer.valid + 1;

else peer.hostpoll <- peer.hostpoll + 1;

else begin

peer.valid

/* ничего не слышно */

peer.hostpoll

call clock-filter(0, 0, ntp.maxdisperse);

call clock-select; /* выбираем источник синхронизации */

endif

call poll-update;

end transmit procedure;



Содержание раздела