MTU определяет максимальную длину блока данных, которую данная сетевая среда в состоянии перенести. Если блок данных имеет большую длину, он автоматически разбивается на кусочки меньшей длины, каждый из которых передается затем по отдельности.
Фрагментация — это процесс разбиения отдельного пакета данных на некоторое количество пакетов помельче. Фрагментация происходит в случае, если длина пакета превосходит MTU физического сетевого уровня. Однако она также происходит, когда пакет попадает в маршрутизатор с MTU меньшим, нежели MTU локальной сети источника. Для управления фрагментацией IP использует первый и последний биты в трехбитовом поле флагов. Первый бит называется «фрагментация запрещена» и устанавливается сетевым программным обеспечением для тестирования и отладки. Существуют некоторые приложения, данные которых действительно нельзя фрагментировать. Включая режим «фрагментация запрещена», то есть устанавливая соответствующий бит, имейте в виду, что если модуль IP обнаружит, что фрагментация все-таки должна произойти, протокол TCP/IP отбросит IP-пакет и вернет сообщение об ошибке источнику пакета.
TCP/IP возвращает сообщение об ошибке (по протоколу IСМР), когда истекает время существования, TTL, указанное в заголовке IP-пакета. Ошибка контрольной суммы заставляет TCP/IP молча отбросить IP-пакет, то есть без какого-либо диагностического сообщения.
Для уведомления об ошибках и просто ситуациях, требующих внимания, TCP/IP использует протокол управляющих сообщений Интернет (Internet Control Message Protocol, IСМР). IСМР является частью сетевого уровня, на котором находится и IP. IСМР действует как протокол более высокого уровня, поскольку свои данные он передает через IP.
Последний бит поля флагов называется «фрагмент-продолжение». В процессе фрагментации пакета IP устанавливает этот бит в единицу во всех фрагментах, кроме последнего. В последнем фрагменте данных бит равен нулю.
Для повышения эффективности и производительности IP всегда пытается послать пакет наибольшего допустимого размера. Однако иногда фрагментации не избежать. До начала фрагментации IP рассчитывает точку деления (breaking point), равную значению MTU низлежащего уровня сети. Точка деления — это расположение байта в пакете, на котором произойдет разделение.
Точка деления представляет собой смещение или расстояние от начала датаграммы. Каждая точка деления записывается IP в поле «смещение фрагмента» заголовка только что собранной IP-датаграммы. IP-заголовок каждой датаграммы содержит смещение данного фрагмента относительно начала данных. Значение точки деления используется IP на другом конце соединения, чтобы правильно собрать фрагментированный пакет.
В действительности размер каждого фрагмента слегка отличается от значения MTU, поскольку всегда кратен восьми байтам. Длина поля длины пакета в шестнадцать битов означает, что максимальная длина пакета может равняться 65 535 байтам. Поле смещения фрагмента должно уметь обозначить точку смещения на всей длине IP-пакета, следовательно, должно адресовать от 1 до 65 535 байтов. Однако длина поля смещения фрагмента равна всего тринадцати битам и, следовательно, может принимать значения в интервале от 0 до 8191, позволяя адресовать максимум 8191 байт.
Если значение поля смещения фрагмента кратно 8 байтам, проблема решается. Например, значение поля смещения 1 означает смещение в восемь байтов, 2 — в шестнадцать и т. д. Максимальное смещение при этом равно 65 528 (8191х8).
Сборка фрагментов
Как только принят пакет с установленным в единицу флагом «фрагмент-продолжение», запускается специальный таймер сборки фрагментов. Все фрагменты обязаны появиться у принимающей стороны до того, как истечет интервал времени, отпущенный на это таймером. Если время истекло, а все фрагменты так и не появились, модуль IP отбрасывает принятые фрагменты и не обрабатывает частично принятую датаграмму.
Компьютер-приемник датаграммы располагает ее в буфере для сборки датаграмм. Фрагменты, принадлежащие одному пакету, определяются по адресу источника и полю идентификатора в IP-заголовке. Как только приходит датаграмма с битом «фрагмент-продолжение», равным нулю, модуль IP может подсчитать общую длину пакета.
Поле «смещение фрагмента» задает смещение начала данного фрагмента от начала исходного пакета данных. Последний фрагмент в группе (с установленным в ноль битом «фрагмент-продолжение») позволяет модулю IP подсчитать длину исходного пакета путем сложения значений полей смещения фрагмента и длины пакета.
Выяснив первоначальную длину датаграммы, модуль IP приступает к изучению полей смещения фрагмента и длины пакета в остальных фрагментах датаграммы. Модуль IP собирает датаграмму, основываясь на известных значениях полей смещения каждого фрагмента. Получив в результате датаграмму в первозданном виде, сетевой уровень считает, что фрагментации как будто бы никогда и не было.
Протокол управления транспортировкой (TCP) пользуется MTU, равным 576 байтам, для передачи данных компьютерам через несколько маршрутизаторов. Эта длина выбрана не случайно. Она позволяет разместить в пакете 512 байтов данных и оставить место для TCP- и IP-заголовков и опций. Большинство протоколов уровня соединения могут работать с таким MTU, следовательно, не фрагментируя данные до передачи по каналу связи.