Айпи это протокол с гарантированной доставкой данных тест

Обновлено: 16.05.2024

1. Лекция - Введение. Адресация. Протоколы (IP, TCP, UDP). Порты.

Официальная документация по Internet

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

Адресация в сети Internet.

Типы адресов.

Физический (MAC-адрес)

Сетевой (IP-адрес)

Символьный (DNS-имя)

Компьютер в сети TCP/IP может иметь адреса трех уровней (но не менее двух):

Локальный адрес компьютера. Для узлов, входящих в локальные сети - это МАС-адрес сетевого адаптера. Эти адреса назначаются производителями оборудования и являются уникальными адресами.

IP-адрес, состоящий из 4 байт, например, 109.26.17.100. Этот адрес используется на сетевом уровне. Он назначается администратором во время конфигурирования компьютеров и маршрутизаторов.

IPv4 - адрес является уникальным 32-битным идентификатором IP-интерфейса в Интернет.

IP-адреса принято записывать разбивкой всего адреса по октетам (8), каждый октет записывается в виде десятичного числа, числа разделяются точками. Например, адрес


10100000010100010000010110000011
записывается как

Перевод адреса из двоичной системы в десятичную

IP-адрес хоста состоит из номера IP-сети, который занимает старшую область адреса, и номера хоста в этой сети, который занимает младшую часть.

160.81.5. - номер сети

131 - номер хоста

Базовые протоколы (IP, TCP, UDP)

Стек протоколов TCP/IP

TCP/IP - собирательное название для набора (стека) сетевых протоколов разных уровней, используемых в Интернет. Особенности TCP/IP:

Открытые стандарты протоколов, разрабатываемые независимо от программного и аппаратного обеспечения;

Независимость от физической среды передачи;

Система уникальной адресации;

Стандартизованные протоколы высокого уровня для распространенных пользовательских сервисов.

Стек протоколов TCP/IP

Стек протоколов TCP/IP делится на 4 уровня:

Физический и канальный.

Позже была принята 7-ми уровневая модель ISO.

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

Пример инкапсуляции пакетов в стеке TCP/IP

Физический и канальный уровень.

Стек TCP/IP не подразумевает использования каких-либо определенных протоколов уровня доступа к среде передачи и физических сред передачи данных. От уровня доступа к среде передачи требуется наличие интерфейса с модулем IP, обеспечивающего передачу IP-пакетов. Также требуется обеспечить преобразование IP-адреса узла сети, на который передается IP-пакет, в MAC-адрес. Часто в качестве уровня доступа к среде передачи могут выступать целые протокольные стеки, тогда говорят об IP поверх ATM, IP поверх IPX, IP поверх X.25 и т.п.

Межсетевой уровень и протокол IP.

Основу этого уровня составляет IP-протокол.

IP (Internet Protocol) – интернет протокол.

Первый стандарт IPv4 определен в RFC-760 (DoD standard Internet Protocol J. Postel Jan-01-1980)

Последняя версия IPv4 - RFC-791 (Internet Protocol J. Postel Sep-01-1981).

Первый стандарт IPv6 определен в RFC-1883 (Internet Protocol, Version 6 (IPv6) Specification S. Deering, R. Hinden December 1995)

Последняя версия IPv6 - RFC-2460 (Internet Protocol, Version 6 (IPv6) Specification S. Deering, R. Hinden December 1998).

Протокол IP доставляет блоки данных от одного IP-адреса к другому.

Программа, реализующая функции того или иного протокола, часто называется модулем, например, “IP-модуль”, “модуль TCP”.

Когда модуль IP получает IP-пакет с нижнего уровня, он проверяет IP-адрес назначения.

Если IP-пакет адресован данному компьютеру, то данные из него передаются на обработку модулю вышестоящего уровня (какому конкретно - указано в заголовке IP-пакета).

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

Структура дейтограммы IP. Слова по 32 бита.

Версия - версия протокола IP (например, 4 или 6)

Длина заг. - длина заголовка IP-пакета.

Тип сервиса (TOS - type of service) - Тип сервиса (подробнее рассмотрен в лекции 8).

TOS играет важную роль в маршрутизации пакетов. Интернет не гарантирует запрашиваемый TOS, но многие маршрутизаторы учитывают эти запросы при выборе маршрута (протоколы OSPF и IGRP).

Идентификатор дейтаграммы, флаги (3 бита) и указатель фрагмента - используются для распознавания пакетов, образовавшихся путем фрагментации исходного пакета.

Время жизни (TTL - time to live) - каждый маршрутизатор уменьшает его на 1, что бы пакеты не блуждали вечно.

Протокол - Идентификатор протокола верхнего уровня указывает, какому протоколу верхнего уровня принадлежит пакет (например: TCP, UDP).

