重新组装碎片化的UDP数据包

6
我有一个pcap文件,其中包含了通过802.11(wifi)传输的各种类型的流量。由于MTU的限制,udp(或更准确地说是IP)会对wifi数据包进行分片。我目前正在使用SharpPcap来读取并尝试访问wifi流量,但遇到了手动重新组装UDP数据包的问题。
我看到两个选项,想检查一下它们是否可行,哪个是最佳方案,或者是否有我忽略的东西。最终,我将访问以同样格式通过UDP流式传输给我的实时数据(wifi over UDP),但出于测试目的,我必须使用pcaps进行测试。
我可以手动加载pcap文件,通过片偏移和数据包ID重新组装它,使用状态机跟踪所有数据包。或者我可以尝试避免重新组装(我认为套接字应该为我完成这项工作),加载pcap文件,输出到本地主机上的原始套接字,并监听本地主机上的UDP套接字。我会避免第一种方法,直到真正需要它(是吗?),而第二种方法似乎应该行得通,但实际上并没有。我已经设置好了所有内容,但数据包仍然一个接一个地以字节数组的形式发送和接收 - 并且被分片。
这可能是因为IP层仍然包含原始捕获的IP目标地址和端口(不同于现在的地址和端口)吗?我尝试在发送之前更改这些内容,虽然我没有更改校验和,但它仍然被分片了。
1个回答

10
在搜寻自己的碎片整理问题的解决方法时,我遇到了你的旧问题。据我理解 - 由于你正在进行数据包捕获/pcap读取,因此必须自己对IP数据包进行碎片整理。如果您是网络上实际通信的应用程序,则操作系统的IP堆栈会为您执行此操作,您可以按原样读取数据。但是,数据包捕获发生在此重新组装之前。您看到的是数据包在电线(或在您的情况下在空气中)上传输时的样子。
理论上,碎片整理相对容易 - 具有相同ID、源/目标IP地址和协议类型的IP数据包属于同一组。第一个数据包的碎片偏移量为0,并且“更多碎片”字段设置为1。下一个数据包(如果有)将设置“更多碎片”为1并具有非零偏移量。最后一个数据包将具有非零偏移量并且不设置“更多碎片”。
以某种方式去除重复项,按偏移量排序。每个数据包的有效负载放入最终缓冲区中packet.fragmentationOffset*8。使用此信息计算最终数据包大小也很容易。
更详细的解释可以在这里找到: http://en.wikipedia.org/wiki/IPv4#Reassembly 我知道你可能早就离开了,但也许这可以帮助正在搜寻相同信息的其他人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接