ждать (>интервал-усечения-ікадра*случайнос-число (0, макс- выдержек)).

end.-, {выдержка}.

junction случайное-число (минимум, максимум: integer): integer;

begin

случайное-число : = ... {равномерно распределенное слу­чайное целое число г, удовлетворя­ющее условию минимум <г< мак­симум}.

end', {случайное-число}.

Процедура «выдержка» выполняет усеченный экспоненциаль­ный алгоритм выдержки, после чего ожидает в течение вычисленно­го периода времени, кратного интервалу окна ответа.

Процесс «отсрочки» выполняется асинхронно для непрерывно­го вычисления необходимого значения переменной отсрочки.

process отсрочка.

begin

cycle {основной цикл}.

while not опознавание-несущей do холостое;

{контроль за появлением несущей};

выполняет отсрочку := true; {начало задержки новой передачи};

передавалось ;= передается;

while опознавание_несущей ог передается then;

передавалось := передавалось ог передается;

if передавалось do.

begin

начало-задержки_реал_времени; {тайм-аут первой части межкадрового интерва­ла}.

while задержка-реал-времени (межкадровый-интервал- часть_1) do холостое.

end

else

begin

начало_задержки_реал-времени;

repeat

while опознавание-несущей do начало-задержки-реал-вре- мени.

until not задержка_реал-времени (межкадровый-интервал -часть-1).

end;

начало_задержки-реал_времени; {тайм-аут второй части меж­кадрового интервала}.

while задержка-реал-времени (межкадровый-интервал-часть-

2) do холостое;

отсрочка : = false; {разрешить продолжение новой передачи}.

while кадр_ожидает do холостое; {разрешить ожидание переда­чи при необходимости}.

end {основной цикл}.

end', отсрочка.

procedure начало-задержки-реал-времени.

begin

{сброс таймера реального времени и повторный его запуск}

end', {начало-задержки-реал-времени}.

function задержка_реал_времени (мкс: real): boolean;

begin

{возврат значения true, если заданное число микросекунд не истекло с момента последнего привлечения начала-задерж- ки-реал-времени, в противном случае возврат значения}

end', {задержка-реал-времени}.

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

process передатчик-битов;

begin

cycle (внешний цикл);

if передается then;

begin {внутренний цикл}.

комп_физ_сигналов; {передача преамбулы и НОК}.

while передается do.

begin

передача бита (исходящий кадр [текущий-передавае- мый-бит]); {передача следующего бита физическому уровню};

if новый-конфликт then начало-НК else следующий- бит.

, end;

end', {внутренний цикл}.

end; {внешний цикл).

end;{передатчик-битов}.

procedure комп-физ-сигналов;

begin

while текущий_передаваемый_бит < последний-бит-заголов- ка do.

begin

передаваемый_бит (исходящий-заголовок [текущий-пере-
даваемый-бит]); {побитная передача заголовка}.

текущий-передаваемый-бит := текущий-передаваемый- бит +1;

end

if новый-конфликт then начало-НК else;

текущий_передаваемый-бит := 1.

end; {комп-физ-сигналов}.

procedure следующий-бит.

begin

текущий-передаваемый-бит : = текущий-псредаваемый- бит 4*1 передается := (текущий-передаваемый-бит с последний -передаваемый-бит)

end; {следующий_бит}.

procedure начало_НК.

begin

текущий-передаваемый-бит := J;

последний-передаваемый-бит := длина-НК; 1

новый-конфликт : = false;

end; {начало-НК}.

При обнаружении нового конфликта процесс передатчик-битов немедленно усиливает его, вызывая процесс начало_НК с целью инициации передачи комбинации НК. Эта комбинация должна со­держать достаточное число битов произвольных данных, чтобы га­рантировать обнаружение конфликта обеими взаимодействующи­ми станциями (Комбинация НК использует первый набор битов кадра в количестве до длина_НК исключительно с целью упроще­ния этой программы).

4.2.9. Прием кадра данных

Рассматриваемый в данном разделе алгоритм определяет прием кадра подуровнем доступа к среде КДОН/ОК.

Процедура прием_кадра выполняет операцию приема кадров для подуровня УЛЗ:

function прием-кадра (

var парам-получателя: значение_адреса;

var парам-отправителя: значение-адреса;

var парам_длины: значение-длины;

var парам_данных: значение-данных): состояние-приема; function раскомп-принятых-данных: состояние_приема; . . .