Коды некоторые протоколов RFC-1700 (1994)

Протокол IP является маршрутизируемый, для его маршрутизации нужна маршрутная информация.

Маршрутная информация, может быть:

Статической (маршрутные таблицы прописываются вручную)

Динамической (маршрутную информацию распространяют специальные протоколы)

Протоколы динамической маршрутизации:

RIP (Routing Information Protocol) - протокол передачи маршрутной информации, маршрутизаторы динамически создают маршрутные таблицы.

OSPF (Open Shortest Path First) - протокол "Открой кротчайший путь первым", является внутренним протоколом маршрутизации.

IGP (Interior Gateway Protocols) - внутренние протоколы маршрутизации, распространяет маршрутную информацию внутри одной автономной системе.

EGP (Exterior Gateway Protocols) - внешние протоколы маршрутизации, распространяет маршрутную информацию между автономными системами.

BGP (Border Gateway Protocol) - протокол граничных маршрутизаторов.

Другие служебные IP-протоколы

IGMP (Internet Group Management Protocol) - позволяет организовать многоадресную рассылку средствами IP.

RSVP (Resource Reservation Protocol) - протокол резервирования ресурсов.

ARP (Address Resolution Protocol) - протокол преобразования IP-адреса и адреса канального уровня.

Транспортный уровень

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

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

На транспортном уровне работают два основных протокола: UDP и TCP.

Первая и последняя версия TCP - RFC-793 (Transmission Control Protocol J. Postel Sep-01-1981).

Посылает запрос на следующий пакет, указывая его номер в поле "Номер подтверждения" (AS). Тем самым, подтверждая получение предыдущего пакета.

Делает проверку целостности данных, если пакет битый посылает повторный запрос.

Структура дейтограммы TCP. Слова по 32 бита.

Длина заголовка - задается словами по 32бита.

Размер окна - количество байт, которые готов принять получатель без подтверждения.

Контрольная сумма - включает псевдо заголовок, заголовок и данные.

Указатель срочности - указывает последний байт срочных данных, на которые надо немедленно реагировать.

URG - флаг срочности, включает поле "Указатель срочности", если =0 то поле игнорируется.

ACK - флаг подтверждение, включает поле "Номер подтверждения, если =0 то поле игнорируется.

PSH - флаг требует выполнения операции push, модуль TCP должен срочно передать пакет программе.

RST - флаг прерывания соединения, используется для отказа в соединении

SYN - флаг синхронизация порядковых номеров, используется при установлении соединения.

FIN - флаг окончание передачи со стороны отправителя

UDP (Universal Datagram Protocol) - универсальный протокол передачи данных, более облегченный транспортный протокол, чем TCP.

Основные отличия от TCP:

Отсутствует соединение между модулями UDP.

При потере пакета запрос для повторной передачи не посылается

UDP используется если не требуется гарантированная доставка пакетов , например, для потокового видео и аудио, DNS (т.к. данные небольших размеров). Если проверка контрольной суммы выявила ошибку или если процесса, подключенного к требуемому порту, не существует, пакет игнорируется (уничтожается). Если пакеты поступают быстрее, чем модуль UDP успевает их обрабатывать, то поступающие пакеты также игнорируются.

Структура дейтограммы UDP. Слова по 32 бита.


Не все поля UDP-пакета обязательно должны быть заполнены. Если посылаемая дейтаграмма не предполагает ответа, то на месте адреса отправителя могут помещаться нули.

Протокол реального времени RTP

RTP (Real Time Protocol) - транспортный протокол для приложений реального времени.

RTCP (Real Time Control Protocol) - транспортный протокол обратной связи для приложения RTP..

Назначение портов

По номеру порта транспортные протоколы определяют, какому приложению передать содержимое пакетов.

Порты могут принимать значение от 0-65535 (два байта 2^16).

Некоторые заданные порты RFC-1700 (1994)

Программа Ping

Программа для проверки соединения и работы с удаленным хостом.

Программа TraceRoute - позволяет проверить маршрут до удаленного хоста.

Протокол IPv4

IPv4 - это аббревиатура от Internet Protocol version 4 (Интернет Протокол версии 4) – представляет собой основной тип адресов, используемый на сетевом уровне модели OSI, для осуществления передачи пакетов между сетями. IP-адреса состоят из четырех байт, к примеру 192.168.100.111.

Присвоение IP-адресов хостам осуществляется:

  • вручную, настраивается системным администратором во время настройки вычислительной сети;
  • автоматически, с использование специальных протоколов (в частности, с помощью протокола DHCP - Dynamic Host Configuration Protocol, протокол динамической настройки хостов).

