
завершена – пакет не был фрагментирован. Если же MF=1 фрагмента с
Offset=0, то далее из поля Total Length первого фрагмента можно узнать
сколько байт данных принес получателю первый фрагмент. Следовательно,
далее необходимо найти пакет с таким значением поля Offset, которое как раз
и будет соответствовать количеству байт первого фрагмента, например, если
первый фрагмент принес 1000 байт (с номерами от 0 до 999), то фрагмент,
который должен идти вслед за этим фрагментов должен иметь Offset=1000.
Если такого фрагмента нет (или фрагмента с меньшим Offset), то сборка не
возможна, если такой фрагмент есть, то его поле данных дописывается к полю
данных первого фрагмента и проводиться проверка флага MF второго
фрагмента. Если он равен 0, то сборка завершена, так как второй фрагмент
был последним, если же MF второго фрагмента равен 1, то значит нужно найти
такой фрагмент, у которого Offset будет равен (или менее) суммарной длине
первых двух фрагментов. Далее этот алгоритм повторяется, пока не будет
достигнут конец пакета или сборка окажется невозможной.
Рассмотрим простой пример: какими будут комбинации полей MF и
Fragment Offset у различных пакетов и фрагментов.
Не фрагментированный пакет: MF=0, Offset=0
Первый фрагмент: MF=1, Offset=0
Промежуточный фрагмент: MF=1, Offset=ХХХ
Последний фрагмент: MF=0, Offset=YYY
Рассмотрим четыре примера:
1. Запишем несколько «фрагментов» одного пакета (т.е. поля ID, MF, Offset)
таким образом, чтобы пакет «собрался»:
Длина исходного пакета 4440, т.е. 1480+1480+1480
1
2
3
ID
= A0 B1
MF = 1
Offset= 0
ID
= A0 B1
MF = 1
Offset= 1480
ID
= A0 B1
MF = 0
Offset= 2960
2. Запишем несколько «фрагментов» одного пакета (т.е. поля ID, MF, Offset)
таким образом, чтобы пакет не мог быть «собран» из-за отсутствия
первого фрагмента:
Длина исходного пакета 4440, т.е. 1480+1480+1480
1
2
3
ID
= A0 B1
MF = 1
Offset= 100
ID
= A0 B1
MF = 1
Offset= 1480
ID
= A0 B1
MF = 0
Offset= 2960
3. Запишем несколько «фрагментов» одного пакета (т.е. поля ID, MF, Offset)
таким образом, чтобы пакет не мог быть «собран» из-за отсутствия
последнего фрагмента:
Длина исходного пакета 4440, т.е. 1480+1480+1480
1
2
3
ID
= A0 B1
ID
= A0 B1
ID
= A0 B1