重新组合碎片UDP数据包

时间:2013-08-29 23:22:05

标签: c# ip packets fragmentation sharppcap

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

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

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

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

1 个答案:

答案 0 :(得分:3)

进入您的旧问题,寻找解决我自己的问题碎片整理的方法。

我理解它的方式 - 因为你正在进行数据包捕获/ pcap读取,你必须自己对IP数据包进行碎片整理。如果您是在网络上进行通信的实际应用程序,则操作系统的IP堆栈将为您执行此操作,您可以按原样读取数据。但是在重新组装之前发生了数据包捕获。您所看到的是数据包在线路上(或在您的情况下在空中传播)。

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

以某种方式摆脱重复,按偏移顺序排序。每个数据包的有效负载进入packet.fragmentationOffset * 8的最终缓冲区。使用此信息计算最终数据包大小也很简单。

可以在此处找到更详尽的解释: http://en.wikipedia.org/wiki/IPv4#Reassembly

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