IP-фрагментация и повторная сборка

20

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

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

Итак, первые два раздела показывают длину 1500, потому что это MSU, но разве это не значит, что последний должен иметь 1000 (всего 4000 байт), а не 1040? Откуда взялись эти дополнительные 40 байт? Я предполагаю, что из-за того, что предыдущие два фрагмента имели заголовок 20 байтов, эти дополнительные 40 байтов данных должны были куда-то идти, поэтому он поступит в последний фрагмент?

Fragflag по существу означает, что есть еще один фрагмент, поэтому все они будут иметь Fragflag из 1, за исключением последнего фрагмента, который будет равен нулю. Однако я не понимаю, что такое смещение или как оно рассчитывается. Почему первое смещение на ноль? Почему мы разделили байты в поле данных (1480) на 8, чтобы получить второе смещение? Откуда это произошло? Кроме того, я предполагаю, что смещение всех фрагментов будет только увеличиваться на это значение?

Например, первый фрагмент будет иметь смещение 0, второе 185, третье 370 и четвертое 555? (370 + 185)

Спасибо за любую помощь!

    
задан JimmyK 14.04.2013 в 15:43
источник

4 ответа

15

В каждом пакете есть 20-байтовый заголовок. Таким образом, исходный пакет содержит 3980 байт данных. Эти фрагменты содержат 1480, 1480 и 1020 байтов данных. 1480 + 1480 + 1020 = 3980

Каждый бит в заголовке драгоценный. Разделение смещения на 8 позволяет ему поместиться в 13 бит вместо 16. Это означает, что каждый пакет, кроме последнего, должен содержать несколько байтов данных, кратное 8, что не является проблемой.

    
ответ дан David Schwartz 14.04.2013 в 16:11
источник
  • Спасибо! Это четко ответило на первую часть моего вопроса, но что касается второй части, почему мы делим 1480 на 8, чтобы получить смещение? –  JimmyK 14.04.2013 в 16:33
  • Я обновлю ответ. –  David Schwartz 14.04.2013 в 16:36
  • Большое спасибо, что отвечает на все! Мне просто интересно, разве мы ВСЕГДА разделим на 8? Существуют ли какие-либо обстоятельства, которые могут повлечь за собой разделение на другой номер? –  JimmyK 14.04.2013 в 16:58
  • @JimmyK: Если мы пытались выполнить какой-то стандарт, отличный от IPv4. –  David Schwartz 15.04.2013 в 04:04
15

Фрагментация и сборка были объяснены исключительно в RFC 791. Пройдите через Спецификацию интернет-протокола RFC , RFC имеет различные разделы, объясняющие фрагментацию и повторную сборку. Все ваши сомнения и вопросы хорошо удовлетворяются в нем.

Ans 1: Что касается длин пакета: Исходный пакет содержит 4000 байт. Этот пакет является полностью IP-пакетом и, следовательно, также содержит заголовок IP. Таким образом, длина полезной нагрузки на самом деле равна 4000 - (длина заголовка IP i. E. 20).

Фактическая длина полезной нагрузки = 4000 - 20 = 3980

Теперь пакет фрагментирован из-за того, что длина больше MTU (1500 байтов).

Таким образом, первый пакет содержит 1500 байтов, который включает в себя заголовок IP + фракцию полезной нагрузки.

1500 = 20 (заголовок IP) + 1480 (полезная нагрузка данных)

Аналогично для другого пакета.

Третий пакет должен содержать оставшиеся оставшиеся данные (3980 - 1480 -1480) = 1020

Таким образом, длина пакета равна 20 (заголовок IP) + 1020 (полезная нагрузка) = 1040

Ans 2: смещение - это адрес или локатор, откуда данные начинаются со ссылкой на исходную полезную нагрузку данных. Для IP полезная нагрузка данных включает в себя все данные, которые после заголовка IP и заголовок Options. Таким образом, система / маршрутизатор принимает полезную нагрузку и делит ее на более мелкие части и сохраняет следы смещения со ссылкой на исходный пакет, чтобы можно было выполнить сборку.

Как указано в RFC Страница 12.

" Поле смещения фрагмента сообщает получателю положение фрагмента в исходной дейтаграмме. Смещение и длина фрагмента определяют часть исходной дейтаграммы покрытый этим фрагментом. Флаг более-фрагментов указывает (путем сброса) последний фрагмент. Эти поля предоставляют достаточную информацию для повторной сборки дейтаграмм. "

Смещение фрагмента измеряется в единицах по 8 байт каждый. Он имеет 13-битное поле в заголовке IP. Как сказано в RFC-странице 17

" В этом поле указывается, где в дейтаграмме находится этот фрагмент. Смещение фрагмента измеряется в единицах 8 октетов (64 бит). Первый фрагмент имеет смещение нуля. "

Таким образом, как вы спросили в вопросе, откуда это произошло, его стандарт был определен для спецификации протокола IP, где 8 октетов взяты за одно значение. Это также помогает нам передавать большие пакеты через это.

Страница 28 RFC пишет: * Фрагменты подсчитываются в единицах 8 октетов. Стратегия фрагментации сконструирована так, что нефрагментированная дейтаграмма имеет всю нулевую информацию о фрагментации (MF = 0, смещение фрагмента = 0). Если интернет-датаграмма фрагментирована, ее часть данных должна быть сломанной на 8 октетных границах. Этот формат позволяет использовать 2 ** 13 = 8192 фрагмента по 8 октетов для всего 65 536 октетов. Обратите внимание, что это согласуется с поле полной длины датаграммы (конечно, заголовок подсчитывается в общая длина, а не фрагменты). *

    
ответ дан Ankan Seth 22.07.2014 в 08:32
источник
1

размер смещения составляет 13 бит в заголовке IP, но нам нужно 16 бит, как в худшем случае. Поэтому мы используем коэффициент масштабирования 8, т. Е. (2 ^ 16/2 ^ 13).

    
ответ дан pallavi 23.04.2013 в 17:42
источник
0

это не дополнительные биты, а общая длина последнего фрагмента. поскольку 1500 - это MTU, это означает, что может быть 1500 байт данных в одном фрагменте, включая заголовок. Заголовок добавляется с каждым фрагментом. это означает, что в фрагменте мы можем отправить 1500-20 = 1480 байт данных. ему дана датаграмма. Датаграмма - это не что иное, как инкапсуляция данных на сетевом уровне. Так что все данные, которые мы должны отправить, составляют 4000-20 = 3980. затем он фрагментируется на 3 части (ceil (3980/1480)), каждый из которых имеет длину 1480, 1480, 1020 соответственно. поэтому, когда заголовок 20B добавляется к последнему фрагменту, его длина становится равной 1020 + 20 = 1040.     

ответ дан codie 27.04.2017 в 10:41
источник