Протокол IPv4 разработан в сентябре 1981 года.

Протокол IPv4 работает на межсетевом (сетевом) уровне стека протокола TCP/IP. Основной задачей протокола является осуществление передачи блоков данных (дейтаграмм) от хоста-отправителя, до хоста-назначения, где отправителями и получателями выступают вычислительные машины, однозначно идентифицируемые адресами фиксированной длины (IP-адресами). Также интернет протокол IP осуществляет, в случае необходимости, фрагментацию и сбору отправляемых дейтаграмм для передачи данных через другие сети с меньшим размером пакетов.

Протокол IP отправляет и обрабатывает каждую дейтаграмму как независимую порцию данных, то есть не имея никаких других связей с другими дейтаграммами в глобальной сети интернет.

После отправки дейтаграммы протоколом IP в сеть, дальнейшие действия с этой дейтаграммой никак не контролируются отправителем. Получается, что если дейтаграмма, по каким-либо причинам, не может быть передана дальше по сети, она уничтожается. Хотя узел, уничтоживший дейтаграмму, имеет возможность сообщить о причине сбоя отправителю, по обратному адресу (в частности с помощью протокола ICMP). Гарантию доставки данных возложены на протоколы вышестоящего уровня (транспортный уровень), которые наделены для этого специальными механизмами (протокол TCP).

Как известно, на сетевом уровне модели OSI работают маршрутизаторы. Поэтому, одной из самых основных задач протокола IP – это осуществление маршрутизации дейтаграмм, другими словами, определение оптимального пути следования дейтаграмм (с помощью алгоритмов маршрутизации) от узла-отправителя сети к любому другому узлу сети на основании IP адреса.

Алгоритм работы протокола ip

Алгоритм работы протокола ip на каком-либо узле сети принимающего дейтаграмму из сети выглядит следующим образом:


Формат заголовка IP

Структура IP пакетов версии 4 представлена на рисунке


  • Версия — для IPv4 значение поля должно быть равно 4.
  • IHL — (Internet Header Length) длина заголовка IP-пакета в 32-битных словах (dword). Именно это поле указывает на начало блока данных в пакете. Минимальное корректное значение для этого поля равно 5.
  • Тип обслуживания (Type of Service, акроним TOS) — байт, содержащий набор критериев, определяющих тип обслуживания IP-пакетов, представлен на рисунке.


Описание байта обслуживания побитно:

Перехваченный IPv4 пакет с помощью сниффера Wireshark:


Фрагментация IP пакетов

На пути пакета от отправителя к получателю могут встречаться локальные и глобальные сети разных типов с разными допустимыми размерами полей данных кадров канального уровня (Maximum Transfer Unit – MTU). Так, сети Ethernet могут передавать кадры, несущие до 1500 байт данных, для сетей X.25 характерен размер поля данных кадра в 128 байт, сети FDDI могут передавать кадры размером в 4500 байт, в других сетях действуют свои ограничения. Протокол IP умеет передавать дейтаграммы, длина которых больше MTU промежуточной сети, за счет фрагментирования – разбиения “большого пакета” на некоторое количество частей (фрагментов), размер каждой из которых удовлетворяет промежуточную сеть. После того, как все фрагменты будут переданы через промежуточную сеть, они будут собраны на узле-получателе модулем протокола IP обратно в “большой пакет”. Отметим, что сборку пакета из фрагментов осуществляет только получатель, а не какой-либо из промежуточных маршрутизаторов. Маршрутизаторы могут только фрагментировать пакеты, но не собирать их. Это связано с тем, что разные фрагменты одного пакета не обязательно будут проходить через одни и те же маршрутизаторы.

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

Второй бит поля Флаги (More fragments), если равен единице, указывает на то, что данный фрагмент – не последний в пакете. Если пакет отправляется без фрагментации, флаг “More fragments” устанавливается в 0, а поле Смещение фрагмента – заполняется нулевыми битами.

Если первый бит поля Флаги (Don’t fragment) равен единице, то фрагментация пакета запрещена. Если этот пакет должен быть передан через сеть с недостаточным MTU, то маршрутизатор вынужден будет его отбросить (и сообщить об этом отправителю посредством протокола ICMP). Этот флаг используется в случаях, когда отправителю известно, что у получателя нет достаточно ресурсов по восстановлению пакетов из фрагментов.

Классы IP адресов

Все IP-адреса можно разделить на две логические части — номера сети и номера узла сети (номер хоста). Чтобы определить какая именно часть IP-адреса принадлежит к номеру сети, а какая — к номеру хоста, определяется значениями первых бит адреса. Также, первые биты IP-адреса используются для того, чтобы определить к какому классу относится тот или другой IP-адрес.

