Как извлечь определенные поля пакета RTP из захвата Wireshark?

У меня есть файл PCAPNG, и мне нужно получить пакеты RTP от него. В частности, один из моих пакетов RTP выглядит так...

Кадр N: X байтов на проводе...

  • Ethernet II, Src:...
  • IPv4, Src:...
  • TCP, Src порт: RSTP...
  • RTSP чередующийся кадр, канал: 0x02, 163 байта
  • Транспортный протокол в реальном времени

... и что мне нужно от каждого пакета...

  1. Канал с чередованным кадром RTSP
  2. Длина от перемеженного кадра RTSP
  3. Полезная нагрузка от RTP

... используя эти данные, я воссоздаю аудио и видео файл, чтобы восстановить полное видео из локальной полезной нагрузки (воспроизведение не потоковое).

Я могу успешно получить пакеты RTP, используя либо...

tshark -r my.pcap -R -T поля -e rtp.payload -w rtp.out

или же...

tshark -r my.pcap -R -T поля -e rtp.payload> rtp.out

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

Второй метод предоставит только полезную нагрузку RTP без необходимых мне чередующихся свойств (он будет производить гекс с двоеточием между байтами, но это легко обрабатывается). Даже если бы я мог сделать еще один вызов, чтобы получить все свойства чередующегося кадра RTSP, мне нужно объединить 2 выхода, идентифицируя каждый пакет с помощью разделителя / разделителя, которого я хотел бы избежать (я не смог получить tshark сделать это либо...).

Я заглянул в фильтры чтения tshark, которые, похоже, должны были делать то, что мне нужно, но до сих пор я не смог понять это. Обратите внимание, что я делаю это только для создания образцов данных и записи логики, которая форматирует данные, необходимые для воспроизведения. В конце концов, один из моих коллег изменит потоковый клиент для сбора данных в соответствующем формате (так что я могу просто запустить данные через ffmpeg, не изменяя его). Любые идеи о том, как я могу создать нужный мне формат?

2 ответа

Решение

у меня проблема в том, что первый метод сохранит все, что мне нужно, но по какой-то причине он добавит дополнительные данные (то есть, больше, чем просто полезную нагрузку RTP и содержимое кадра RTSP с чередованием) в странных местах

Первый способ:

tshark -r my.pcap -R -T fields -e rtp.payload -w rtp.out

должен напечатать ошибку, так как -R флаг определяет "фильтр чтения", и фильтр чтения должен идти после -R флаг и не должен начинаться с - (если что следует -R начинается с -, это интерпретируется как другой флаг), так что команда не определяет "фильтр чтения".

Если вы имели в виду, например,

tshark -r my.pcap -R rtp -T fields -e rtp.payload -w rtp.out

эта команда использует -w флаг, который указывает, что двоичный файл, содержащий необработанные данные пакета из my.pcapвозможно, как отфильтровано фильтром чтения, следует записать в файл, имя которого является аргументом -w флаг, так что команда означает "запись" в файл с именем rtp.outвсе пакеты RTP в my.pcap, а также написать rtp.payload поле каждого пакета на стандартный вывод ". К сожалению, в TShark есть ошибка, которая подавляет вывод rtp.payload поля к стандартному выводу; Я только что проверил исправление ошибки для этого.

Поэтому, если вы хотите, чтобы поля были записаны в файл, вы должны перенаправить стандартный вывод, чтобы ваш второй метод был верным.

Я посмотрел в фильтры чтения tshark, которые, кажется, должны быть в состоянии сделать то, что мне нужно

Нет. Фильтры чтения контролируют только то, какие пакеты TShark при чтении файла захвата не обрабатывает, а отбрасывает после их разбора.

Что бы вы хотели, были бы флаги

-e rtsp.channel -e rtsp.length

но, к сожалению, они поддерживаются только текущими версиями Wireshark для разработки 1.11.x, но не версиями 1.10.x или более ранними. Я не знаю, какой из релизов 1.11.x их поддерживает; ночные сборки поддержат их.

Вы можете попробовать сохранить полезную нагрузку RTP в формате rtpdump с помощью wireshark после установки инструментов rtp http://www.cs.columbia.edu/irt/software/rtptools

Это можно сделать из диалогового окна "Потоки RTP" (Телефония->RTP-> Показать все потоки), нажав кнопку "Сохранить как" в выбранном потоке.

Для получения дополнительной информации вы можете проверить http://wiki.wireshark.org/rtpdump

Другие вопросы по тегам