Опубликован: 11.08.2008 | Уровень: специалист | Доступ: платный
Лекция 4:

Протокол Интернет версии 4

Фрагментация

Дейтаграмма может проходить через различные сети. Каждый маршрутизатор извлекает дейтаграмму IP из кадра, получает его, обрабатывает и затем инкапсулирует в другом кадре. Формат и размер полученного кадра зависят от протокола, используемого физической сетью, через которую кадр только что проходил. Формат и размер посланного кадра зависят от протокола, применяемого физической сетью, через которую кадр собирается проходить. Например, если маршрутизатор подключает сеть Ethernet к сети Token Ring ("Кольцевая сеть с маркерным доступом"), он получает кадр в формате Ethernet и посылает кадр в формате Token Ring (см. "SDH" и "Абонентский доступ").

Максимальный модуль передачи (MTU — Maximum Transfer Unit)

Каждый протокол уровня звена передачи данных имеет свой собственный формат кадра. Одно из полей, определенных в формате – это максимальный размер поля данных. Другими словами, когда дейтаграмма инкапсулируется в кадр, полный размер дейтаграммы должен быть меньше, чем максимальный размер кадра, который определен ограничениями аппаратных и программных средств, используемых в сети (рис. 4.5).

Максимальный модуль передачи

Рис. 4.5. Максимальный модуль передачи

Значение MTU отличается от одного протокола физической сети к другому. Таблица 4.5. показывает значения максимального модуля передачи для различных протоколов.

В части функционирования IP-поток не зависит от физической сети. При создании пакетов стараются сделать так, чтобы добиться максимальной длины IP-дейтаграммы, равной максимальной длине блока передачи (MTU), например, 65 535 байт.

Таблица 4.5. Значение точек кода
Протокол MTU
Hyperchannel 65 535
Token Ring (16 Мбит/с) 17 914
Token Ring (4 Мбит/с) 4 484
FDDI 4 352
Ethernet 1500
X.25 576
PPP 296

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

Когда дейтаграмма фрагментируется, каждый фрагмент имеет собственный заголовок с большинством повторяющихся полей, но некоторые из них изменяются. Фрагментированная дейтаграмма может быть фрагментирована, если она сталкивается с сетью, которая имеет еще более мелкие MTU. Другими словами, дейтаграмма может быть фрагментирована несколько раз, перед тем как она в конечном счете достигнет пункта назначения.

Дейтаграмма может быть фрагментирована хостом источника или любым маршрутизатором на пути следования. Однако собирается (реассемблируется) дейтаграмма только пунктом конечного назначения, потому что каждый фрагмент поступает в независимой дейтаграмме. Фрагментированная дейтаграмма может проходить через различные маршрутизаторы, и невозможно ни управлять ей, ни гарантировать, какой маршрут она может выбрать. Все фрагменты, принадлежащие одной и той же дейтаграмме, должны в конечном итоге прибывать в хост пункта назначения. Такова логика реассемблирования в конечном пункте назначения.

Когда дейтаграмма фрагментирована, требуемые части заголовка должны быть скопированы всеми фрагментами. Поле опции может или не может быть скопировано, как увидим в следующем разделе. Хост или маршрутизатор, который фрагментирует дейтаграмму, должны изменить значения трех полей: флажки, смещение фрагментации и полная длина. Остальная часть полей должна быть скопирована. Конечно, значение контрольной суммы должно быть повторно вычислено независимо от фрагментации.

Поля, связанные с фрагментацией

Поля, которые связаны с фрагментацией и повторной сборкой IP-дейтаграммы — это (см. рис. 4.1):

  • Идентификатор. Это поле на 16 бит идентифицирует дейтаграмму, исходящую от хоста источника. Комбинация идентификации и исходного IP-адреса должна уникально определить дейтаграмму в тот момент, когда она уходит от хоста. Чтобы гарантировать уникальность, IP-протокол использует счетчик метки дейтаграммы. Счетчик инициализируется положительным числом. Когда IP-протокол посылает дейтаграмму, он копирует текущее значение счетчика в поле идентификации и увеличивает счетчик на единицу. Пока счетчик сохраняется в главной памяти, уникальность гарантируется. Когда дейтаграмма фрагментирована, значение поля идентификации копируется во все фрагменты. Другими словами, все фрагменты имеют тот же самый номер идентификации, как и в первоначальной дейтаграмме. Номер идентификации помогает пункту назначения при реассемблировании дейтаграммы. Он дает признак, по которому все фрагменты, имеющие то же самое значение идентификации, должны быть собраны в одну дейтаграмму.
  • Флаги. Это поле на 3 бита. Первый бит зарезервирован. Второй бит (бит D) называют "не делать фрагментацию" (do not fragment). Если его значение — 1, устройство не должно фрагментировать дейтаграмму. Если оно не может передать дейтаграмму ни через одну доступную ему физическую сеть, оно удаляет дейтаграммы и посылает ICMP-сообщение ошибки хосту источника (см. ICMP). Когда его значение — 0, дейтаграмма может быть фрагментирована, если это необходимо. Третий бит (бит М) называют "фрагментировать дальше" (more fragment). Если его значение — 1, это означает, что дейтаграмма — не последний фрагмент; есть дальнейшие фрагменты после этого. Если его значение — 0, это означает, что это последний или единственный фрагмент.
  • Смещение фрагментации. Это поле на 13 бит показывает относительное положение этого фрагмента относительно целой дейтаграммы. Это смещение данных в первоначальной дейтаграмме, измеряемое в единицах по 8 байтов. Рис. 4.6 показывает дейтаграмму с размером данных 4000 байтов, фрагментированную в три фрагмента. Байты в первоначальной дейтаграмме пронумерованы от 0 до 3999. Первый фрагмент переносит байты от 0 до 1399, смещение для этой дейтаграммы — 0/8 = 0. Второй фрагмент несет байты 1400 — 2799; значение смещения для этого фрагмента — 1400/8 = 175. Наконец, третий фрагмент несет байты 2800 — 3999. Значение смещения для этого фрагмента — 2800/8 = 350.
