Учитывая след пакетов, как бы вы сгруппировали их в потоки? - PullRequest
1 голос
/ 20 апреля 2010

Я пробовал это до сих пор:

1) Создайте хэш с исходным IP / портом и целевым IP / портом в качестве ключей. Каждая позиция в хэше является списком пакетов. Хеш затем сохраняется в файле, каждый поток разделяется какими-то специальными символами / строкой. Проблема: недостаточно памяти для больших следов.

2) Создайте хеш с тем же ключом, что и выше, но сохраните в памяти только дескрипторы файлов. Каждый пакет затем помещается в хеш [ключ], который указывает на нужный файл. Проблемы: Слишком много потоков / файлов (~ 200 КБ) и может также не хватить памяти.

3) Хешируйте исходный IP / порт и целевой IP / порт, затем поместите информацию в файл. Разница между 2 и 3 заключается в том, что здесь файлы открываются и закрываются для каждой операции, поэтому мне не нужно беспокоиться о нехватке памяти, потому что я открыл слишком много одновременно. Проблемы: Слишком медленный, столько же файлов, сколько 2, поэтому нецелесообразно.

4) Создайте хэш пар IP / порт источника, а затем выполните итерацию по всей трассе для каждого потока. Возьмите пакеты, которые являются частью этого потока, и поместите их в выходной файл. Проблема: Предположим, у меня есть трассировка 60 МБ с потоками 200 КБ. Таким образом, я бы обработал, скажем, файл размером 60 МБ 200k раз. Возможно, удаление пакетов во время итерации сделает это не таким болезненным, но пока я не уверен, что это будет хорошим решением.

5) Разделите их по IP-адресу источника / назначения, а затем создайте отдельный файл для каждого, разделяя потоки специальными символами. Все еще слишком много файлов (+ 50 КБ).

Прямо сейчас я использую Ruby, чтобы сделать это, я думаю, это могло быть плохой идеей. В настоящее время я отфильтровал трассировки с помощью tshark, чтобы они имели только релевантную информацию, поэтому я не могу сделать их немного меньше.

Я думал о загрузке всего в памяти, как описано в 1) с использованием C # / Java / C ++, но мне было интересно, не будет ли здесь лучшего подхода, тем более что у меня может также закончиться память позже, даже с более эффективный язык, если мне нужно использовать большие следы.

Таким образом, проблема, с которой я сталкиваюсь, заключается в том, что у меня либо слишком много файлов, либо недостаточно памяти.

Я также пытался найти какой-то инструмент для фильтрации информации, но я не думаю, что он есть. Те, что я нашел, только возвращают некоторую статистику и не сканируют каждый поток так, как мне нужно.

1 Ответ

1 голос
/ 22 апреля 2010

Учитывая ваш сценарий, я мог бы записать трассировки в файлы, но использовать механизм кэширования LRU (с наименьшим количеством использований в последнее время), чтобы ограниченное количество файлов было открыто одновременно. Если вам нужен доступ к файлу, который в данный момент не открыт, закройте файл, который больше не видел никаких действий, и откройте текущий файл.

Вам может потребоваться настроить количество файлов в вашем кеше LRU, чтобы добиться максимальной производительности. Этот метод будет работать особенно хорошо, если у вас большое количество недолговечных соединений.

...