问题描述
我用libpcap
嗅着,得到了很多像这样的碎片包
是否有任何简单的方法来识别分段的数据包(当我用pcap_next_ex
读取此数据包并用C代码对该数据包进行碎片整理时?
解决方法
有什么简单的方法可以识别碎片包
这取决于您如何定义“简单”。
您将需要分析链路层头,以确定该数据包是否为IPv4数据包。如果它是IPv4数据包,则需要解析the IPv4 header,以查看是否1)“标记”字段中的“更多片段”位设置为2)还是“片段”偏移”字段为非零。如果其中任何一个为真,则为IPv4片段。
并使用C代码对该数据包进行碎片整理?
您将需要一个由IPv4源和目标地址以及“标识”字段值索引的表。
对于每个分段的IPv4数据包,请查看该表以查看是否找到与分段的数据包头中的条目具有相同的IPv4源地址和目标地址以及相同的标识字段值。
如果找不到它,则在表中添加一个条目,并将数据包的内容保存在该条目中。如果Fragment Offset值为0,则保存整个IPv4标头以及数据包有效载荷及其Fragment Offset值,有效载荷长度和More Fragments标志(是的,这是多余的,因为您拥有完整的标头,但是 did 要求一种简单的方法:-));否则,只需保存有效负载以及其“片段偏移”值,有效负载长度和“更多片段”标志。
如果要做找到它,那么,如果“片段偏移”值为0,则将IPv4标头添加到该条目。然后,无论“片段偏移”值如何,都将带有其“片段偏移”值,有效负载长度和“更多片段”标志的数据包净荷添加到已保存的数据包净荷信息中。这意味着该条目具有IPv4标头和数据包有效载荷/片段偏移值/有效载荷长度/更多片段标志组合的集。
对于添加的每个片段,在添加之后,请检查是否:
- 如果您按片段的Fragment Offset值对片段进行排序,那么除最后一个片段外的所有片段,Fragment Offset值加上该片段的有效载荷长度等于下一个片段的Fragment Offset值;
- 最后一个片段不是设置了“更多片段”标志。
如果是这样,则您拥有所有片段,然后可以将它们重新组合成一个IPv4数据包,其报头是第一个片段中保存的报头(片段偏移值为0的那个),其有效负载是所有碎片的有效载荷。
(再次,您要求“简单”,所以我不在讨论错误处理,例如重叠的片段,未设置更多片段的多个片段等。)