На рисунке показана структура IP-адреса разных классов.


Если адрес начинается с 0, то сеть относят к классу А и номер сети занимает один байт, остальные 3 байта интерпретируются как номер узла в сети. Сети класса А имеют номера в диапазоне от 1 до 126. (Номер 0 не используется, а номер 127 зарезервирован для специальных целей, о чем будет сказано ниже.) Сетей класса А немного, зато количество узлов в них может достигать 2 24 , то есть 16 777 216 узлов.

Если первые два бита адреса равны 10, то сеть относится к классу В. В сетях класса В под номер сети и под номер узла отводится по 16 бит, то есть по 2 байта. Таким образом, сеть класса В является сетью средних размеров с максимальным числом узлов 2 16 , что составляет 65 536 узлов.

Если адрес начинается с последовательности 110, то это сеть класса С. В этом случае под номер сети отводится 24 бита, а под номер узла — 8 бит. Сети этого класса наиболее распространены, число узлов в них ограничено 2 8 , то есть 256 узлами.

Если адрес начинается с последовательности 1110, то он является адресом класса Dи обозначает особый, групповой адрес — multicast. Если в пакете в качестве адреса назначения указан адрес класса D, то такой пакет должны получить все узлы, которым присвоен данный адрес.

Если адрес начинается с последовательности 11110, то это значит, что данный адрес относится к классу Е. Адреса этого класса зарезервированы для будущих применений.

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


Большие сети получают адреса класса А, средние — класса В, а маленькие — класса С.

Использование масок в IP адресации

Для того, чтобы получить тот или иной диапазон IP-адресов предприятиям предлагалось заполнить регистрационную форму, в которой перечислялось текущее число ЭВМ и планируемое увеличение количества вычислительных машин и в итоге предприятию выдавался класс IP – адресов: A, B, C, в зависимости от указанных данных в регистрационной форме.

А что если использовать какой-либо другой признак, с помощью которого можно было бы более гибко устанавливать границу между номером сети и номером узла? В качестве такого признака сейчас получили широкое распространение маски.

Маска — это число, которое используется в паре с IP-адресом; двоичная запись маски содержит единицы в тех разрядах, которые должны в IP-адресе интерпретироваться как номер сети. Поскольку номер сети является цельной частью адреса, единицы в маске также должны представлять непрерывную последовательность.

Для стандартных классов сетей маски имеют следующие значения:

  • класс А - 11111111. 00000000. 00000000. 00000000 (255.0.0.0);
  • класс В - 11111111. 11111111. 00000000. 00000000 (255.255.0.0);
  • класс С - 11111111. 11111111.11111111. 00000000 (255.255.255.0).

Снабжая каждый IP-адрес маской, можно отказаться от понятий классов адресов и сделать более гибкой систему адресации. Например, если рассмотренный выше адрес 185.23.44.206 ассоциировать с маской 255.255.255.0, то номером сети будет 185.23.44.0, а не 185.23.0.0, как это определено системой классов.

Расчет номера сети и номера узла с помощью маски:


В масках количество единиц в последовательности, определяющей границу номера сети, не обязательно должно быть кратным 8, чтобы повторять деление адреса на байты. Пусть, например, для IP-адреса 129.64.134.5 указана маска 255.255.128.0, то есть в двоичном виде:

  • IP-адрес 129.64.134.5 - 10000001. 01000000.10000110. 00000101
  • Маска 255.255.128.0 - 11111111.11111111.10000000. 00000000

Если игнорировать маску, то в соответствии с системой классов адрес 129.64.134.5 относится к классу В, а значит, номером сети являются первые 2 байта — 129.64.0.0, а номером узла — 0.0.134.5.


или в десятичной форме записи — номер сети 129.64.128.0, а номер узла 0.0.6.5.

Для наглядности в таблице отображается соответствие префикса с маской:


Особые IP адреса

В протоколе IP существует несколько соглашений об особой интерпретации IP-адресов:

В протоколе IP нет понятия широковещательности в том смысле, в котором оно используется в протоколах канального уровня локальных сетей, когда данные должны быть доставлены абсолютно всем узлам. Как ограниченный широковещательный IP-адрес, так и широковещательный IP-адрес имеют пределы распространения в интерсети — они ограничены либо сетью, к которой принадлежит узел-источник пакета, либо сетью, номер которой указан в адресе назначения. Поэтому деление сети с помощью маршрутизаторов на части локализует широковещательный шторм пределами одной из составляющих общую сеть частей просто потому, что нет способа адресовать пакет одновременно всем узлам всех сетей составной сети.

IP-адреса используемые в локальных сетях

