ждать (>интервал-усечения-ікадра*случайнос-число (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, в соответствии со спецификацией услуг доступа к среде, приведенной в пазл. 2. Кроме того, определены услуги, требуемые от Физической среды.
В качестве используемой здесь нотации служит язык Паскаль, соответствующий процедурным свойствам точной спецификации подуровня УДС (см. п. 4.2). Каждый интерфейс описывается в виде совокупности процедур или коллективно используемых переменных либо того и другого, которые совместно обеспечивают единственно правильные взаимодействия между уровнями. Сопроводительный текст описывает смысл каждой процедуры или переменной и раскрывает все неявные взаимодействия между ними.
Заметим, что описание интерфейсов на языке Паскаль представляет собой метод нотаций и никоим образом не предполагает возможность или необходимость программной реализации этих интерфейсов. Этот вопрос более подробно обсуждается в п. 4.2, где приводится полный набор деклараций языка Паскаль для типов данных, используемых в остальной части данного раздела. Заметим также, что «синхронный» характер операций по передаче и приему кадров (по одному кадру в каждый момент времени) является свойством архитектурного интерфейса между подуровнями УЛЗ и УДС и оно не обязательно должно быть отражено в реальных интерфейсах между станцией и ее подуровнем.
Услуги, обеспечиваемые подуровнем УДС
Услуги, предоставляемые подуровнем УДС для подуровня УЛЗ, состоят в передаче и приеме кадров УЛЗ. Следовательно, интерфейс, через который подуровень УЛЗ использует услуги подуровня УДС, состоит из двух функций:
Functions:
передача-кадра; прием-кадра.
Каждая из этих функций имеет компоненты кадра УЛЗ в виде своих параметров (ввод и вывод) и выдает в качестве своего результата код состояния. Заметим, что клаос-обсл уживання, определенный в п. 2.3.1, игнорируется подуровнем УДС КДОН/ОК-
Подуровень УЛЗ передает кадр, привлекая функцию передача- кадра:
function передача-кадра (
парам-получателя: значение-адреса; парам-отправителя: значение-адреса; парам-длины: значение-длины;
парам-данных: значение-данных): состояние-передачи.
Операция передача_кадра синхронная. Ее длительность равна длительности всей попытки передачи кадра; если операция закончена, то передача произошла либо успешно, либо безуспешно, что указывается передаваемым в результате кодом состояния:
type состояние-передачи = (передача-ХОР, чрезмерные-ошиб- ки-конфликта).
Об успешной передаче указывается в коде состояния передача- ХОР; код чрезмерные-ошибки-конфликта указывает, что попытка передачи была прервана вследствие чрезмерных конфликтов, возникших в результате сильной нагрузки или неисправности сети.
Подуровень УЛЗ принимает входящие кадры, правлекая функцию прием-кадра:
function прием-кадра (
varпарам-получателя: значение-адреса;
var парам-отправителя: значение-адреса;
var парам-длины: значение-длины
;
var парам-данных: значение-данных): состояние-приема.
Операция прием_кадра синхронная. Эта операция не завершается до тех пор, пока не будет принят кадр. Поля кадра доставляются через параметры вывода с кодом состояния:
type состояние_приеіма = (прием-Хор, ошибка-длины, ошіиб- ка-КПК, ошибка-кратности_октс- ту).
Успешность приема указывается кодом состояния прием-ХОР. Код ошибка_КПК указывает, что полученный кадр был искажен ошибками передачи. Код ошибка-кратности-октету указывает, что полученный кадр был искажен и его длина не равна целому числу октетов. Код ошибка_длины указывает, что значение парам- длины не согласуется с параметрами длина-кадра полученного кадра.
Услуги, требуемые от физического уровня
Интерфейс, через который подуровень УДС КДОН/ОК использует услуги физического уровня, содержит одну функцию, две процедуры и три булевы переменные.
V
Function: прием-бита
Procedures: передача-бита ожидание
arieties:обнаружение-конфликта опознавание-несущей передается
В процессе передачи содержимое исходящего кадра передается из подуровня УДС физическому уровню путем повторяющегося использования операции передача-бита:
procedure передача-бита (парам-бит: бит).
При каждом привлечении этой операции передается один новый бит исходящего кадра физическому уровню. Операция передача-бита синхронная. Длительность этой операции определяется полной передачей одного бита. Операция завершается, когда физический уровень готов принять следующий бит и передает управление подуровню УДС.