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

Как определить недостающие кадры 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

И я отображаю каждое из этих значений в настраиваемых столбцах, как показано на этом снимке экрана: скриншот wirehark

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

Может ли мой диссектор узнать, отсутствует ли предыдущий кадр (или следующий за ним)?

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

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


person John Dibling    schedule 02.06.2010    source источник


Ответы (2)


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

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

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

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

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

person graphite    schedule 30.10.2012
comment
Я давно не касался этого, но подозреваю, что это ответ. Я не осознавал, что пакеты анализировались дважды. - person John Dibling; 30.10.2012

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

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

person doj    schedule 06.06.2010