Короткая и понятная лекция о том, как IP-пакеты проходят между сетями
Здравствуйте! Сегодня мы поговорим о изменениях IP пакета при прохождении их между сетями.
Постановка задачи. У нас есть некоторая локальная сеть с хостами от хост 1 до хост 4, подключённая через роутер к общей сети Интернет, и через сеть роутеров она подключается к сети, содержащей хост 5 и хост 6. Мы передаём IP пакет из Хоста 2 в Хост 5. Для осуществления этой передачи хосту 2 необходимо знать IP адрес Хоста 5. И вот здесь они написаны. В принципе, они должны передаваться в эту сторону. Мы должны обязательно передать адрес Хоста 5, и хост 2 передаёт свой IP адрес для получения ответа.
Итак, рассмотрим общую структуру пакета. Так как мы рассматриваем, то у на данные обязательно уровня к нему прибавляется слева заголовок IP межсетевого уровня. К нему прибавляется заголовок. Здесь я показал структуру отдельных полей. Индекс означает размер. Например, IP D4 означает, что это IP адрес. В данном случае здесь будет ip5. Мы с вами интересует тот факт, что эти поля меняться не будут при прохождении пакета.
Итак, посмотрим, как же будет распространяться наш пакет от Хоста 2 через роутеры к Хосту 5. Поговорим о полях MAC. Это поле ма адрес назначения 6 байт. Ма адрес сендера отправителя тоже 6 байт. И последнее поле – протокол сетевого межсетевого уровня. При распространении в сетях IP здесь будет стоять волшебное число 0800, если речь идёт о простом IP пакете. Поэтому здесь я это записал постоянно.
Далее начинается IP заголовок, который собственно является предметом нашего сегодняшнего рассмотрения. В частности, он состоит из следующих полей. Первое поле – 1 байт. Я его обозначил как Iph. Это версия, четка и длина всего IP заголовка четных величинах. В данном случае это 5, поскольку в большинстве случаев IP заголовок имеет длину 20 байт. В редких случаях к нему добавляются параметры, они вставляются перед транспортным заголовком. Мы это рассматривать не будем, нас будет достаточно обычного случая. Сюда помещается длина заголовка 4. Длина заголовка в четных словах, поэтому здесь волшебный байт 45.
Вот такая последовательность. Если мы получаем какой-то пакет по сети, отделяем первые 12 байт. Далее идёт следующий байт – type of Service, который является рекомендациями группе роутеров по способу обработки нашего пакета. Сюда входит важность, скорость, надёжность и другие параметры. Но это рекомендации. В рамках нашей сегодняшней лекции мы их рассматривать не будем, поскольку нас интересует содержательная часть изменения.
Далее идёт Лен. Лен – это двухбайтным образом. Мы видим, что длина IP пакета не может превышать 64 КБ. Далее идёт ID пакета. Мы будем говорить о полях ID и офсет пакета, когда будем подробно рассматривать фрагментацию. Чуть позже в этой же лекции я покажу, для чего они используются. ID пакета и офсет. Поле офсет у нас занимает 2 байта, поле ID тоже 2 байта, но оно делит эти два байта. Здесь слева стоят 3 байта флажков. Из этих флажков нам понадобится три бита. Флажков из них потребуется один флажок. Мы вот эту группу будем смотреть, когда будем говорить о фрагментации.
Если пакет не фрагментированное на передачу пакета, который полностью влезает в возможность АТ сети, то вот здесь будет какое-то число. Здесь будет этот важный битик, который нас будет интересовать ноль, и офсет будет ноль. Вот здесь как бы ничего.
Следующий важный параметр – это ТТ. Вот это важный параметр T. Time to Live – это число скачков, через которые пакет будет уничтожен. Занимает 1 байт. Следовательно, не может превышать 255. При передаче пакета первому роутеру роутер, получив, уменьшает на единицу. Каждый роутер уменьшает Т на единицу с целью того, чтобы не получались "кии" пакеты. Если мы передаём в сеть пакет, который предназначен IP недостижимо, то теоретически возможна ситуация. Для того чтобы это не произошло, в каждый пакет втыкают однобайтовый ТТ. ТТ уменьшается на каждом роутере, и когда ТТ будет равно нулю, пакет уничтожается. Дальше он не идёт. Это обеспечивает более-менее чистоту сети от мусора.
Далее идёт однобайтовый. Однобайтовом рнет заголовке у нас двухбайтная сумма контрольная сумма обеспечивает тривиальную. Сумма контрольная делается так, чтобы общая длина общего пакета. Когда получатель получил вот IP пакет, он делит его на кусочки по 2 байта, складывает их, и с учётом контрольной суммы он должен получить ноль. Если он получает не ноль, значит пакет битый, и он его не обрабатывает. Контрольная сумма формируется следующим образом: сначала кладётся поле равное нулю. На передающей стороне складываются все слова сообщения, и в контрольную сумму кладётся минус это число, то есть сколько получилось. Мы кладём минус, поэтому повторное сложение даст нам ноль.
Ну и наконец сама главная часть IP сендера – 4 байта, то есть кто отправил. В данном случае это будет ip2, как я уже говорил, и IP Destination – кому отправлено, то есть в данном случае будет ip5. Вот эти две величины тоже не меняются в процессе распространения, так же как не меняется всё, что идёт за ними.
Ну и давайте рассмотрим последовательно прохождение нашего пакета по этим веточкам. Первая веточка – это OST 2 сетевая карта с индексом а роутера о. Здесь будет так, давайте обозначим это буквой А. Я буду показывать большие буквы, что важные части, которые могут изменяться на пути, обязательно мы должны показать. В данном случае это здесь уже индексы. Эти индексы относятся к конкретным сетевым картам. Ma – это значит ма адрес сетевой карты. А Mac Source mac1, mac1 – это ма нашего исходного, вернее, ма 2 – это ма нашего отправителя. Дальше вот эти три байта мы оставляем, четвёртый байт также оставляем. Некоторая длина, она у нас постоянна, мы её не меняем при прохождении.
ID пакета тоже постоянный. Эти флажки, если пакет короткий, то офсет у нас равно нулю, тоже постоянно, но оно всегда постоянно. T Time to Live – мы задаём, допустим, для примера, зададим Time to Live 8. Пусть будет вот такой. Пусть пакет уходит. T равен 8.
Посмотрим протокол транспортного уровня и контрольную сумму. Пусть у нас будет сумма 0. При уходе у нас T равен 8 и контрольная сумма, но IP адреса. Ну вот они уже жёстко заданы.
Мы поехали. Предположим, что от роутера о через сетевую карту б на сетевую карту роутера 3 идёт следующая веточка. Веточка, ре. Здесь ма – ма кому, от кого. Это мадрес сетевой карты роутера 1Б исходящего. Да, вот поменялись радикально ма адеса. Это всё остаётся, остаётся, остаётся, как я уже говорил. Каждый роутер уменьшает, поэтому уже пойдёт 7. И для того, чтобы у нас билась контрольная сумма, контрольная сумма должна быть 0.
П1 ясно. То есть роутер при прохождении сигнала пакета через него обязательно меняет четыре поля, но он меняет обязательно. То есть вот эти два поля, конечно, меняются в IP заголовке. Только два поля меняется. T уменьшается на единицу и сумма увеличивается на единицу для того, чтобы у нас пакет был правильный.
Далее от роутера 3 по сетевой карте SF. Пусть мы перемещаемся к роутеру 4. Это будет веточка с у нас. Ээээ, Mac F, ма – ма F кому и от Мака S, от кого. Mac S от кого – всё то же самое, но роутер 3, естественно, уменьшил, стало 6. П2 эти два поля он уменьшил. Пакет приходит к роутеру 4.
Наконец завершающая веточка. Торжественно через сетевую карту H мы передаём его к H5. Это последний ход. Mac это и этого от. Ну естественно, здесь будет 5 и S0 П3. На наше счастье, ТТ не закончился, поэтому пакет доехал. Как я уже говорил, если ТТ кончается, то даже при исправной сети роутер, который его как бы обнулил, убивает пакет и дальше не передаёт.
Вот так меняются заголовки в процессе распространения. Отсюда можно делать следующие выводы. Первый вывод. Если вы хотите передавать с достаточной уверенностью, вы должны ТТ увеличить на исходящем Хосте. Например, ТТ поставить 255. Нормальный ТТ он пройдёт 254 роутера и сдохнет, только потом. Если он доедет раньше, ну и хорошо. Если ТТ будет маленький или сеть много, то мы можем не получить доступа к открытому хосту при полной исправности сети.
Далее у нас не меняется постоянная часть в IP заголовке. Она необходима для того, чтобы Хост 5, во-первых, мог понять, что это ему, во-вторых, мог ответить. То есть эта часть передаётся всегда во всех пакетах одинаково IP5.
А вот радикально меняется мадрес, радикально меняется у нас часть пакета. То есть принимающая сторона не видит ма адреса отправителя, и таким образом мы не можем по ARP передавать между сетями. Вот для этого нужен средний уровень.
Для связи между D и А ничего общего нет, поэтому вот такие изменения происходят с пакетом. Турбай, как я уже говорил, ряд полей у нас не меняется, я их здесь не менял.
Ну и теперь поговорим о фрагментации. Транспортный уровень может захотеть передать пакет длиной до 64Б. Одно из основных понятий – это МТУ, и эта величина показывает, сколько реально может передать сеть, какой длины суммарно может передать сеть, сколько байтов за один пакет. За один пакет, ну скажем так, гарантируется, что ту больше Лира 576, в любой МТУ порядка 1500 байтов. В стекле ЭМТУ порядка 4000 байтов. То есть относительно небольшая частота, небольшая величина. Для различных видов сетей гораздо меньше, чем 64 Кб.
В этой ситуации пакет надо разбивать. Итак, предположим, что у нас с вами нужно отправить пакет размером, ну скажем, 900 байтов. Я утрирую ситуацию, важна идея. Итак, сам пакет 900 байтов, и мы бьём его на части по 400 байтов. Просто чисто для красоты.
Вот так и вот так: 400, 400 и 100. То есть постановка задач. Нам нужно передать 900, а сеть не пропускает 900, сеть пропускает 400. У неё такое что? Оно пропускает 400 байт. Для примера такой пакет будет передаваться тремя пакетами. Первый пакет 400 и третий пакет 100 байтов – это их длина.
Вот эта длина. Далее, для того чтобы приёмник понял, что эти три пакета относятся к одному и тому же большому пакету, их необходимо как-то объединить. Вот ID пакета. У них будет одинаковый ID пакета. Это некоторый случай, у них оно будет одинаковое. Это будет ID0.
Получив пакеты с одинаковым ID, приёмная сторона поймёт, что их нужно объединить. Дальше нам приёмная сторона должна понять, в каком порядке их объединять. Структура интернета такова, что пакеты отправлены друг за дружкой могут прийти не подряд.
Допустим, этот роутер, этот немножко переполнится, второй пакет пошёл по этой сети, третий пакет опять по этой сети. Они, в общем, случае приходят в разные моменты времени. Может случиться ситуация, что, например, вот этот пакет придёт вторым, вот этот первым, вот этот третьим, или наоборот. Вот этот придёт первым – я утрирую ситуацию. То есть нам важно знать, в каком порядке их склеивать. Время прихода никак не связано с склеиванием, поэтому вводится понятие офсет.
Смещенье офсет. А вот здесь офсет. Офсет реальный. А вот здесь офсет переданный, который был передан в пакете. Итак, однозначно осет – это смещение нашего под пакета в исходном пакете. У первого пакета смещение равно нулю, то есть он в самом начале. Здесь будет ноль. У следующего пакета следующий пакет начинается с 400 байта, поэтому здесь будет 400 уже. Ну и последний пакет начинается с байта 800, имеет 100 байтов.
По эти эта величина в принципе передаётся вместе с ID пакета. Она позволяет нам на принимающей стороне понять, в каком порядке склеивать. Единственное ограничение, которое здесь есть, заключается в том, что поле офсет не 2 байта, а оно старше 3 битов отдаёт на всякие нужды, а занимает только 13 бит. Поэтому оно должно быть меньше, у него меньше возможностей. Поэтому реально передаётся офсет делить на 8. Здесь по-прежнему будет ноль, здесь 400 делить на 8 – 50. Здесь 400 делить на 8 – 100. Вот такие числа передаются. Вот здесь на приёмном конце, получив вот это число, приёмная сторона умножает его на 8 и получает реальное смещение.
Ну и на последний в этой же структуре есть бита, один из которых – бит, не последний бит, который установлен в единицу, если под пакет не последний. Вот я его так флажок, вот флажок сделаю. Если пакет, то есть мы можем знать порядок, знаем, что зачем следовать, а они приходят по-разному, но их смещения мы не знаем когда. Придёт последний пакет, если у нас, допустим, пере два пакета. Вот эти два пакета. Если у нас всего 800 байт, непонятно будет ещё пакет или не будет.
Вот для этой цели служит бит в этом поле. Один из ТХ битов в этом поле. Он устанавливается в единицу, если пакет не последний. То есть здесь он будет единица, да, здесь он будет. Здесь будет ноль. С этим флажком равным нулю она понимает, что это последний пакет, больше не будет, приступает к сборке. В реальности она не приступает сразу к сборке. Она ждёт тайм-аут. Есть определённый тайм-аут, когда она ждёт, пока доедут все остальные пакеты. После того, как доехали все пакеты, она их складывает в правильном порядке и отдаёт транспортному уровню своему.
Вот такой уже фрагментированный пакет в целом. То есть его транспортный уровень не знает, как билось там. Это не его интерес. Он получает пакет целиком. В случае, если в рамках этого таймаута какой-либо из пакетов не доезжает, и принимающая сторона не может собрать пазл из этих частей, она отбрасывает всё и инициирует возможность повторной передачи.
Но вот это поле, ещё раз: вот это поле, для чего я сейчас объяснял. Вот это поле разрешает нам сложить длинный пакет независимо от того, в каком порядке приехали его части, в независимости от того, сколько было частей, сложить в правильном порядке и отдать своему транспортному уровню.
Вот такие пертурбации происходят с простым пакетом при прохождении между сетями. Довольно много чего интересного я здесь задел только часть, но тем не менее в рамках указанного времени я постарался изложить эту часть. Вот и всё на сегодня. Спасибо за внимание.