给定一些数据包,你会如何将它们分组为流?

时间:2010-04-19 20:45:17

标签: large-files fileparsing network-traffic

到目前为止,我已经尝试过这些方法:

1)使用源IP /端口和目标IP /端口作为密钥进行哈希。散列中的每个位置都是数据包列表。然后将散列保存在文件中,每个流由一些特殊字符/行分隔。问题:没有足够的内存来存在大的痕迹。

2)使用与上面相同的密钥创建哈希,但只保留文件句柄的内存。然后将每个数据包放入指向正确文件的散列[key]中。问题:流量/文件太多(~200k),内存也可能耗尽。

3)散列源IP /端口和目标IP /端口,然后将信息放入文件中。 2和3之间的区别在于,这里的文件是为每个操作打开和关闭的,所以我不必担心内存不足,因为我同时打开了太多内存。问题:方式太慢,文件数量与2相同,所以也不切实际。

4)对源IP /端口对进行哈希,然后迭代每个流的整个跟踪。获取属于该流的数据包并将它们放入输出文件中。问题:假设我有一个60 MB的跟踪,有200k的流量。这样,我会处理一个200k的60 MB文件。也许在迭代时删除数据包会让它不那么痛苦,但到目前为止我不确定这是一个很好的解决方案。

5)按IP源/目标拆分它们,然后为每个文件创建一个文件,用特殊字符分隔流。文件太多(+ 50k)。

现在我正在使用Ruby来做这件事,我想这可能是一个坏主意。目前我已经用tshark过滤了痕迹,因此它们只有相关的信息,所以我不能让它们变小。

我考虑使用C#/ Java / C ++将所有内容加载到内存中,但是我想知道这里是否会有更好的方法,特别是因为我可能也会在以后使用内存不足如果我必须使用更大的痕迹,那么这是一种更有效的语言。

总之,我面临的问题是我要么文件太多,要么内存不足。

我也尝试过搜索一些过滤信息的工具,但我认为没有。我发现的那些只返回一些统计数据,并且不会根据需要扫描每个流程。

1 个答案:

答案 0 :(得分:1)

根据您的方案,我可能会将跟踪写入文件,但使用LRU(最近最少使用的)缓存机制来保持一次打开有限数量的文件。如果您需要访问当前未打开的文件,请关闭最长时间没有看到任何活动的文件,然后打开当前文件。

您可能需要调整LRU缓存中的文件数以获得最佳性能。如果您有大量短期连接,这项技术将特别有效。