Справочник по сетевым протоколам



Пример процедуры сборки - часть 2


Например, скорость получения данных следует умножать на размер буфера (т.е. 10 КБайт/сек * 15 сек = 150 КБайт).

Обозначения

FO - смещение фрагмента
IHL - длина Internet заголовка
MF - флаг More Fragments
TTL - время жизни
NFB - количество фрагментов
TL - общая длина
TDL - общая длина данных
BUFID - идентификатор буфера
RCVBT - битовая таблица фрагментации
TLB - нижняя граница для значения таймера

Процедура

(1) BUFID <- отправитель|получатель|протокол|идентификация;

(2) IF FO = 0 AND MF = 0 THEN

(3) IF буфер с идентификатором BUFID выделены THEN

(4) завершить сборку для этого идентификатора BUFID;

(5) Приготовить датаграмму для дальнейшей обработки.

Запустить обработку

(6) ELSE

IF буфер для идентификатора BUFID не выделен THEN

(7) выделить ресурсы для сборки с идентификатором BUFID

TIMER <- TLB; TDL <- 0;

(8) перенести данные из фрагмента в буфер данных с идентификатором

BUFID, данные с октета FO*8 по октет (TL-(IHL*4))+FO*8;

(9) установить биты RCVBT с FO по FO+((TL-(IHL*4)+7)/8);

(10) IF MF = 0 THEN TDL <- TL-(IHL*4)+(FO*8)

(11) IF FO = 0 THEN поместить заголовок в буфер заголовка

(12) IF TDL # 0 AND все биты RCVBT с 0 по (TDL+7)/8 выставлены THEN

(14) TL <- TDL+(IHL*4)

(15) Приготовить датаграмму к дальнейшей обработке

(16) Освободить все ресурсы сборки для этого идентификатора

BUFID. Запустить обработку.

(17) TIMER <- MAX(TIMER,TTL);

(18) приостановить работу до получения следующего фрагмента или

сигнала от таймера

(19) Сигнал от таймера:

Освободить все ресурсы, связанные с этим идентификатором BUFID.

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




Содержание  Назад  Вперед