2010-06-02 97 views
5

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

我已经写了CQS feedreference page)的自定义解剖。我们的服务器在收到此馈送时存在空白。根据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写

(另见A companion post on serverfault.com

回答

4

你应该记住,Wireshark的解剖确实多次信息的功能参数之一。首次在加载文件时按严格的顺序对数据包进行分割。然后,当您滚动packet_tree_view或选择一个数据包来构建它的树时,它会调用解析器。

您可以检查是否有剥离被称为FOT疗法第一次:

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

你应该剥离行为不同的第一和下一个夹层。

在第一夹层你要存储每个数据包的一些信息(例如哈希表),因为它的序列号,如果它出了故障。第二次调用时,您将需要它来正确构建数据包树。

+0

我很久没有碰过这个,但我怀疑这是答案。我没有意识到包被解剖了两次。 – 2012-10-30 11:43:18

0

我却不知道,如果你能窥视到前面或后面的帧,但是当Wireshark是加载tcpdump的,它会调用你的解剖器在每个帧上依次排列。因此,我可以添加一个静态本地变量,它是一个数组或散列表,并将您的值存储在那里。然后你的解剖器可以检查该阵列的前一帧和后一帧,并进行分析。

你应该看看这个PINFO vairable,这是对有关帧号,IP信息等