{гнездовая функция; см. ниже тело программы}. begin

repeat

упр-звеном-приема;

прием-кадра := раскомп-принятых-данных;

until продолжение-приема;

end; {прием-кадра}.

Функция прием_кадра вызывает процедуру упр-звеном-приема для приема следующего действительного кадра, затем вызывает внутреннюю процедуру раскомп-принятых-данных для передачи молей кадра подуровню УЛЗ, если адрес кадра указывает на то, что это следует сделать. Возвращенное состояние-приема указы­вает на наличие или отсутствие ошибок передачи в кадре.

function раскомп-принятых-данных: состояние-приема;

begin

продолжение_приема := распознавание-адреса (входящий- кадр, поле-получателя);

if продолжение_приема then with входящий-кадр do begin {разборка кадра};

вид := поля;

парам-получателя := поле-получателя; парам-отправителя := поле-отправителя; парам_длины := поле_длины;

параім-данных : = удаление-ЗАП {поле-длины, поле-дан- ных);

if поле-кик = ЦИК32 (входящий-кадр) then. .

begin

if правильная-длина then раскомп-принятых-данных : = принят_ХОР.

else раскомп-принятых-данных := ошибка-длины end

else begin if избыточные_биты=0 then раскомп-принятых-данных : = ошибка-КПК;

else раскомп_принятых-данных := некратность-октету; end;

вид : = биты;

end {разборка кадра}

end; {раскомп-принятых-данных}.

function распознавание-адреса (адрес: значение_адреса): boolean;

begin

распознавание_адреса: = . . . {возвращает true для набора • физических, глобальных и груп­

повых адресов, соответствую­щих этой станции};

end; {распознавание-адреса}

function удаление-ЗАП (

var парам-длины: значение-длины;

иог парам—данных: значение-данных): значение-данных;

/begin

правильная_длина := {проверка на соответствие значения парам_длины принятой длине-дан- ных-УЛЗ};

if правнльная_длинаthen;

удаление-ЗАП := {усечение парам_данные (при его нали­чии) до значения парам-длины (в окте­тах) и возврат результата};

else

удаление-ЗАП := парам-данных;

end; {удаление-ЗАП}.

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

procedure упр-звеном-приема;

begin

repeat

начало-приема;

while принимается do холостое; {ожидает окончания поступ­ления битов кадра};

избыточные-биты := длина-кадра, мод. 8 длина_кадра := длина-кадра — избыточные-биты;

{усечение до границ октета};

продолжение-приема := (длина-кадра > мин-длина-кад- ра);

{аннулирование фрагментов кадра};

until продолжение приема;

end; {упр-звеном_приема};

procedure начало-приема;

begin

текущий-принимаемый-бит := 1;

принимается := true;

end; {начало-приема}.

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

process приемник-битов;

var б: бит;

begin

cycle {внешний цикл};

while принимается do;

begin {внутренний цикл};

if текущий-принимаемый-бит = 1 then;

раскомп-физ-сигналов; {удаление полей преамбулы и
НОК};

б прием_бита; {получение следующего бита из фи­зического уровня);

if опознавание несущей then.

begin {добавление бита к кадру)

входящий_кадр текущий_принимаемый_бит := б;

текущий-принимаемый_бит := текущий-принимаемый

-бит +1;

end; {добавление бита к кадру);

принимается := опознавание-несущей.

end {внутренний цикл)

длина_кадра := текущий_принимаемый_бит — 1;

end {внешний шлейф).

end; {приемник-бит}.

procedure раскомп-физ-сигналов;

begin

{принимать по одному биту из физической среды до обнару­жения правильного НОК, аннулировать и выдавать биты); end; {раскомп-физ-сигналов}.

4.2.10. Общие процедуры

Функция ЦИК-32 используется алгоритмами передачи и прие­ма для генерации 32-битового значения ЦИК.

function ЦИК-32 (к:кадр): значение-ЦИК;

begin ЦИК-32 := 32-битовое значение ЦИК;

end; ЦИК-32.

Исключительно в целях лучшего понимания вводится также- следующая процедура:

procedure пусто; begin end;

Холостое состояние процесса (т. е. когда он ожидает некоторо­го события) служит образцом повторяющихся вызовов этой проце­дуры.

  1. И н т е р ф е й с ы со смежными уровнями

    1. Краткое описание

