首页 > 解决方案 > 使用 libpcap 识别和解析分段数据包

问题描述

我闻了闻,libpcap得到了很多像这张照片一样的碎片数据包

图片

是否有任何简单的方法来识别碎片数据包(当我pcap_next_ex用 C 代码读取这个数据包并对该数据包进行碎片整理时?

标签: clinuxlibpcappacket-sniffers

解决方案


有没有简单的方法来识别碎片数据包

这取决于您如何定义“简单”。

您将需要解析链路层标头以确定数据包是否为 IPv4 数据包。如果它IPv4 数据包,您将需要解析IPv4 标头以查看是否 1)“标志”字段中设置了“更多片段”位或 2)“片段偏移”字段为非零。如果其中任何一个为真,则它是一个 IPv4 片段。

并用 C 代码对这个数据包进行碎片整理?

您将需要一个按 IPv4 源地址和目标地址以及“标识”字段值索引的表。

对于每个分段的 IPv4 数据包,查看该表以查看是否找到具有相同 IPv4 源地址和目标地址以及相同标识字段值的条目,作为分段数据包标头中的条目。

如果没有找到,请在表中添加一个条目,并将数据包的内容保存在该条目中。如果 Fragment Offset 值为 0,则保存整个 IPv4 标头以及数据包有效负载,以及它的 Fragment Offset 值、有效负载长度和更多片段标志(是的,这是多余的,因为您有完整的标头,但是您确实要求一种简单的方法:-));否则,只需保存有效负载及其片段偏移值、有效负载长度和更多片段标志。

如果确实找到它,那么如果 Fragment Offset 值为 0,则将 IPv4 标头添加到条目中。然后,不管 Fragment Offset 值如何,将数据包有效负载及其 Fragment Offset 值、有效负载长度和更多片段标志添加到保存的数据包有效负载信息中。这意味着该条目具有 IPv4 标头和一数据包有效负载/片段偏移值/有效负载长度/更多片段标志组合。

对于您添加的每个片段,在您添加之后,检查是否:

  • 如果您按片段偏移值对片段进行排序,则对于除最后一个片段之外的所有片段,片段偏移值加上该片段的有效负载长度等于下一个片段的片段偏移值;
  • 最后一个片段没有设置更多片段标志。

如果这是真的,您拥有所有片段,并且可以将它们重新组合成一个 IPv4 数据包,其标头是第一个片段(片段偏移值为 0 的那个)的已保存标头,其有效负载是所有有效负载的串联碎片。

(再次,您要求“简单”,因此我不讨论错误处理,例如重叠片段、未设置更多片段的多个片段等。)


推荐阅读