Wireshark Dissector:如何识别丢失的UDP帧?

Joh*_*ing 6 c networking wireshark wireshark-dissector

如何在自定义Wireshark解剖器中识别丢失的UDP帧?

我为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
Run Code Online (Sandbox Code Playgroud)

我在自定义列中显示每个值,如此屏幕截图所示:wireshark screenshot http://img692.imageshack.us/img692/9484/wiresharkcqs.jpg

我尝试将代码添加到我的解剖器中,只需保存最后处理的序列号(作为本地静态),并在解剖器处理帧时标记间隙current_sequence != (previous_sequence + 1).这不起作用,因为可以按随机访问顺序调用解剖器,具体取决于您在GUI中单击的位置.所以你可以处理第10帧,然后是第15帧,然后第11帧,等等.

有没有办法让我的解剖器知道它前面的框架(或后面的框架)是否缺失?

解剖器用C语言编写.

(另请参阅serverfault.com上配套文章)

gra*_*ite 4

您应该记住,Wireshark 会进行多次解剖。当您加载文件时,它第一次按照严格的顺序解析数据包。然后,当您滚动 packet_tree_view 或选择一个数据包来构建其树时,它会调用解析器。

您可以检查是否第一次调用解析器:

 if (PINFO_IS_VISITED(pinfo)) { ... };
Run Code Online (Sandbox Code Playgroud)

您的解剖器在第一次和下一次解剖时应该有不同的行为。

第一次剖析时,您必须为每个数据包存储一些信息(例如在哈希表中),因为它是序列号以及是否乱序。当您第二次被调用时,您将需要它来正确构建数据包树。