Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
22
Добавлен:
23.05.2015
Размер:
1.7 Mб
Скачать

(если аномальные эффекты присутствуют, то модифицировать этот протокол так, чтобы таких эффектов не было, и доказать корректность модифицированного протокола)

В заключение отметим, что данный ПСО неэффективен при большом количестве ошибок при передаче кадров.

8.4.10Протокол скользящего окна с выборочным повтором

Второй ПСО отличается от предыдущего тем, что у агента этого ПСО имеется не одно, а два окна.

1.Первое окно имеет те же функции, которые имеет окно первого ПСО (данное окно называется посылающим окном).

def

Максимальный размер посылающего окна равен m = n/2, где число n имеет тот же статус, который описан в параграфе 8.4.8 (в частности, номера кадров являются элементами Zn).

2.Второе окно (называемое принимающим окном) предназначено для размещения пакетов, поступивших от другого агента, которые пока не могут быть переданы СУ, потому что ещё не пришли некоторые пакеты с меньшими номерами.

(агент-получатель должен передавать принятые пакеты своему СУ в том же самом порядке, в котором они поступили к агенту-отправителю от его СУ)

Принимающее окно имеет фиксированный размер m = n/2.

Каждый кадр f, пересылаемый каким-либо из агентов этого протокола, содержит 4 компоненты:

1.k – вид кадра,

данная компонента может принимать одно из трёх значений:

data (информационный кадр)

283

ack (кадр, содержащий лишь подтверждение)

nak (кадр, содержащий запрос на повторную передачу)

2.x – пакет

3.s – номер этого кадра

4.r – номер последнего полученного неискажённого кадра.

Если значение первой компоненты кадра равно ack или nak, то вторая и третья компоненты этого кадра имеют фиктивный характер.

Для формирования кадров используется функция ϕ.

Для извлечения компонентов из кадров используются функции kind, info, seq и ack, обладающие следующими свойствами:

kind (ϕ(k, x, s, r))

=

k

info(ϕ(k, x, s, r))

=

x

seq(ϕ(k, x, s, r))

=

s

ack (ϕ(k, x, s, r))

=

r

Процесс, описывающий поведение агента данного ПСО, имеет следующие переменные.

1.Массивы x[m] и y[m], предназначенные для размещения посылающего окна и принимающего окна соответственно.

2.Переменные enable, b, s, w, имеющие

те же множества значений, и

тот же смысл

которые они имеют в предыдущем протоколе.

3.Переменные, связанные с принимающим окном:

r – нижняя граница принимающего окна

u – верхняя граница принимающего окна

284

значения переменных r и u принадлежат множеству Zn.

Если в принимающем окне присутствует пакет, номер которого равным нижней границе принимающего окна (r), то агент

передаёт этот пакет своему СУ, и

увеличивает на 1 (по модулю n) значения r и u.

4.Булевский массив arrived[m], компоненты которого имеют следующий смысл: arrived[i] = 1 тогда и только тогда, когда в i–й компоненте принимающего окна содержится пакет, пока ещё не переданный СУ.

5.Булева переменная no_nak, используемая в следующих целях.

Если агент получает

искажённый кадр, или

кадр, номер которого отличен от нижней границы принимающего окна (r)

то он посылает своему коллеге запрос на повторную передачу кадра, номер которого равен r.

Данный запрос называется NAK (Negative Acknowledgement).

Булева переменная no_nak используется для того, чтобы избежать нескольких запросов на повторную передачу одного и того же кадра: эта переменная имеет значение 1, если NAK для кадра с номером r еще не был послан.

Когда агент получает неискажённый кадр f вида data, он выполняет следующие действия.

• Если номер seq(f) попадает в прнинимающее окно, т.е. истинна формула

between(r, seq(f), u)

где предикатный символ between имеет тот же смысл, что и в предыдущем протоколе (см. (8.34)), то агент

285

извлекает из этого кадра пакет, и

помещает этот пакет в своё принимающее окно.

Если условие из предыдущего пункта не выполнено (т.е. номер seq(f) кадра f не попал в принимающее окно), то

пакет в таком кадре игнорируется, и

у такого кадра учитывается лишь компонента ack(f).

