代码之家  ›  专栏  ›  技术社区  ›  John Dibling

Wireshark剖析器:如何识别缺失的UDP帧?

  •  6
  • John Dibling  · 技术社区  · 14 年前

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

    我已经为 CQS feed ( reference 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写的。

    (参见 companion post on serverfault.com )

    2 回复  |  直到 12 年前
        1
  •  4
  •   graphite    12 年前

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

    您可以第一次检查解剖器是否被称为FOT,或者:

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

    在第一次和下一次解剖中,解剖者的行为应该不同。

    首先,您必须为每个数据包(例如哈希表)存储一些信息,因为它是序列号,如果顺序不对。当第二次被调用时,您需要它来正确地构建数据包树。

        2
  •  0
  •   doj    14 年前

    我不知道你是否能窥视前一帧或后一帧,但当wireshark加载tcpdump时,它会按顺序调用每个帧上的解剖器。所以我可以添加一个 静态局部 变量,它是一个数组或哈希表,只需将值存储在其中。然后解剖器可以检查该数组的前一帧和后一帧,并进行分析。

    你应该看看那个 丁腈橡胶 可用,这是有关帧号、IP信息等信息的函数参数之一。

    推荐文章