Wireshark Dissector: Как определить недостающие кадры UDP? - PullRequest
6 голосов
/ 03 июня 2010

Как определить недостающие кадры UDP в пользовательском анализаторе Wireshark?

Я написал специальный диссектор для CQS-фида ( справочная страница ). Один из наших серверов пропускает при получении этого канала. Согласно Wireshark, некоторые кадры UDP никогда не принимаются. Я знаю, что кадры были отправлены, потому что все остальные наши серверы свободны от пробелов.

Кадр CQS состоит из нескольких сообщений, каждое из которых имеет свой порядковый номер. Мой пользовательский анализатор предоставляет в Wireshark следующие данные:

cqs.frame_gaps          - the number of gaps within a UDP frame (always zero)
cqs.frame_first_seq     - the first sequence number in a UDP frame
cqs.frame_expected_seq  - the first sequence number expected in the next UDP frame
cqs.frame_msg_count     - the number of messages in this UDP frame

И я отображаю каждое из этих значений в пользовательских столбцах, как показано на этом снимке экрана: снимок экрана wireshark http://img692.imageshack.us/img692/9484/wiresharkcqs.jpg

Я попытался добавить в диссектор код, который просто сохраняет последний обработанный порядковый номер (как локальный статический элемент) и помечает пробелы, когда диссектор обрабатывает кадр, где current_sequence != (previous_sequence + 1). Это не сработало, потому что диссектор можно вызывать в порядке произвольного доступа, в зависимости от того, где вы щелкнули в графическом интерфейсе. Таким образом, вы можете обработать кадр 10, затем кадр 15, затем кадр 11 и т. Д.

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

В диссекторе написано на C.

(см. Также сопутствующее сообщение на serverfault.com )

Ответы [ 2 ]

4 голосов
/ 30 октября 2012

Вы должны иметь в виду, что Wireshark выполняет вскрытие несколько раз. Первый раз он разбирает пакеты в строгом порядке при загрузке файла. Затем он вызывает диссекторы, когда вы прокручиваете packet_tree_view или выбираете пакет для построения его дерева.

Вы можете проверить, называется ли диссектор впервые:

 if (PINFO_IS_VISITED(pinfo)) { ... };

Ваш диссектор должен вести себя по-разному для первого и для следующего вскрытия.

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

0 голосов
/ 06 июня 2010

Не знаю, можете ли вы заглянуть в предыдущие или последующие кадры, но когда Wireshark загружает tcpdump, он будет вызывать ваш диссектор в каждом из кадров по порядку. Поэтому я мог бы добавить статическую локальную переменную , которая является массивом или хеш-таблицей, и просто хранить там свои значения. Затем ваш анализатор может проверить этот массив на наличие предыдущих и последующих кадров и выполнить его анализ.

Вы должны посмотреть на это pinfo vairable, это один из аргументов функции для получения информации о номере кадра, информации IP и т. Д.

...