正在重新组装碎片UDP数据包

本文关键字:UDP 数据包 碎片 新组装 | 更新日期: 2023-09-27 18:29:30

我有一个通过udf通过802.11(wifi)的各种类型流量的pcap。udp(或者更准确地说是IP)由于MTU而对wifi数据包进行分段。我目前正在使用SharpPcap读取并尝试访问wifi流量,遇到了必须手动重新组装udp数据包的问题。

我看到了两种选择,我想看看它们是否可能,最好的解决方案,或者是否有我忽略的地方。最终,我将访问通过UDP(前面提到的那个)流式传输给我的实时订阅源(相同格式,UDP上的wifi),但出于测试目的,我必须使用pcaps。

我可以手动加载pcap文件,通过片段偏移量和数据包id重新组装它,让状态机跟踪所有数据包。或者,我可以尝试避免重新组装,(我认为套接字应该为我做这件事)加载pcap文件,输出到localhost上的原始套接字,并侦听本地主机上的UDP套接字。我一直在避免第一种,直到真的有必要(是吗?)而第二种似乎应该有效,但没有。我已经设置好了所有这些,但数据包仍然可以作为字节数组一个接一个地发送和接收,并且是分段的。

这可能是因为IP层仍然包含原始捕获的IP目标地址和端口(不同)吗?我试着在发送之前更改这些,尽管我没有更改校验和,但它仍然是碎片化的。

正在重新组装碎片UDP数据包

遇到您的老问题,正在寻找我自己的碎片整理问题的解决方案。

按照我的理解,由于你正在进行数据包捕获/pcap读取,你必须自己对IP数据包进行碎片整理。如果你是一个在网络上通信的实际应用程序,你的操作系统的IP堆栈会为你做这件事,你可以按原样读取数据。但数据包捕获发生在重新组装之前。你看到的是包裹在电线上(或者在你的情况下在空中)传播。

从理论上讲,碎片整理相对容易——具有相同ID、源/目标IP地址和协议类型的IP数据包属于一起。第一个数据包的碎片偏移量为0,"更多碎片"字段设置为1。下一个数据包(如果有的话)的"更多碎片"将设置为1,并且偏移量为非零。最后的数据包将具有非零偏移,并且没有"更多片段"集。

以某种方式消除重复项,按偏移量排序。每个数据包的有效载荷在数据包fragmentationOffset*8处进入最终缓冲区。使用这些信息来计算最终的数据包大小也是微不足道的。

更全面的解释可以在这里找到:http://en.wikipedia.org/wiki/IPv4#Reassembly

我知道你可能很久以前就离开了,但也许这可以帮助其他人搜索相同的信息。