next up previous contents index
Next: Идентификация Up: Специфиация Previous: Пример процедуры фрагментации   Contents   Index

Пример процедуры сборки

Для каждой датаграммы идентификатор буфера определяется как объединение полей адреса отправителя, адреса получателя, протокола и идентификации. Если это целая датаграмма (поля fragment offset и more fragments нулевые), то все ресурсы, связанные с этим идентификатором буфера, освобождаются, а сама датаграмма направляется на следующие процедуры обработки.

Если следующий фрагмент не связан с этим идентификатором буфера, то выделяются ресурсы для сборки. Они включают буфер данных, буфер заголовка, битовую таблицу фрагментации, поле общей длины данных, а также таймер. Данные из фрагмента помещаются в буфер данных в соответствии со значением полей fragment offset и длины, а также устанавливаются биты в битовой таблице фрагментации согласно полученным блокам фрагментов.

Если это первый фрагмент (поле fragment offset нулевое), то его заголовок помещается в буфер заголовка. Если это последний фрагмент (поле more fragments нулевое), то вычисляется общая длина данных. Если этот фрагмент завершает датаграмму (проверяется по установке битов в таблице фрагментации), то датаграмма направляется на следующий этап обработки. В противном случае таймер устанавливается на максимальное из двух: текущее значение таймера и время жизни для данного фрагмента. Выполнение процедуры сборки приостанавливается.

Если таймер отсчитал положенное время, то все ресурсы сборки, связанные с данным идентификатором буфера, освобождаются. Первоначальная установка таймера является нижней границей для времени ожидания при сборке. Это происходит потому, что всемя ожидания будет увеличено, если время жизни приходящего фрагмента окажется больше, но не может быть уменьшено. Установка таймера может достигать максимального времени жизни (примерно 4.25 минуты). В настоящее время рекомендуется первоначально устанавливать таймер на 15 секунд. Это значение можно изменить при получении достаночного практического опыта. Заметим, что выбор значения для этого параметра связи связан с емкостью буфера и скоростью получения данных с коммуникационных сетей. Например, скорость получения данных следует умножать на размер буфера (т.е. 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.

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



Alex Otwagin 2002-12-16