Все используемые в Интернете адреса, должны регистрироваться, что гарантирует их уникальность в масштабе всей планеты. Такие адреса называются реальными или публичными IP-адресами.

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


Пока воспоминания о предыдущем проекте не канули в лету, займемся завершением начатого. Собственно, мы осуществили обработку ARP запросов, поступающих при отправке команды ping нашему устройству. Логически верным шагом будет реализовать и ответ на вышеупомянутую команду, к чему и переходим. Работаем по классической схеме — первичные теоретические сведения, которые впоследствии буду сопровождены практическим примером для STM32 и ENC28J60.

Небольшой внос дополнительной систематизации:

Итак, продолжаем продвигаться по стеку протоколов к верхним уровням и сегодня работаем на сетевом уровне:

Сетевой уровень.

Протокол IP.

Протокол IP является ключевым, если говорить о функционировании сети Интернет в целом. Именно этот протокол позволяет пакетам циркулировать между сетями, то есть осуществляет объединение различных сетевых сегментов в одну единую Сеть. Каким бы не было количество промежуточных маршрутизаторов между двумя узлами сети, протокол обеспечит доставку информации по адресу.

Между тем, сам по себе протокол IP не гарантирует надежной доставки пакета, в отличие, например, от стандартного примера надежности — TCP.

Формат пакетов IP базируется на привычной структуре — байты заголовка, за которыми следует смысловая нагрузка в виде данных (рассматривается версия IPv4):


Формат пакетов протокола IP разобрали, дополним текущий проект функционалом для их обработки.

Придерживаемся нашей четко структурированной архитектуры и начинаем с добавления в проект двух новых файлов:

STM32, протокол IP.

Второй шаг — определение структуры для работы с IP фреймами. Данное действие происходит в файле ip.h:

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

В принципе, на этом вся подготовительная деятельность завершена, добавляем основную функцию для обработки IP пакетов и формирования ответных:

Общая концепция совпадает с использованной нами в модуле протокола ARP. В качестве аргумента получаем frameLen — длину IP фрейма. Возвращать будем обновленную длину, соответствующую отправляемому пакету. Эта величина будет храниться в newFrameLen.

Проверяем, что указанный IP в пакете соответствует нашему адресу:

В случае успеха рассчитываем контрольную сумму. Небольшой нюанс заключается в том, что перед расчетом нужно обнулить поле с принятым значением, предварительно сохранив его в локальную переменную для последующего сравнения:

Опять же в случае корректности, то есть совпадения значений, продолжаем работать с принятыми данными. В frameLen на данный момент полная длина IP пакета (включая заголовок). Рассчитаем размер поля данных (dataLen), который будем использовать в дальнейшем. Поскольку у нас в планах также протокол ICMP, проверим поле protocol заголовка IP:

В это специально и предусмотрительно отведенное место мы впоследствии поместим обработку ICMP фреймов, а пока закончим с IP… Предполагая, что newDataLen будет изменено впоследствии в части ICMP, рассчитываем обновленную длину полного IP пакета и заносим ее в ipFrame->len:

Фрагментацию пакетов не затрагиваем, так что:

Меняем местами IP-адреса отправителя и получателя, а точнее в IP отправителя заносим наш адрес — ipAddr. Завершаем формирование пакета подсчетом контрольной суммы:

На этом все. Идем на уровень ниже, в файл ethernet.c, в функцию ETH_Process() и по аналогичному с ARP принципу осуществляем обработку IP пакетов:

Разобрались с пакетами IP, теперь разберемся и с содержащимися в них данными. И как уже обсудили, в первую очередь, уделим внимание ICMP.

Протокол ICMP.

Суть формирования пакетов остается такой же, как мы обсудили в предыдущей части:

Протоколы Ethernet, IP, ICMP.

Обработав IP пакет, извлекаем из него данные, который уже являются ICMP пакетом, так же имеющим свой собственный заголовок. Формат ICMP пакета таков:

Формат пакета протокола ICMP.

Снова проходим по полям заголовка в обозначенном порядке:

  • Type — тип пакета. На данный момент наша область интереса: эхо-запрос — код 0x08, эхо-ответ — код 0x00.
  • Code — в кооперации с полем Type дает полную информацию о типе пакета. И для эхо-запроса, и для ответа код — 0x00. А, например, если ICMP пакет сигнализирует о недостижимости узла, то: Type = 0x03, Code = 0x01. Если смысл пакета в недостижимости порта, то уже так: Type = 0x03, Code = 0x03. В общем, суть такая.
  • Checksum — контрольная сумма. Рассчитывается также, как и для IP пакета.

ICMP эхо-запрос.

При формировании ответа на эхо-запрос мы будем менять только поле Type. Снова возвращаемся к проекту, добавляем файлы и определяем структуру для хранения специализированных данных:

