Каждый
IRC-IoT
робот или
IRC сервис поддерживающий
протокол IRC-IoT должен иметь возможность воссоздать из серии
"фрагментированных сообщений"
IRC-IoT
(содержащих «multipart Datum»)
исходное сообщение. Для этого принятое "фрагментированное сообщение" должно
быть временно запомнено принимающей стороной, и храниться до тех пор, пока не
будут приняты все фрагменты такого
IRC-IoT
сообщения, и по ним не сможет быть
воссоздано исходное содержимое объекта – «Datum».
Хранимое "фрагментированное сообщение" может быть удалено в случае, если:
у принимающей стороны недостаточно памяти для приёма новых сообщений,
превышено время хранения "фрагментированного сообщения"
(
FMDT – Fragmented Message Delete Timeout).
Воссоздание исходного объекта – «Datum», не является поводом для удаления
сообщения из памяти. Оно ещё может понадобиться другим участникам
IRC-IoT
сети. В случае, если после приёма последнего из переданных фрагментов
"фрагментированного сообщения" проходит значительное время, определяемое
константой (
MFRT – Message Fragment Request Time), но при этом
отсутствуют какие-то "фрагментированные сообщения" необходимые для
процесса дефрагментации, принимающая сторона может запросить повторную передачу
отсутствующего "фрагментированного сообщения". В случае невозможности получить
такое сообщение от источника, ответ могут предоставить другие
IRC-IoT
роботы или сервисы, которые имели
возможность записывать обмен между передающей и принимающей стороной.
Существует два механизма фрагментации и дефрагментации больших
IRC-IoT
сообщений. Первый, с использованием полей на логическом уровне «Object»:
«
dc» (Datums count),
«
dp» (Datums passed);
и второй, с использованием пары полей
«
bc» (bytes count),
«
bp» (bytes passed),
на уровне «Datum».
В обоих случаях во всех фрагментированных сообщениях цепочки,
значение поля «
did» (Datum ID)
должно совпадать. Содержимое фрагментируемого «Datum» при
необходимости зашифровывается и кодируется в цепочку байт при помощи
алгоритма
BASE64 или аналогичного, а затем, разбивается на фрагменты,
а каждый фрагмент помещается в текстовое поле
«
ed» (Encrypted Data),
своего фрагментированного
IRC-IoT
сообщения. Если содержимое фрагментированных сообщений не пересекается, а
цепочку можно выстроить в последовательность не пересекающихся сообщений,
то могут быть использованы только поля «dc» и «dp»,
если же предполагается, что фрагменты могут пересекаться, то
должен использоваться механизм с полями «bc» и «bp»
на логическом уровне «Datum».
Цикл проверки и дефрагментации
IRC-IoT сообщений:
1. Система должна сортировать (выстраивать) фрагментированные сообщения в
соответствии с значением поля «dp» или «bp»
в зависимости от применяемого механизма фрагментации. Все части
фрагментированного сообщения должны иметь идентичные значения поля
«did», и полей «dc», «bc».
Если обнаружится, что существуют фрагментированные сообщения с
одинаковым значением поля «did», но при этом разным
значением поля «bc», должна возникнуть ошибка, и все
фрагментированные сообщения данной цепочки должны быть удалены из буфера.
То же самое относится и к значениям поля «dc» на
уровне «Object».
2. Если при разборе текущего фрагментированного сообщения
имеется последующее сообщение с значением поля «bp»,
большим, чем сумма поля «bp» и длинны переданного
в поле «ed» фрагмента (зашифрованного) «Datum»
текущего сообщения, то цепочка сообщений признается не полной, и
цикл дефрагментации для данной цепочки приостанавливаться.
2.1. В механизме с использованием полей «dc» и «dp»
всё проще. Для каждого фрагметрированного сообщения, кроме последнего,
в буфере должно иметься следующее фрагментированное сообщение с большим
на единицу значением поля «dp».
3. Если при разборе текущего фрагментированного сообщения в буфере
имеется следующее фрагментированное сообщение со значением поля
«bp» меньшим, чем у суммы «bp» текущего
сообщения и длинны переданного в поле «ed»
фрагмента (зашифрованного) «Datum», то имеется пересечение
фрагментов (
overlapping), и необходимо произвести
сравнение пересекающихся частей фрагментов. Если пересекающиеся части не
идентичны, то должна возникнуть ошибка, и все фрагментированные сообщения
данной цепочки должны быть удалены из буфера. К механизму с использованием
полей «dc», «dp» это не относится.
4. Если длинна переданного в поле «ed» фрагмента «Datum» в
сумме со значением поля «bp» равна значению поля
«bc», то цепочка фрагментов считается полной, и запускается
механизм «пересборки», восстановления исходного
(зашифрованного) «Datum».
5. Если за период выполнения цикла дефрагментации, либо ожидания новых
сообщений из
IRC-IoT
сети, время получения каждого из имеющихся фрагментированных сообщения
цепочки истекла (превысило значение
FMDT),
то цепочка считается устаревшей, и может быть удалена из буфера.
Если же хотя бы одно фрагментированное сообщение удалено по
причине нехватки памяти, вся цепочка должна быть удалена из буфера.
Пример фрагментированного сообщения:
{"mid":"53663", "o":{"oid":"2334", "ot":"maireq", "d":{"bp":360, "bc":451,
"did":"157", "ed":"dnZ2dn ... yJ9fQ"}}}