我用libpcap闻了闻,得到了很多像这样的零碎的数据包

有没有什么简单的方法来识别零碎的数据包(当我用pcap_next_ex读取这个数据包,然后用C代码整理这个数据包?
发布于 2020-09-03 13:18:22
是否有任何简单的方法来识别零碎的数据包
这取决于你如何定义“简单”。
您需要解析链路层报头,以确定该数据包是否为IPv4数据包。如果它是一个IPv4数据包,您将需要解析the IPv4 header,以查看1)“标志”字段中是否设置了“更多片段”位,或者2)“片段偏移”字段是否是非零的。如果其中任何一个是真的,那么它就是一个IPv4片段。
并使用C代码对此数据包进行碎片整理?
您需要一个按IPv4源地址和目标地址以及“标识”字段值编制索引的表。
对于每个零碎的IPv4数据包,查看该表中是否有与零碎数据包报头中的条目具有相同的IPv4源地址和目标地址以及相同的标识字段值的条目。
如果没有找到,请在表中添加一个条目,并将数据包的内容保存在该条目中。如果片段偏移量值为0,则保存整个IPv4报头以及数据包有效负载,以及它的片段偏移值、有效负载长度和更多片段标志(是的,这是多余的,因为您有完整的报头,但您确实要求使用一种简单的方法:-);否则,只保存有效负载及其片段偏移值、有效负载长度和更多片段标志。
如果确实找到了,那么,如果片段偏移量为0,则将IPv4标头添加到条目中。然后,不管分段偏移值如何,将具有其分段偏移值、有效载荷长度和更多分段标志的分组有效载荷添加到所保存的分组有效载荷信息。这意味着该条目具有IPv4报头和一组分组有效载荷/片段偏移值/有效载荷长度/更多片段标志组合。
对于您添加的每个片段,在您添加它之后,检查是否:
如果这是真的,那么您就拥有了所有的片段,并且可以将它们重新组装成一个IPv4包,它的报头是来自第一个片段(片段偏移值为0的那个)的保存的报头,其有效负载是所有片段的有效负载的串联。
(同样,您要求的是“简单”,所以我不是在讨论错误处理,例如重叠片段、多个片段中没有设置更多片段等。)
https://stackoverflow.com/questions/63484941
复制相似问题