STM32, протокол ICMP.

Придерживаемся устоявшейся архитектуры, добавляем функцию ICMP_Process():

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

Систематизируя графически реализованное, получаем:

Работа с сетью на микроконтроллере STM32.

Собираем проект, прошиваем и анализируем полученный результат, отправляя команду ping на наш ip:

Запуск проекта.

Все пошло по плану, наблюдаем успешные ответы от узла. Аналогично, можно посмотреть в WireShark:

WireShark, прием ICMP пакетов

Вишенка на торте — посмотрим на принятые байты. Поставим брейк-поинт, к примеру, здесь:

STM32, отладка Ethernet.

И далее осуществляем анализ имеющихся байтов:

Протокол IP и ICMP.

Поля контрольных сумм нулевые, поскольку мы их собственноручно обнулили в коде. Собственно, вот и все, на этом на сегодня заканчиваем! 👋

image_print

Этот документ содержит спецификацию стандарта DoD 1 для протокола Internet (IP 2 ). Документ основан на 6 предварительных вариантах спецификации протокола ARPA Internet и содержит фрагменты этих спецификаций. В разработке используемых в документе концепций и терминологии принимало участие множество людей. В данной редакции пересмотрены вопросы адресации, обработки ошибок, кодирования опций, приоритетов, изоляции (compartments) и ограничений протокола Internet.

Jon Postel,

редактор

За время, прошедшее с момента завершения данного документа, протокол IP стал одним из самых распространенных протоколов сетевого уровня эталонной модели OSI/ISO и сегодня этот протокол используется практически на каждом компьютере. Вместе с протоколом за прошедшие годы сильно изменилось толкование некоторых используемых в документе терминов и в переводе используются термины в их современном толковании, дабы не порождать путаницы.

Термин gateway (шлюз) в исходном документе использовался для обозначения устройств, которые сегодня называют маршрутизаторами (router), а термином шлюз сегодня обозначают обычно устройства (программы), обеспечивающие преобразование протоколов на более высоких уровнях модели ISO/OSI (например, почтовые шлюзы).

Николай Малых,

переводчик

Исключено в версии HTML.

1. Введение

1.1. Мотивация

Протокол IP предназначен для использования в соединенных между собой компьютерных сетях обмена данными на основе коммутации пакетов. Такие системы получили название catenet [1]. Протокол обеспечивает передачу блоков данных, называемых дейтаграммами, между отправителем и получателем, хосты которых идентифицируются адресами фиксированного размера. Протокол также обеспечивает фрагментацию и сборку дейтаграмм большого размера, если сеть не позволяет передать дейтаграмму целиком.

1.2. Сфера действия протокола

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

1.3. Интерфейсы

Этот протокол вызывается протоколами взаимодействия “хост-хост” 3 и сам вызывает функции локальных сетевых протоколов 4 для передачи дейтаграмм следующему маршрутизатору или хосту-получателю.

Например, модуль TCP будет вызывать модуль IP для размещения сегмента TCP (заголовок TCP и пользовательские данные) в качестве объекта данных дейтаграммы IP. Модуль TCP будет указывать адреса и другие параметры заголовка IP в качестве аргументов при вызове функции IP. Модуль IP будет создавать дейтаграмму IP и обращаться к локальному сетевому интерфейсу 5 для передачи дейтаграммы.

1.4. Работа протокола

Протокол IP выполняет две основных функции – адресацию и фрагментацию/сборку дейтаграмм.

Модули IP используют адреса из заголовков IP для передачи дейтаграмм в направлении получателя. Процесс выбора пути к адресату называется маршрутизацией.

Модули IP используют поля заголовков IP для фрагментации и сборки дейтаграмм IP при необходимости передачи через сети с малым размером пакетов.

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

Протокол IP трактует каждую дейтаграмму как независимый элемент, не связанный с другими дейтаграммами IP. Протокол не использует (явных) соединений или логических устройств (виртуальных или иных).

Для обеспечения сервиса протокол IP использует 4 ключевых механизма – ToS (тип обслуживания), TTL (время жизни), Options (опции) и Header Checksum (контрольная сумма заголовка).

Тип обслуживания (ToS) используется для индикации желаемого качества сервиса. ToS представляет собой абстрактный или обобщенный набор параметров, характеризующих выбранный сервис, который обеспечивается в сетях, образующих Internet. Индикация ToS используется маршрутизаторами для выбора реальных параметров передачи применительно к конкретной сети, следующего интервала или следующего маршрутизатора при доставке дейтаграмм IP.