Пример фрагментации

Рис. 4.6. Пример фрагментации

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

Рис. 4.7. показывает расширенный вид фрагментов предыдущего рисунка. Заметим, что значение поля идентификации — одно и то же во всех фрагментах. Также заметим, что значение поля флажков установлено с третьим битом флага, равным 1 для всех фрагментов, кроме последнего. Также показано значение поля смещения для каждого фрагмента.

Детальный пример фрагментации

Рис. 4.7. Детальный пример фрагментации

Рисунок показывает, что получается, если фрагментирован сам фрагмент. В таком случае значение поля смещения всегда дается относительно первоначальной дейтаграммы. Например, на рисунке второй фрагмент сам фрагментирован на два фрагмента — 800 байтов и 600 байтов, но смещение показано относительно позиции фрагментов первоначальных данных.

Очевидно, что, даже если каждый фрагмент следует различным путем и прибывает в неисправном состоянии, заключительный хост пункта назначения может повторно собрать первоначальную дейтаграмму из полученных фрагментов (если ни один из них не потерян), используя следующую стратегию:

  1. первый фрагмент имеет значение поля смещения — ноль;
  2. разделить длину первого фрагмента 8. Второй фрагмент имеет значение смещения, равное этому результату;
  3. разделить полную длину первого и второго фрагмента 8. Третий фрагмент имеет значение смещения, равное этому результату;
  4. продолжить процесс. Последний фрагмент не нужно фрагментировать — 0.

Пример 5

Пакет прибывает со значением бита M = 0. Это первый фрагмент, последний фрагмент или средний фрагмент? Можно ли узнать, был ли пакет фрагментирован?

Решение

Если бит M = 0, это означает, что далее нет фрагментов; этот фрагмент — последняя единица. Однако мы не можем сказать, был ли пакет фрагментирован или нет. Не фрагментированный пакет считается последним фрагментом.

Пример 6

Пакет прибывает со значением бита M = 1. Является ли этот пакет первым фрагментом, последним фрагментом или средним фрагментом? Можно ли узнать, был ли пакет фрагментирован?

Решение

Если бит M = 1, это означает, что имеется, по крайней мере, дальнейший фрагмент. Фрагмент может быть первой и средней единицей, но не последней. Мы не знаем, первая это единица или средняя; нам нужна дальнейшая информациязначение смещения фрагмента. Однако мы можем определенно сказать, что исходный пакет фрагментирован, потому что M = 1.

Пример 7

Пакет прибывает со значением бита M = 1, смещение фрагментации имеет значение 0. Является ли этот пакет первым фрагментом, последним фрагментом или средним фрагментом?

Решение

Поскольку M = 1, это или первый, или средний фрагмент. Поскольку смещение фрагмента равно 0 – это первый фрагмент.

Пример 8

Прибывает пакет, в котором значение смещения – 100. Каков номер первого байта? Знаем ли мы номер последнего байта?

Решение

Для того чтобы найти номер первого байта, мы умножаем значение смещения на 8. Это означает, что номер первого байта 800. Мы не можем опередить номер последнего байта, если мы не знаем длину данных.

Пример 9

Прибывает пакет, в котором значение смещения – 100, значение HLEN – 5 и значение поля полной длины – 100. Каковы номера первого байта и последнего байта?

Решение

Номер первого байта 100 * 8 = 800. Полная длина 100 байт и длина заголовка 20 байт (5 x 4), которая означает, что в этой дейтаграмме имеется 80 байт. Если номер первого байта 800, последний номер должен быть 879.

Евгений Виноградов
Евгений Виноградов

Прошел экстерном экзамен по курсу перепордготовки "Информационная безопасность". Хочу получить диплом, но не вижу где оплатить? Ну и соответственно , как с получением бумажного документа?

Илья Сидоркин
Илья Сидоркин

Добрый день! Подскажите пожалуйста как и когда получить диплом, после сдичи и оплаты?????