Материал статьи взят с моего дзен-канала.   В прошлой статье мы собрали схему дистанционного управления из генератора и детектора тональных сигналов, связь между которыми осуществлялась с помощью RTP-потока.  В этой статье мы продолжаем изучать передачу звукового сигнала с помощью RTP-протокола. Сначала разделим наше тестовое приложение на передатчик и приемник и научимся исследовать RTP-поток с помощью анализатора сетевого трафика.  Итак, чтобы нам более ясно было видно какие элементы программы отвечают за передачу RTP, а какие за прием, мы разделяем наш файл mstest6.c на две самостоятельные программы передатчика и приемника, общие функции, которые используют и тот и другой мы вынесем в третий файл, который назовем mstest_common.c, он будет подключаться передатчиком и приемником с помощью директивы include: Теперь файл обособленного передатчика: И наконец, файл приемника: Компилируем, передатчик и приемник, затем запускаем каждый в своей консоли. Далее должно работать как прежде — только ввод чисел от 1 до 6 мы должны делать в консоли передатчика, а отклик на них должен появляться в консоли приемника. В динамике должны прослушиваться тоны. Если все так, то между приемником и передатчиком у нас установлена связь — происходит непрерывная передача RTP-пакетов от передатчика к приемнику.  Теперь самое время установить анализатор трафика, для этого мы установим консольную версию отличной программы Wireshark — она называется TShark. Я выбрал TShark для дальнейшего изложения для того, чтобы облегчить описание управления программой. С Wireshark мне бы потребовалось море скриншотов, которые могут быстро устареть с выпуском новой версии Wireshark. Если вы умеете пользоваться Wireshark, то можете его использовать для изучения наших примеров. Но и в этом случае я вам рекомендую освоить TShark, так как вам это поможет автоматизировать тестирование ваших VoIP приложений, а также выполнять захват удаленно . Устанавливаем TShark командой: Традиционно, проверяем результат установки запрашивая версию программы: Если получен адекватный ответ продолжаем далее. Поскольку наши пакеты ходят пока только внутри компьютера, мы можем сказать tshark показывать только такие пакеты. Для этого нужно выбрать захват пакетов с интерфейса loopback (обратная петля), передав TShark опцию -i lo: В консоль сразу начнут сыпаться сообщения о пакетах отправляемых нашим передатчиком (непрерывно, независимо от того, нажимали мы кнопку на пульте или нет). Возможно, на вашем компьютере есть программы которые тоже отправляют пакеты по локальной петле, в этом случае мы получим смесь наших и чужих пакетов. Чтобы быть уверенными, что в списке мы видим только пакеты отправленные нашим пультом, мы добавим фильтр по номеру порта. Нажатием Ctrl-C останавливаем анализатор и вводим фильтр на номер порта который использует на пульт как порт назначения для своей передачи (8010): -f "udp port 8010". Теперь наша командная строка будет выглядеть так: В консоли появиться вывод следующего вида (первые 10 строк):  Пока еще это не пакеты, а пронумерованный список событий, где каждая строка это сообщение об очередном пакете, который был замечен на интерфейсе. Поскольку, мы уже позаботились о фильтрации пакетов, то мы видим в листинге только сообщения о пакетах нашего передатчика. Далее расшифруем эту таблицу по номерам колонок: Номер события.
Время его возникновения.
IP-адрес источника пакета и IP-адрес приемника пакета.
Протокол пакета, показан как UDP, поскольку RTP-пакеты передаются как полезная нагрузка внутри UDP-пакетов.
Размер пакета в байтах.
Номер порта источника пакета и номер порта приемника пакета.
Размер полезной нагрузки пакета, отсюда можно сделать вывод, что наш передатчик формирует RTP-пакеты размером 172 байта, который, как утка в сундуке, находится внутри UDP-пакета размером 214 байт.
Теперь пришло время заглянуть внутрь UDP-пакетов, для этого мы запустим TShark с дополненным набором ключей: В результате, вывод программы обогатится — к каждому событию добавится расшифровка внутреннего содержимого пакета, который его вызвал. Чтобы лучше рассмотреть данные вывода вы можете либо остановить TShark нажатием Ctrl-C, либо продублировать его вывод в файл, добавив к команде запуска конвейер к программе tee с указанием имени файла, tee <имя_файла>: Теперь посмотрим на то, что мы получили в файле, вот первый пакет из него:  Следующую статью мы посвятим разбору информации, которая содержится в этом листинге и неизбежно поговорим о внутренней структуре RTP-пакета. Разработчик ПО для радиосвязи