Я не понимаю, как фрагментировать IP датаграммы.

Допустим, исходная датаграмма имеет общий размер 302 (заголовок 20 байтов и полезная нагрузка 282 байта). Моя датаграмма должна быть фрагментирована, поскольку она проходит через сеть 128MTU. Я должен фрагментировать его и добавить 20 заголовков для каждого нового фрагмента.

Это упражнение, и ответ

  • Фрагмент 1 Общая длина 124 (полезная нагрузка 104 байта)

  • Фрагмент 2 Общая длина 124 (полезная нагрузка 104 байта)

  • Фрагмент 3 Общая длина 94 (полезная нагрузка 74 байта)

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

Почему это не может быть

  • Фрагмент 1 Общая длина 114 (полезная нагрузка 94 байта)
  • Фрагмент 2 Общая длина 114 (полезная нагрузка 94 байта)
  • Фрагмент 3 Общая длина 114 (полезная нагрузка 94 байта)

(282/3)> 2, поэтому мне нужно 3 фрагмента. 3Fragments = 60 байтов заголовка добавлено 60 +282 = 342 342/3 = 114 общей длины для каждого фрагмента.

Мой вопрос ...

Как и почему я должен получить 124 124 и 94?

1 ответ1

3

Предполагается, что все фрагменты, кроме последнего, будут настолько большими, насколько позволяет сеть.

Вы можете получить максимальный размер полезной нагрузки фрагмента, взяв MTU, вычтя 20, разделив на 8, отбросив дробь, а затем умножив на 8. Это работает, потому что каждому пакету нужен 20-байтовый заголовок и каждый пакет, но последний должен содержать длину полезной нагрузки, кратную 8.

128 - 20 = 108
108/8 = 13,5
13 * 8 = 104

Таким образом, для MTU 128 максимальный размер полезной нагрузки составляет 104. Давайте посмотрим, сколько пакетов нам нужно, чтобы отправить 302 байта полезной нагрузки:

302/104 = 2,903

Таким образом, нам понадобятся два пакета максимального размера и один остаток. Сколько у нас останется?

302 - (2 * 104) = 94

Итак, 94 байта данных в последнем пакете.

Вы можете получить общую длину из размеров полезной нагрузки, добавив 20.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .