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

时间:2010-06-02 21:57:28

标签: c networking wireshark wireshark-dissector

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

我为CQS feedreference page)编写了自定义解剖器。收到此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 screenshot http://img692.imageshack.us/img692/9484/wiresharkcqs.jpg

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

我的解剖器有没有办法知道它前面的帧(或后面的帧)是否丢失了?

解剖器是用C语言编写的。

(另见companion post on serverfault.com

2 个答案:

答案 0 :(得分:4)

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

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

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

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

在第一次解剖时,您必须为每个数据包(例如在哈希表中)存储一些信息,因为它的序列号是否有故障。第二次调用时,您需要它才能正确构建数据包树。

答案 1 :(得分:0)

如果您可以查看之前或之后的帧,我不知道,但是当Wireshark加载tcpdump时,它将按顺序调用每个帧上的解剖器。所以我可以添加一个静态本地变量,它是一个数组或哈希表,只需将值存储在那里。然后你的解剖器可以检查该阵列的前一帧和后一帧并进行分析。

您应该查看 pinfo vairable,这是有关帧编号,IP信息等信息的函数参数之一。