Время жизни TTL определяет максимальный срок существования дейтаграмм IP. Это значение устанавливается отправителем и уменьшается в каждой точке на пути доставки, где дейтаграмма подвергается обработке. Если значение TTL становится нулевым до того, как дейтаграмма будет доставлена адресату, такая дейтаграмма просто уничтожается. Можно рассматривать TTL как время саморазрушения дейтаграмм.

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

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

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

При обнаружении ошибок информация о них может передаваться с помощью протокола ICMP (Internet Control Message Protocol) [3], реализуемого в модуле IP.

2. Обзор

2.1. Связь с другими протоколами

Рисунок 1. Связь с другими протоколами.

На рисунке 1 показаны связи IP с другими протоколами.

Протокол IP взаимодействует с протоколом вышележащего уровня (протокол взаимодействия между хостами 6 ) и с нижележащим протоколом локальной сети 7 (в этом контексте локальной сетью может считаться небольшая сеть в одном здании или распределенная сеть типа ARPANET).

2.2. Модель работы протокола

Модель передачи дейтаграмм от одной прикладной программы к другой можно проиллюстрировать описанным ниже сценарием.

Будем предполагать, что передача включает лишь один промежуточный шлюз.

Передающая программа готовит свои данные и вызывает локальный модуль IP для передачи этих данных как дейтаграммы, указывая адрес получателя и другие параметры в качестве аргументов.

Модуль IP готовит заголовок дейтаграммы и присоединяет к нему данные. После этого модуль IP определяет локальный сетевой адрес для указанного получателя (в данном случае это адрес шлюза).

Модуль передает дейтаграмму и локальный адрес локальному сетевому интерфейсу 8 .

Интерфейс канального уровня создает заголовок и присоединяет к нему дейтаграмму IP, после чего пакет передается в локальную сеть.

Дейтаграмма приходит на хост-шлюз в кадре канального уровня. Интерфейс канального уровня удаляет заголовок канального уровня и передает дейтаграмму модулю IP, который определяет по адресу IP, что дейтаграмму следует переслать хосту другой сети. Тогда модуль IP определяет адрес канального уровня для пересылки дейтаграммы получателю и вызывает интерфейс канального уровня той сети, куда будет передаваться дейтаграмма.

Интерфейс канального уровня создает заголовок и, добавив к нему дейтаграмму, передает пакет хосту-адресату.

На хосте получателя дейтаграмма выделяется из пакета интерфейсом канального уровня и передается модулю IP.

Модуль IP определяет по заголовку, что дейтаграмма адресована приложению на данном хосте и передает программе данные из дейтаграммы вместе с адресом отправителя и другими параметрами в ответ на системный вызов.

Рисунок 2. Путь передачи данных.


2.3. Функциональное описание

Задачей протокола IP является перемещение дейтаграмм через множество соединенных между собою сетей. Эта задача решается путем передачи дейтаграмм от одного модуля IP к другому, пока дейтаграмма не будет доставлена адресату. Модули IP размещаются на хостах и шлюзах (маршрутизаторах) Internet. Дейтаграммы маршрутизируются от одного модуля IP к другому через промежуточные сети на основе интерпретации адресов IP. Таким образом, одним из важнейших механизмов IP является адресация.

Адресация

Следует различать имена, адреса и маршруты [4]. Имя указывает объект, адрес показывает местонахождение объекта, а маршрут говорит, как до него добраться. Протокол IP имеет дело преимущественно с адресами. Отображение адресов на имена и обратно (преобразование) является задачей протоколов более высоких уровней (т. е., транспортного и сеансового 9 ). Модуль IP преобразует адреса IP в адреса локальной сети. Отображение адресов локальной сети на маршруты является задачей процедур нижележащего уровня (т. е.. локальной сети или шлюзов) 10 .

Адреса IP имеют фиксированную длину – 4 октета (32 бита). Адрес начинается с номера сети, за которым следует локальный адрес 11 (его называют полем rest – остаток). Существует три класса адресов IP – класс A, в котором старший бит имеет значение 0, остальные 7 битов старшего октета задают номер сети, а 24 младших бита – номер хоста, класс B, в котором два старших бита имеют значения 10, следующие 14 битов определяют номер сети, а последние 16 битов – номер хоста и класс C, в котором три старших бита имеют значения 110, следующие 21 – образуют номер сети, а последние 8 битов определяют номер хоста 12 .

Следует с осторожностью относиться к преобразованию адресов IP в адреса локальной сети, поскольку один физический хост может функционировать как несколько различных хостов, использующих разные адреса IP. Некоторые хосты могут использовать множество физических интерфейсов (многодомные хосты – multi-homing).

Таким образом, следует обеспечить возможность присутствия на хосте множества физических интерфейсов в сеть, каждый из которых может иметь несколько логических адресов IP.

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

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