Цель данного раздела — дать точное определение интерфейсов между архитектурными уровнями, определенными в разд. 1, в со­ответствии со спецификацией услуг доступа к среде, приведенной в пазл. 2. Кроме того, определены услуги, требуемые от Физиче­ской среды.

В качестве используемой здесь нотации служит язык Паскаль, соответствующий процедурным свойствам точной спецификации подуровня УДС (см. п. 4.2). Каждый интерфейс описывается в ви­де совокупности процедур или коллективно используемых пере­менных либо того и другого, которые совместно обеспечивают един­ственно правильные взаимодействия между уровнями. Сопроводи­тельный текст описывает смысл каждой процедуры или переменной и раскрывает все неявные взаимодействия между ними.

Заметим, что описание интерфейсов на языке Паскаль пред­ставляет собой метод нотаций и никоим образом не предполага­ет возможность или необходимость программной реализации этих интерфейсов. Этот вопрос более подробно обсуждается в п. 4.2, где приводится полный набор деклараций языка Паскаль для типов данных, используемых в остальной части данного раздела. Заметим также, что «синхронный» характер операций по переда­че и приему кадров (по одному кадру в каждый момент времени) является свойством архитектурного интерфейса между подуров­нями УЛЗ и УДС и оно не обязательно должно быть отражено в реальных интерфейсах между станцией и ее подуровнем.

  1. Услуги, обеспечиваемые подуровнем УДС

Услуги, предоставляемые подуровнем УДС для подуровня УЛЗ, состоят в передаче и приеме кадров УЛЗ. Следовательно, интер­фейс, через который подуровень УЛЗ использует услуги подуров­ня УДС, состоит из двух функций:

Functions:

передача-кадра; прием-кадра.

Каждая из этих функций имеет компоненты кадра УЛЗ в виде своих параметров (ввод и вывод) и выдает в качестве своего ре­зультата код состояния. Заметим, что клаос-обсл уживання, опреде­ленный в п. 2.3.1, игнорируется подуровнем УДС КДОН/ОК-

Подуровень УЛЗ передает кадр, привлекая функцию передача- кадра:

function передача-кадра (

парам-получателя: значение-адреса; парам-отправителя: значение-адреса; парам-длины: значение-длины;

парам-данных: значение-данных): состояние-передачи.

Операция передача_кадра синхронная. Ее длительность равна длительности всей попытки передачи кадра; если операция закон­чена, то передача произошла либо успешно, либо безуспешно, что указывается передаваемым в результате кодом состояния:

type состояние-передачи = (передача-ХОР, чрезмерные-ошиб- ки-конфликта).

Об успешной передаче указывается в коде состояния передача- ХОР; код чрезмерные-ошибки-конфликта указывает, что попыт­ка передачи была прервана вследствие чрезмерных конфликтов, возникших в результате сильной нагрузки или неисправности сети.

Подуровень УЛЗ принимает входящие кадры, правлекая функ­цию прием-кадра:

function прием-кадра (

varпарам-получателя: значение-адреса;

var парам-отправителя: значение-адреса;

var парам-длины: значение-длины

;


var парам-данных: значение-данных): состояние-приема.

Операция прием_кадра синхронная. Эта операция не заверша­ется до тех пор, пока не будет принят кадр. Поля кадра доставля­ются через параметры вывода с кодом состояния:

type состояние_приеіма = (прием-Хор, ошибка-длины, ошіиб- ка-КПК, ошибка-кратности_октс- ту).

Успешность приема указывается кодом состояния прием-ХОР. Код ошибка_КПК указывает, что полученный кадр был искажен ошибками передачи. Код ошибка-кратности-октету указывает, что полученный кадр был искажен и его длина не равна целому чис­лу октетов. Код ошибка_длины указывает, что значение парам- длины не согласуется с параметрами длина-кадра полученного кадра.

  1. Услуги, требуемые от физического уровня

Интерфейс, через который подуровень УДС КДОН/ОК исполь­зует услуги физического уровня, содержит одну функцию, две про­цедуры и три булевы переменные.

V

Function: прием-бита

Procedures: передача-бита ожидание

arieties:

обнаружение-конфликта опознавание-несущей передается

В процессе передачи содержимое исходящего кадра передается из подуровня УДС физическому уровню путем повторяющегося ис­пользования операции передача-бита:

procedure передача-бита (парам-бит: бит).

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