到目前为止,我已经尝试过这些方法:
1) 以源 IP/端口和目标 IP/端口为键进行散列。散列中的每个位置都是一个数据包列表。然后将哈希值保存在一个文件中,每个流由一些特殊字符/行分隔。问题:没有足够的内存用于大型跟踪。
2) 使用与上述相同的键进行散列,但仅将文件句柄保存在内存中。然后将每个数据包放入指向正确文件的 hash[key] 中。问题:太多的流/文件(~200k),它也可能耗尽内存。
3) 对源 IP/端口和目标 IP/端口进行哈希处理,然后将信息放入文件中。2和3的区别在于,这里每次操作都会打开和关闭文件,所以我不用担心因为我同时打开太多而导致内存不足。问题:太慢了,文件数量与 2 相同,所以也不切实际。
4) 对源 IP/端口对进行哈希处理,然后对每个流的整个跟踪进行迭代。获取属于该流的数据包并将它们放入输出文件中。问题:假设我有一个包含 200k 流的 60 MB 跟踪。这样,我会处理一个 60 MB 的文件 20 万次。也许在我迭代时删除数据包会使它不那么痛苦,但到目前为止我不确定这是否是一个好的解决方案。
5) 按 IP 源/目标拆分它们,然后为每个文件创建一个文件,用特殊字符分隔流。文件仍然太多(+50k)。
现在我正在使用 Ruby 来做这件事,我猜这可能是个坏主意。目前我已经用 tshark 过滤了这些痕迹,这样它们就只有相关信息,所以我真的不能让它们变得更小。
我考虑过使用 C#/Java/C++ 将所有内容加载到内存中,如 1) 中所述,但我想知道这里是否没有更好的方法,特别是因为即使使用更高效的方法,我以后也可能会耗尽内存如果我必须使用更大的痕迹,语言。
总之,我面临的问题是我的文件太多或内存不足。
我也尝试过搜索一些工具来过滤信息,但我认为没有。我发现的那些只返回一些统计数据,并且不会根据我的需要扫描每个流。