воскресенье, 25 июля 2010 г.

Сети. Основы. Часть 3.

Третья часть цикла статей о сетях. В ней речь идет о протоколе IP и фрагментации IP пакетов.



Напомню, что оригинал вы можете найти тут. Кроме того, еще раз выражаю свою благодарность Refresh'у.

Протокол IP

Протокол IP отвечает за маршрутизацию TCP (UDP) пакетов от отправителя к получателю, так же в его функции входит фрагментация и сборка IP пакетов в один IP сегмент.
Когда мы разбирали схему работы модели OSI мы говорили об инкапсуляции. Вот структура IP заголовка который будет добавляться к TCP(UDP) пакету и передаваться на канальный уровень.

структура IP заголовка

На рисунке схематично показано разделение всего заголовка на отдельные служебные поля.
Сразу дам пояснения по поводу рисунка. На рисунке заголовок состоит из 6 строчек(октетов), каждая из которых длиной в 32 бита (4 Байта). Наверное появились вопросы, а как эти строчки передаются. На самом деле это просто схематичное представление, для компьютера заголовок выглядит примерно вот так :

представление IP заголовка

Размер заголовка IP пакета имеет переменную длину, но всегда кратен 32 байтам. IP заголовок состоит минимум из 5 обязательных октетов (на рисунке это строчки). В этих пяти октетах содержится основная часть заголовка. Которая имеет фиксированный размер. Шестой октет, показанный на рисунке – дополнительный и используется только если нужно указать специальные опции. Поле «Дополнительные биты» служит для того что бы «добрать» недостающие биты. Например, если поле опций содержит в себе 27 бит, то поле дополнительных бит будет содержать 32-27 = 5 бит. Это сделано для того, что бы при любой длине поля опций не терялась целостность пакета (должен быть кратен 32). Дополнителых октетов может быть больше чем один.

Так же для общего понимания следует знать вот что: каждое служебное поле имеет свой фиксированный размер и не может содержать в себе больше разрешенного по стандартам данных (кроме поля опций и дополнительных бит). То есть например для поля «Версия» (содержит в себе версию используемого IP протокола) отведено 4 бита. Для того что бы нам записать десятичное число 4 (что означает IPv4) нам потребуется только 3 бита – 100, оставшийся младший бит будет равен 0 (вы должны четко знать хотя бы основы двоичного исчисления: самый старший бит находится справа, самый младший слева), от этого значение двоичного числа у нас никак не измениться 0100=100. Так же происходит с каждым полем, неиспользуемые биты будут выставлены в ноль, от чего служебные поля всегда будет иметь одинаковую длину.

Теперь опишу каждое служебное поля в заголовке.
1)Версия (ver) – содержит в себе номер версии протокола IP. Размер 4 бита.
2)Длина заголовка (IHL, Internet Header Length) – содержит длину заголовка в октетах. Минимальное значение 5 ( 101b, когда отсутствует поле опций), максимальный размер 15 (1111b, поле опций будет занимать 40 байт, найти это можно так: 15*32=480 бит /8 =60 байт – 20 байт=40 байт ).
3)Тип обслуживания (ToS,Type Of Service) – определяет приоритет IP пакета и тип маршрутизации. Размер 8 бит. Содержимое этого поля:

тип обслуживания

Биты приоритета IP пакета могут быть:

биты приоритета пакета

Поле «Тип маршрутизации» состоит из 4 флагов (флаг=бит)

тип маршрутизации

Одновременно может быть установлен только один бит.

4)Общая длина (Total Length) – содержит в себе длину всего IP пакета в октетах, минимальное значение 21 байт (заголовок без опций + один октет данных), максимальное 65535. Размер 16 бит.
5)Идентификатор (ID), Флаги (Flags), Смещение фрагмента(Fragment Offset) используется для алгоритма фрагментации. Пока что опустим их. На них мы остановимся попозже.
6)Время жизни (TTL, Time To Live) – Время жизни пакета установленное отправителем. Каждый хост который будет работать с данным IP пакетом будет отнимать время (в секундах, округляя к большему) от этого значения, которое он потратил на обработку этого пакета. Как только время дойдет до 0 пакет удаляется. Это сделано для того что бы «потерявшиеся» пакеты не ходили циклом и не загружали сеть. Размер 8 бит.
7)Протокол (Protocol) – содержит код протокола уровня которому следует передать поле данных после обработки. Размер 8 бит. Коды некоторых протоколов.

коды протоколов

8)Контрольная сумма заголовка (Header Checksum) – содержит контрольную сумму заголовка. Рассчитывается она путем сложения всех 16-ти разрядных слов заголовка по модулю 2. Контрольная сумма так же как и время жизни пересчитывается на каждом маршрутизаторе. Если найдено несоответствие то пакет удаляется. Размер 16 бит.
9)Адрес отправителя (Source Address) - соедржит IP адрес отправителя. Размер 32 бита.
10)Адрес получателя (Destination Address) – содержит IP адрес получателя. Размер 32 бита.

