C# 重新组装片段UDP数据包

C# 重新组装片段UDP数据包,c#,ip,packets,fragmentation,sharppcap,C#,Ip,Packets,Fragmentation,Sharppcap,我有一个通过udf的802.11(wifi)各种流量的pcap。由于MTU,udp(或更准确地说是IP)会将wifi数据包分段。我目前正在使用SharpPcap读取并尝试访问wifi流量,并且遇到了必须手动重新组装udp数据包的问题 我看到了两种选择,我想检查它们是否可行,最好的解决方案,或者是否有我忽略的东西。最终,我将访问一个通过UDP传输给我的实时提要(相同格式,UDP上的wifi),但出于测试目的,我必须使用PCAP 我可以手动加载pcap文件,通过片段偏移量和数据包id重新组装它,让状

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

我看到了两种选择,我想检查它们是否可行,最好的解决方案,或者是否有我忽略的东西。最终,我将访问一个通过UDP传输给我的实时提要(相同格式,UDP上的wifi),但出于测试目的,我必须使用PCAP

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


这可能是因为IP层仍然包含原始捕获的IP dest地址和端口(这是不同的)?虽然我没有更改校验和,但在发送之前我尝试过更改这些校验和,它仍然是零碎的。

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

我的理解是,由于您正在进行数据包捕获/pcap读取,因此您必须自己对IP数据包进行碎片整理。如果您是一个在网络上通信的实际应用程序,那么操作系统的IP堆栈将为您完成这项工作,您可以按原样读取数据。但是数据包捕获发生在重新组装之前。你所看到的是数据包在电线上(或者在你的案例中是在空中)传输的过程

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

以某种方式消除重复项,按偏移量排序。每个数据包的有效负载都会进入数据包处的最终缓冲区。fragmentationOffset*8。使用此信息计算最终数据包大小也很简单

可以在此处找到更详细的解释:

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