如何在自定义Wireshark解剖器中识别丢失的UDP帧?
我为CQS feed(reference 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语言编写的。
答案 0 :(得分:4)
你应该记住,Wireshark多次进行解剖。第一次在加载文件时以严格的顺序分析数据包。然后,当您滚动packet_tree_view或选择一个数据包来构建它的树时,它会调用dissector。
您可以检查是否第一次调用解剖器:
if (PINFO_IS_VISITED(pinfo)) { ... };
您的解剖器在第一次和下次解剖时的行为应该不同。
在第一次解剖时,您必须为每个数据包(例如在哈希表中)存储一些信息,因为它的序列号是否有故障。第二次调用时,您需要它才能正确构建数据包树。
答案 1 :(得分:0)
如果您可以查看之前或之后的帧,我不知道,但是当Wireshark加载tcpdump时,它将按顺序调用每个帧上的解剖器。所以我可以添加一个静态本地变量,它是一个数组或哈希表,只需将值存储在那里。然后你的解剖器可以检查该阵列的前一帧和后一帧并进行分析。
您应该查看 pinfo vairable,这是有关帧编号,IP信息等信息的函数参数之一。