Wireshark Dissector: как определить отсутствующие кадры UDP?

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

Я написал пользовательский диссектор для CQS feed (ссылка на страницу). Один из наших серверов разрывается при получении этой ленты. Согласно 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). Это не сработало, потому что диссектор может вызываться в произвольном порядке, в зависимости от того, где вы нажимаете в GUI. Таким образом, вы можете обработать кадр 10, затем кадр 15, затем кадр 11 и т. д.

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

в прозектор написано в с.

(см. Также компаньон пост serverfault.com)

2 ответов


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

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

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

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

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


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

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