Допускается использование невидимой для модуля IP фрагментации 13 , передачи и сборки дейтаграмм в локальной сети [6].

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

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

Эту процедуру легко обобщить на случай разбиения дейтаграммы на n фрагментов, где n > 2.

Рисунок 3. Протоколы шлюзов.

Для сборки фрагментов дейтаграммы модуль IP (например, на хосте адресата) объединяет дейтаграммы IP с совпадающими значениями полей идентификации, адресов отправителя и получателя, а также протокола. Объединение осуществляется путем размещения данных из каждой дейтаграммы в позицию буфера, указанную полем смещения фрагмента в заголовке IP. Первый фрагмент будет иметь нулевое смещение, а для последнего фрагмента флаг more-fragments будет иметь нулевое значение.

2.4. Шлюзы

Шлюзы 16 выполняют пересылку дейтаграмм IP между сетями, обеспечивая также поддержку протокола GGP 17 [7] для обмена данными маршрутизации и другой управляющей информацией.

В шлюзах реализация протоколов вышележащих уровней не обязательна и функции GGP могут быть реализованы в модуле IP.

3. Спецификация

3.1. Формат заголовка

Рисунок 4. Формат заголовка дейтаграммы IP.


Формат з аголовка дейтаграмм IP показан на рисунке 4.

Version – 4 бита

Указывает номер версии протокола и определяет формат заголовка. Данная спецификация описывает версию 4 18 .

IHL 19 – 4 бита

Это поле содержит размер заголовка IP в 32-битовых словах и указывает начало данных в пакете. Отметим, что минимальное значение этого поля для корректного заголовка составляет 5.

ToS 20 – 8 битов

Поле ToS 21 обеспечивает индикацию абстрактных параметров желаемого качества обслуживания. Это значение используется при выборе реальных параметров обслуживания в процессе передачи дейтаграммы через отдельную сеть. Некоторые сети предлагают приоритетный сервис, который тем или иным способом трактует трафик с большим уровнем предпочтения как более важный, нежели трафик другого типа (обычно при высокой загрузке просто воспринимается только трафик с уровнем предпочтения выше некоторого порога). Основной выбор осуществляется между тремя вариантами – малая задержка, высокая надежность, высокая пропускная способность.

биты 0-2: предпочтения.

бит 3: 0 = обычная задержка, 1 = малая задержка.

бит 4: 0 = обычная пропускная способность, 1 = высокая пропускная способность.

бит 5: 0 = обычная надежность, 1 = высокая надежность.

Биты 6-7: зарезервированы для использования в будущем.

111 – управление сетью

110 – межсетевое управление

Использование флагов Delay (D), Throughput (T), Reliability 22 (R) может увеличивать стоимость обслуживания (в том или ином смысле). Во многих сетях предпочтение по одному из этих параметров может быть связано с потерями по другому. За исключением специальных случаев следует использовать не более двух флагов из трех возможных.

Значение ToS служит для задания способа обработки дейтаграмм в процессе их передачи через internet. Например, отображение значений ToS на реальные параметры обслуживания в сетях AUTODIN II, ARPANET, SATNET, PRNET описано в работе Service Mappings [8].

Уровень предпочтения Network Control (управление сетью) означает, что дейтаграмма предназначена для использования внутри сети. Реальная трактовка этого обозначения определяется местными условиями сети. Значение Internetwork Control (межсетевое управление) показывает дейтаграммы, предназначенные только для управления шлюзами. Если та или иная сеть использует значение уровня предпочтения, она берет на себя ответственность за доступ к этому полю и его использование.

Total Length – 16 битов

Это поле указывает общий размер (в октетах) дейтаграммы с учетом заголовка и данных. Размер этого поля позволяет создавать дейтаграммы размером до 65 535 октетов. Столь большие дейтаграммы неприемлемы для большинства хостов и сетей. Все хосты должны быть готовы к восприятию дейтаграмм размером до 576 октетов (целиком или в виде фрагментов). Хостам рекомендуется передавать дейтаграммы, размер которых превышает 576 октетов, только в тех случаях, когда есть уверенность, что адресат может принимать такие дейтаграммы.

Значение 576 выбрано для того, чтобы дейтаграммы могли кроме заголовка содержать блок данных разумного размера. Например, такой размер позволяет передавать блок данных в 512 октетов с 64-октетным заголовком. Максимальный размер заголовка IP составляет 60 октетов, а размер типичного заголовка IP – 20 октетов, что оставляет достаточно места для заголовков вышележащих уровней.

Identification – 16 битов

Значение поля идентификации присваивается отправителем для обеспечения корректной сборки фрагментов дейтаграммы.

Читайте также: