Управление фрагментацией
Три поля в заголовке дейтаграммы, ИДЕНТИФИКАЦИЯ, ФЛАГИ и СМЕЩЕНИЕ ФРАГМЕНТА, управляют фрагментацией и сборкой дейтаграмм. Поле ИДЕНТИФИКАЦИЯ содержит уникальное целое число, которое идентифицирует дейтаграмму. Напомним, что когда шлюз фрагментирует дейтаграмму, он копирует большую часть полей в заголовке дейтаграммы в каждый фрагмент. Поле ИДЕНТИФИКАЦИЯ должно копироваться. Его основная цель - позволить назначению узнать, что какой дейтаграмме принадлежат прибывающие фрагменты. Когда появляется фрагмент, назначение использует поле ИДЕНТИФИКАЦИЯ вместе с полем адреса источника для идентификации дейтаграммы. Компьютер, посылающий IP-дейтаграммы, должен генерировать уникальное значение для поля ИДЕНТИФИКАЦИЯ для каждой отдельной дейтаграммы(в теории, повторные передачи дейтаграммы должны содержать то же самое значение в поле ИДЕНТИФИКАЦИЯ, что и в исходной дейтаграмме; на практике, протоколы высокого уровня обычно выполняют повторную передачу как новую дейтаграмму со своей ИДЕНТИФИКАЦИЕЙ). Одна из технологий, используемых в программном обеспечении IP, хранит глобальный счетчик в памяти, инкрементирует его каждый раз, когда создается новая дейтаграмма, и копирует результат в поле ИДЕНТИФИКАЦИЯ дейтаграммы.
Напомним, что каждый фрагмент имеет точно такой же формат, что и полная дейтаграмма. Для фрагмента поле СМЕЩЕНИЕ ФРАГМЕНТА указывает смещение в исходной дейтаграмме данных, передаваемых в фрагменте, измеряемое в 8 октетах(смещения измеряются в восьмерках октетов для сохранения места в заголовке), начиная со смещения ноль. Для сборки дейтаграммы назначение должно получить все фрагменты, начиная с фрагмента со смещением 0 до фрагмента с наибольшим смещением. Фрагменты необязательно прибывают по порядку, и не существует взаимодействия между шлюзом, который фрагментирует дейтаграммы, и назначением, которое пытается собирать их.
Младшие два бита из трехбитового поля ФЛАГИ управляют фрагментацией. Обычно прикладное программное обеспечение, использующее TCP/IP, не заботится о фрагментации, так как и фрагментация, и сборка являются автоматическими процедурами, которые выполняются на низком уровне в операционной системе незаметно для пользователя. Тем не менее, для тестирования межсетевого программного обеспечения или отладки рабочих проблем может оказаться важной проверка размеров дейтаграмм, для которых осуществляется фрагментация. Первый управляющий бит помогает при таком тестировании, указывая возможность фрагментации дейтаграммы. Он называется битом НЕ ФРАГМЕНТИРОВАТЬ, так как установка его в единицу указывает, что дейтаграмму нельзя фрагментировать. Приложение может выбрать запрет фрагментации, когда нужна лишь целая дейтаграмма. Например, рассмотрим последовательность загрузки компьютера, при которой машина начинает выполнять небольшую программу в ПЗУ, которая использует интернет для запроса начального образа операционной системы, а другая машина посылает ей его. Если программное обеспечение разработано так, что ему нужно либо все, либо ничего, дейтаграмма должна иметь установленный бит НЕ ФРАГМЕНТИРОВАТЬ. Всякий раз, когда шлюзу нужно фрагментировать дейтаграмму с установленным битом НЕ ФРАГМЕНТИРОВАТЬ, шлюз удаляет дейтаграмму и посылает обратно источнику сообщение об ошибке.
Младший бит в поле ФЛАГИ указывает, содержит ли фрагмент данные из середины дейтаграммы или из конца. Он называется битом ЕЩЕ ФРАГМЕНТЫ. Чтобы увидеть, почему нужен этот бит, рассмотрим программное обеспечение IP у получателя, пытающееся собрать дейтаграмму. Оно будет получать фрагменты( возможно не по порядку) ,и ему нужно будет знать, когда оно получило все фрагменты дейтаграммы. Когда появляется еще один фрагмент, поле ОБЩАЯ ДЛИНА в заголовке указывает размер фрагмента, а не размер всей дейтаграммы, поэтому назначение не может использовать поле ОБЩАЯ ДЛИНА для того, чтобы определить, собрало ли оно все фрагменты. Бит ЕЩЕ ФРАГМЕНТЫ легко решает проблему: как только назначение получает фрагмент со сброшенным битом ЕЩЕ ФРАГМЕНТЫ, оно знает, что этот фрагмент несет в себе данные из конца исходной дейтаграммы. На основе полей СМЕЩЕНИЕ ФРАГМЕНТА и ОБЩАЯ ДЛИНА оно может вычислить длину исходной дейтаграммы. Проверив СМЕЩЕНИЕ ФРАГМЕНТА и ОБЩАЯ ДЛИНА у всех прибывших фрагментов, получатель может определить, содержат ли фрагменты все данные, требуемые для сборки исходной дейтаграммы.