Фрагментация IP пакетов.
Существующие сети очень многообразны, каждая сеть имеет свою индивидуальную настройку, которая по мнению администратора поможет уменьшить коллизии, увеличить быстродействие и удобство работы соответственно. Есть такое понятие как MTU.

MTU – максимальный размер Ethernet кадра, другими словами - максимально возможный размер «блока» который может передать протокол канального уровня. Логично заметить, что напрямую от этого параметра зависит скорость передачи данных в сети, ведь чем больше размер пакетов тем быстрее вся информация передастся на удаленный компьютер. У различных сетей это значение может быть разное. И как же тогда быть когда нам надо доставить данные в сеть с меньшим значением MTU? Как раз для этого и был разработан механизм фрагментации.

Фрагментация это процесс разбития IP пакета в соответствии со значением MTU и последующей передачи его на канальный уровень. Как раз для этого механизма в заголовке IP пакета присутствуют спец. поля Идентификатор, Флаги , Смещение фрагмента. Для начала рассмотрим назначение этих полей:
Идентификатор(ID) – «имя» фрагмента, по этому полю удаленный хост определяет все фрагменты одного целостного IP пакета. Размер 16 бит.
Флаги(Flags) – это поле содержит 3 бита, 2 из них определяют фрагментирован ли пакет и последний ли это фрагмент. Младший бит всегда равен 0.

флаги фрагментации

Бит DF: 0 – фрагментация разрешена, 1 – фрагментация запрещена
Бит MF: 0 – последний фрагмент или пакет не фрагментирован, 1 – не последний фрагмент.
Смещение фрагмента(Fragment Offset) – определяет смещение данных этого фрагмента относительно их позиции в целостном IP пакете. Смещение считается по 64 бита (8 октетов). Размер 13 бит.

Рассмотрим процесс фрагментации на примере пакета который отправили из сети с сети FDDI (MTU=4500) в сеть Ethernet (MTU=1500).
Хост-отправитель выставил такие служебные поля:

поля, выставленные отправителем

На маршрутизаторе который соединяет нашу сеть с сетью отправителя произойдет фрагментация пакета:

последствия фрагментации

Ну а теперь как всегда пояснения. Пакет который нам отправили пришел на «пограничный» маршрутизатор. После определения несоответствия значения MTU маршрутизатор запустил механизм фрагментации IP пакета. На наш компьютер придут 3 пакета, которые удовлетворяют значениям MTU. Как видим у исходного пакета бит DF = 0, значит мы можем фрагментировать этот пакет, бит MF сброшен, в данном случае это означает что это единственный фрагмент.
И теперь посмотрим на те пакеты которые получил наш ПК. Значение поля ID у всех фрагментов одинаково, что свидетельствуют о том что это фрагменты одного цельного IP пакета. Поле Total Length не относиться к фрагментации, но я решил для наглядности его показать, как мы видим все пакеты удовлетворили стандартному значению MTU для Ethernet. бит DF у всех остался 0 (пакет можно фрагментировать). Теперь разберем у всех 3 фрагментов бит MF и смещение фрагмента:
Первый фрагмент – бит MF = 1, значит этот фрагмент не последний. Поле смещения = 0 т.к. это первый фрагмент, поэтому данные содержащиеся в нем будут начальными данными всего IP пакета.
Второй фрагмент – бит MF = 1, значит этот фрагмент не последний. Поле смещения = 185. Теперь смотрим как это получилось: смещение записывается порциями по 64 бита или 8 октетов (64\8=8).общая длина фрагмента у нас 1500 октетов, отнимаем 20 октетов, которые содержаться в IP заголовке, получаем 1480 октетов. Теперь делим на 8, что бы получить смещение, 1480\8=135.
Третий фрагмент – бит MF = 0, значит этот фрагмент последний. Поле смещения = 370 т.к. у нас одинаковая длина октетов. Получается такое же смещение относительно второго фрагмента, значит 185+185 = 370.
По сети фрагменты путешествуют как обычные IP пакеты. Собираются воедино только на узле-получателе.

Фрагментация имеет и свои минусы:
1)Трата ресурсов отправителя и звеньевых маршрутизаторов. Для того что бы выполнить фрагментацию надо высчитать контрольную сумму для всех фрагментов, скопировать каждому заголовок оригинального IP пакет (разумеется внести туда изменения).
2)Если любой из фрагментов не дошел то все дошедшие фрагменты удаляются и приходиться заново посылать весь IP пакет и выполнить все что написано выше.