Вданном протоколе участвуют следующие таймеры.

1.Массив из m таймеров, поведение которых представляется процессом T imers (см. (8.33), с заменой n на m), каждый таймер из этого массива предназначен для оповещения агента о том, что

время ожидания подтверждения пакета с соответствующим номером из посылающего окна закончилось, и

необходимо послать кадр с этим пакетом ещё раз

2.Дополнительный таймер, поведение которого представляется следующим процессом:

Init = (t = 0)

 

 

 

 

 

(t = 1) ?

 

start_ack_timer ?

 

 

 

ack_timeout !

 

 

 

 

 

 

t := 1

-

 

t := 0

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

stop_ack_timer ?

 

 

 

 

t := 0

 

Этот таймер используется со следующей целью.

Посылка агентом подтверждений кадров, поступивших от другого агента, может производиться двумя способами:

(a)подтверждение посылается в составе информационного кадра (т.е. кадра вида data), или

(b)подтверждение посылается отдельным кадром вида ack.

286

Когда агенту необходимо послать такое подтверждение a, он

включает вспомогательный таймер (т.е. выполняет действие start_ack_timer !),

если до сигнала тайм-аута от вспомогательного таймера агент получил новый пакет от своего СУ, он

формирует кадр вида data с этим пакетом,

включает в этот кадр подтверждение a как компоненту ack этого кадра, и

посылает этот кадр своему коллеге

если после истечения работы вспомогательного таймера (т.е. после получения от него сигнала ack_timeout) агент так и не получил новый пакет от своего СУ, он посылает подтверждение a отдельным кадром вида ack.

Описание процесса, представляющего поведение агента данного ПСО, мы даём в блок-схемном виде, по которому несложно построить блок–схему этого процесса.

В данном описании мы используем следующие обозначения и соглашения.

1.Если i – целое число, то знакосочетание i%m обозначает остаток от деления i на m.

2.Если

mass – имя массива из m компонентов (т.е. x, y, arrived, и т.д.), и

i – целое число,

то знакосочетание mass[i] следует понимать как mass[i%m].

3. Знакосочетание вида send(kind, i) является сокращённым обозначением следующей группы операторов:

 

 

 

1)

 

 

C ! ϕ(kind, x[i], i, r

n

 

 

 

 

 

 

 

send(kind, i) =

 

(kind = nak) then no_nak := 0

 

if

 

 

 

 

 

 

 

 

if

(kind = data) then start ! (i%m)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

stop_ack_timer !

 

 

 

 

 

 

 

 

 

287

4. Знакосочетания

between(a, b, c) и enable := (w < m)

имеют тот же смысл, что и в описании предыдущего протокола.

5.Если в каком-либо овале присутствуют не одна, а несколько формул, то мы предполагаем, что эти формулы связаны символом конъюнкции.

6.В целях экономии места некоторые выражения вида

f(e1, . . . , en)

написаны в две строки (в первой строке – f, а во второй – список (e1, . . . , en)).

Процесс, представляющий поведение агента данного ПСО,

имеет следующий вид:

' $

 

 

start

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

enable = 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w, b, s, r = 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

u = m = n/2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

no_nak = 1

 

-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

enable := (w < m)

 

 

 

 

 

 

 

 

arrived = (0 . . . 0)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

&

 

 

 

 

 

%?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

?

 

 

+

 

 

@

 

-

C ? f

 

 

 

 

 

 

 

enable = 1

 

 

 

 

 

@

 

 

 

- f =

-no_nak = 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+

 

 

 

 

 

?

 

 

 

 

 

 

?

 

 

@

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

send(nak, 0)

 

 

 

In ? x [s]

 

 

timeout ? i

 

R@

 

 

 

 

?

 

 

 

 

 

 

 

 

 

 

 

 

ack_timeout ?

 

 

 

 

 

 

 

 

 

 

 

 

send(data, s)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

send(data, i)

 

 

 

frame

 

 

 

 

 

 

s := s + 1

 

 

 

send(ack, 0)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

processing

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w := w + 1

 

 

 

 

 

?

 

 

 

 

 

?

 

 

 

 

 

?

 

 

 

 

?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Фрагмент frame processing в этой диаграмме выглядит следующим образом.

288