| |
Для каждой датаграммы идентификатор буфера определяется как объединение полей адреса отправителя, адреса получателя, протокола и идентификации. Если это целая датаграмма (поля 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.
В случае, если два или более фрагмента содержат одни и те же данные, либо идентичны или частично перекрываются, то эта процедура будет использовать последнюю полученную копию при создании буфера данных и воссоздании датаграммы.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |