Передача данных во встраиваемых системах. Использование протоколов TCP/IP для взаимодействия устройств
В работе рассмотрены основы передачи данных с использованием стека TCP/IP и сокетов в Python для взаимодействия устройств, находящихся в одной сети
Теоретическая часть
Протоколы передачи данных TCP/IP:
Стек протоколов TCP/IP (Transmission Control Protocol/Internet Protocol, протокол управления передачей/протокол интернета) — набор протоколов, описывающий процесс передачи цифровых данных. Стек назван по двум главным протоколам, на основе которых построены современные системы передачи данных. Помимо этого, существует одноименная модель, позволяющая разделить множество протоколов и технологий на логические уровни.
Транспортный уровень (transport layer)
Для разработчика программной составляющей цифровых платформ наиболее близок именно транспортный уровень. На этом уровне разработчик взаимодействует с сокетами. Под сокетами понимают совокупность IP-адреса и порта. Не смотря на то, что IP-адрес не используется на транспортном уровне (он объявляется на сетевом и является основной адресацией в глобальных/локальных сетях), он является неотъемлемой частью сокета Постоянные резиденты транспортного уровня — протоколы TCP и UDP, они занимаются доставкой информации.
TCP (протокол управления передачей) — надежный, он обеспечивает передачу информации, проверяя дошла ли она, насколько полным является объем полученной информации и т.д. TCP дает возможность двум конечным устройствам производить обмен пакетами через предварительно установленное соединение. Он предоставляет услугу для приложений, повторно запрашивает потерянную информацию, устраняет дублирующие пакеты, регулируя загруженность сети. TCP гарантирует получение и сборку информации у адресата в правильном порядке.
UDP (протокол пользовательских датаграмм) — ненадежный, он занимается передачей автономных датаграмм. UDP не гарантирует, что всех датаграммы дойдут до получателя. Датаграммы уже содержат всю необходимую информацию, чтобы дойти до получателя, но они все равно могут быть потеряны или доставлены в порядке отличном от порядка при отправлении.
Протоколы транспортного уровня не интерпретируют информацию, полученную с верхнего или нижних уровней, они служат только как канал передачи.
Зачем нужен порт и что означает термин «сокет»
Приложения прикладного уровня общаются с предыдущим, транспортным, но не имеют представления о том, как он работает. Для приема-передачи информации они могут работать с TCP или UDP, но для них это совершенно не важно, потому что приложения прикладного уровня используют только полученные в результате IP и порт.
Как говорилось ранее, IP-адрес присваивается каждому конечному устройству на сетевом уровне. Но обмен данными происходит не между конечными устройствами, а между приложениями, установленными на них. Чтобы получить доступ к тому или иному сетевому приложению недостаточно только IP-адреса, поэтому для идентификации приложений применяют также порты. Порт - число в диапазоне от 0 до 65535, записываемое в заголовок TCP/UDP сегмента, соответствующее используемому на компьютере сервису или приложению, от которого/к которому приходит информация. Комбинация IP-адреса и порта называется сокетом, или гнездом (socket).
Декапсуляция и инкапсуляция
Для обеспечения корректной работы протоколов различных уровней в сетевых моделях используется специальный метод — инкапсуляция. Суть этого метода заключается в добавлении данных протокола текущего уровня к данным, полученным от протокола вышестоящего уровня. Процесс, обратный описанному, называется декапсуляцией. Это позволяет программам и драйверам, отвечающим за реализацию каждого сетевого уровня, оперировать только нужным набором данных для данного уровня, не затрагивая другие.

На каждом этапе, подобно снежному кому, к уже имеющейся информации добавляется служебная информация, например, порт на прикладном уровне, необходимый для идентификации сетевого приложения. Добавление служебной информации к основной обеспечивают разные протоколы — сначала Ethernet, поверх него IP, еще выше TCP, над ним порт, означающий приложение с делегированным ему протоколом.
Программа для захвата трафика Wireshark
Программный продукт Wireshark перехватывает входящие и исходящие TCP-пакеты. И благодаря встроенным функциям мониторит содержимое, ищет ошибки. Заметно упрощает использование программы система фильтров, а также простой и логичный графический интерфейс. Данная программа работает под любой системой (Linux, Windows, macOS) и распространяется бесплатно под лицензией GNU GPL v2.
Сетевой трафик преобразуется буквально «на лету». В программу «заложена» структура различных протоколов, поэтому пользователь работает с перехватываемым информационным потоком.
Востребованные функции сетевого анализатора Wireshark: 1. Захват пакетов в реальном времени или при чтении из файла. 2. Поддержка проводного интерфейса Ethernet, беспроводных IEEE 802.11, PPP и локальных виртуальных интерфейсов. 3. Отсеивание сетевых пакетов по большому количеству установленных фильтров, включая расшифровку только VoIP-звонков, HTTPS-трафика. 4. Подсвечивание разных протоколов при смешанном трафике, выделение TCP, HTTP, FTP, DNS, ICMP и т.д. 5. Расшифровка WEP-, WPA-трафика беспроводных сетей при наличии ключа безопасности и Handshake.

Пункты меню: 1. Файл – содержит команды для открытия, сохранения, импорта/экспорта дампов данных. 2. Редактирование – изменение общих параметров программы, включая интерфейс. 3. Просмотр – настройка отображения отдельных блоков, масштаб, цветовое выделение. 4. Запуск – подсказка по управлению работой программы при помощи клавиш. 5. Захват – старт, остановка, перезапуск сниффинга трафика указанной сети. 6. Анализ – система фильтров протоколов, декодирование, проверка содержимого. 7. Статистика – отчеты по перехваченному трафику, детально по каждому протоколу. 8. Телефония – отдельный блок функциональных модулей для расшифровки IP-телефонии.
Основные приемы: 1. Поиск по пакетам. Открывается панель поиска стандартной комбинацией клавиш Ctrl+F. После активации режима доступно несколько вариантов поиска. Наиболее востребованный режим «Дисплейный фильтр», он предназначен для обнаружения пакетов, отвечающих заданному выражению. Второй интересный вариант – «Строка». 2. Отметка пакетов. Все интересующие нас пакеты помечаются цветовым выделением с помощью комбинации кнопок Ctrl+M (или через пункт выпадающего меню после нажатия правой кнопки мыши «Выполнить/Отменить пометку пакета»). Перемещение между ними работает комбинациями Shift+Ctrl+N (следующий) и Shift+Ctrl+B (предыдущий). 3. Фильтры. Задают критерии исключения и включения в анализируемую подборку пакетов. Чем больше анализируемый дамп, тем детальнее фильтруется информация. Это упрощает работу с потоком данных и снижает риски механических ошибок пользователя.
Утилита netcat
Команда nc (netcat) служит для передачи и получения данных посредством протоколов TCP и UDP. Она не может похвастать большим набором функций, но при этом её достаточно для того, чтобы проверить соединение и провести несложную отладку.
Общий вид команды nc:
nc -параметры адрес порт(ы)
Часть параметров указывается с уточняющими значениями, а часть без них. Вот список наиболее востребованных параметров: - -6 – использовать протокол IPv6. По умолчанию используется параметр -4 и IPv4 соответственно; - -h – вывести справку со списком доступных параметров; - -l – режим прослушивания. Используется с указанием порта; - -n – Работать с IP-адресами напрямую, не задействуя DNS, также отключить поиск портов; - -p порт – указать номер порта. В большинстве случаев порт считывается без указания параметра; - -u – использовать протокол UDP, по умолчанию используется TСP; - -w таймер – включить таймер для ограничения времени соединения. Задаётся в секундах.
Проверка портов – это одно из основных применений команды nc. Для этого достаточно использовать два параметра -vz, указать адрес и порт. Помимо этого, вы можете указать диапазон адресов. В примере проверим порты адреса локальной сети:
nc -vz 192.168.31.247 8080
Для того, чтобы прослушивать порт используйте параметр -l. В общем случае этого достаточно, но можете включить подробный режим:
nc -nlv 8080
Ещё одной полезной функцией команды nc является обмен данными. Давайте рассмотрим простейший пример – текстовый чат. Для того, чтобы запустить чат на одном компьютере запускаем утилиту в режиме прослушивания порта:
nc -lp 8080
На другом компьютере потребуется указать адрес первого компьютера и тот же самый порт:
nc 0.0.0.0 8080
Netcat – это довольно старая программа, однако из-за малого размера и предоставляемой возможности обмена данными по сети её можно встретить на любом устройстве с Linux - от роутера до сервера. Если же говорить именно о сканировании сети, то nmap имеет гораздо больше функций. Зато с помощью nc можно организовать простейший обмен сообщениями типа клиент-сервер.
Практическая часть
Шаг 1 : Начальная конфигурация проекта
Откройте программу GNS3 (на компьютерах в аудитории 4334 он уже установлен, при его отсутствии, обратитесь к ассистенту или преподавателю), и создайте новый проект. (При использовании собстенных ПК нужно доустановить GNS3, а также настроить его для использования 'Remote server', который расположен в сети МИЭТ с адресом 172.17.9.78:3080. Также доступен через MIET OpenVPN)
Добавьте в область топологии сети устройства NAT, Jupyter2.7, Webterm, Ethernet switch и подключите между собой сетевым кабелем согласно рисунку ниже:
(Если таких устройств нет - установите их используя .gns3a файлы, доступно на сайте gns3. Пример: первая ссылка поиска по запросу "gns3 jupyter 2.7" приведет на сайт https://www.gns3.com/marketplace/appliances/webterm , где доступно скачивание этого файла, инструкция по установке также на этой странице)

Шаг 2: Настройка устройств
- По умолчанию, в
dockerконтейнерах отсутствует присвоение IP-адреса после старта устройства. Для возможности передачи данных через моделируемый сегмент сети необходимо включить технологию динамической конфигурации сетевых интерфейсов на устройствах Jupyter и Webterm (пункты аналогичны для обоих устройств) - Нажмите ПКМ на устройстве и выберите опцию
Configure - В открывшемся окне в разделе
Network configurationвыберитеEdit - Раскоментируйте строки, следующие после
#DHCP config for eth0

- Повторите шаги 2-4 для оставшихся устройств
- Запустите все устройства, нажав кнопку
Примечание: Начиная с GNS3 2.0, стал доступен узел
NAT. Этот узел позволяет подключать топологию к Интернету через NAT. Ваша топология не будет напрямую доступна из Интернета или локальной сети при использовании узлаNAT. Лучшим решением будет использовать узелCloud.
По умолчанию на узле NAT работает DHCP-сервер с предопределенным пулом в диапазоне 192.168.122.0/24. Он находится в категории Конечные устройства:
Вы не ограничены только использованием динамического назначения адресов с узлом NAT. Вы также можете статически назначить ему IP-адрес и по-прежнему иметь доступ в Интернет.
Если используете
Cloud, то устройства будут получать адреса формата172.16.121.xxx, к ним можно подключаться непосредственно с компьютеров аудитории 4334. Для этого в браузере (работает только с Jupyter2.7) необходимо ввести его ip адрес и порт (указаны в окнеSummaryв правом верхнем углу GNS3)
Убедитесь что ваши устройства получили IP-адреса. Для этого в webterm необходимо нажать кнопку, расположение которой совпадает с кнопкой Пуск в Windows, далее Terminal. В открывшемся окне выполните команду ifconfig. IP адрес должен быть указан в разделе eth0. Пример представлен ниже на рисунке.
Для Jupyter2.7 проверка производится непосредстенно в
ноутбуке Jupyter, для этого в одной из строк выполните!ip address
При вводе URL-адреса в адресной строке Firefox откроется веб-сайт:

Шаг 3: Передача данных через утилиту netcat
Нажмите ПКМ на соединении между одним из устройств Webterm и коммутатором, выберите пункт Start Capture

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

Как видно из рисунка, Wireshark уже начал захват пакетов, но пока в сети передаются только служебные сообщения от коммутатора, а именно, сообщения протокола STP, необходимого для устранения петлевых соединений между коммутаторами.
Перейдите в консоль Webterm-1, по умолчанию, откроется графическое окно с интерфейсом веб-бразера, но снизу вы можете заметить кнопку-аналог меню «Пуск» для ОС Windows; нажмите на нее и выберите Terminal. Выполните команду ip address или ifconfig для того, чтобы вывести на экран текущие параметры сетевого адреса устройства. Проделайте это действие для другого устройства webterm и запишите их адреса.
По умолчанию в используемых контейнерах отсутствует утилита netcat и nc. Установить ее можно выполнив в терминале команду apt update && apt install netcat-traditional –y
После установки пакета netcat выполните в терминале webterm-1 команду nc -l -p 20000 Это запустит утилиту nc в пассивном режиме (флаг -l), указав для прослушивания номер порта более 20000. Теперь этот контейнер выполняет функцию сервера и прослушивает входящие соединения на порт 20000 любого из подключенных к нему сетевых интерфейсов, в том числе виртуальных.
В терминале webterm-2 повторите установку пакета netcat и выполните команду nc IP - address 20000, где IP-address– сетевой адрес контейнера webterm-1.
После установления соединения, текст, набранный в терминале webterm-2, по нажатию клавиши Enter будет пересылаться на webterm-1 и отображаться в терминальном окне. Убедиться в этом, передав по установленному соединению несколько произвольных осмысленных фраз. После этого завершить соединение, нажав комбинацию Ctrl + C.
Остановите захват пакетов в анализаторе протоколов
Wireshark. Приведите в отчете информацию о захваченных Wireshark пакетах, какие команды установления соединения использовались при передачи данных?
С помощью команды netcat можно передать часть текстового файла или произвольное сообщение, одно из наиболее применяемых решений комбинирования команд выглядит следующим образом:
echo “message” | netcat –t ip-address port
, где в качестве аргументов подставляются сетевой адрес и порт устройства-сервера (например: echo “hello” | netcat –t 192.168.122.12 20000)
Передача данных между устройствами Jupyter2.7
- Откройте в веб-браузере новую страницу и перейдите по адресу, соответствующему устройству Jupyter2,7-1 в окне Topology Summary (например:
http://95.143.222.94:5018) - Нажмите кнопку
Newдля добавления нового файла и выберите тип файлаPython2 - Для передачи данных в
jupyterна этом этапе работ будем использовать ту же утилитуnetcat, но поскольку в указанном контейнере отсутствует возможность напрямую взаимодействовать с командной строкой Linux, то необходимо импортировать библиотеку, отвечающую за выполнение системных вызовов:
import os

- Jupyter может передавать команды в консоль прямо из графического веб интерфейса, для этого нужно использовать служебный символ «!» перед командой. Обновим список репозиториев выполнив команду
!apt update

- Установите пакет
netcatвыполнив команду!apt install netcat, обратите внимание, что если вывод команды соответствует изображению ниже, то утилита уже установлена

- Узнайте IP-адрес устройства, выполнив команду
!ip address

- Выполните передачу данных используя системный вызов os.system, эта команда передает аргумент в консоль, выполняет эту команду и возвращает код ее завершения:
os.system(“echo ‘message’ | netcat –t 192.168.122.11 20000”)

- В случае успешного выполнения команды вы увидите значение 0 в выводе, 256 в случае отклонения пакета сервером (например, сервер не запущен), и значение 32768 при ошибке выполнения из-за неинициализированной переменной (Код завершения команды будет напечатан только после закрытия соединения, то есть закрытия команды nc на части «сервера» нажатием
Сtrl+C, до этого команда будет бесконечно отправляться)

- Используя системные вызовы и оператор «!» напишите команду, отправляющую на «сервер» текущее время и дату вместе с информацией о системе (
uname –a) (Опционально. Уточните у ассистента или преподавателя перед выполнением) - Выполните захват пакета из п.11 в утилите
Wireshark(Если Wireshark работает и не выдает ошибок) и прикрепите к отчету снимок экрана, подтверждающий захват этого пакета
По окончании нажмите кнопку
и закройте GNS3. При использовании локального сервера, GNS3 VM закроется автоматически
Вопросы: 1. Какой функционал предоставляет функция os.system()? 2. Почему возникает ошибка передачи при выполнении команды netcat с аргументом –t при попытке передать данные без запущенного «сервера»?
