【问题标题】:Wireshark Dissector: How to Identify Missing UDP Frames?Wireshark Dissector:如何识别丢失的 UDP 帧?
【发布时间】:2019-07-28 23:06:44
【问题描述】:

如何识别自定义 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

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

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

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

解析器是用 C 编写的。

(另见companion post on serverfault.com

【问题讨论】:

    标签: c networking wireshark wireshark-dissector


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 好久没碰这个了,不过我怀疑这就是答案。我没有意识到数据包被解剖了两次。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      相关资源
      最近更新 更多