6

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

我已经为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

我在自定义列中显示这些值中的每一个,如此屏幕截图所示:线鲨截图

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

我的解剖器有什么方法可以知道它之前的帧(或后面的帧)是否丢失?

解剖器是用 C 编写的。

(另请参阅serverfault.com 上的配套帖子

4

2 回答 2

4

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

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

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

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

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

于 2012-10-30T07:41:06.060 回答
0

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

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

于 2010-06-06T02:13:02.580 回答