Je l'ai essayé ces façons jusqu'à présent:Étant donné une trace de paquets, comment les grouperiez-vous en flux?
1) Faites un hachage avec les IP/port source et IP/port de destination comme clés. Chaque position dans le hachage est une liste de paquets. Le hachage est ensuite enregistré dans un fichier, chaque flux étant séparé par des caractères spéciaux/ligne. Problème: Pas assez de mémoire pour les grandes traces.
2) Faites un hachage avec la même clé que ci-dessus, mais ne gardez en mémoire que les poignées de fichiers. Chaque paquet est ensuite placé dans le hash [clé] qui pointe vers le bon fichier. Problèmes: Trop de flux/fichiers (~ 200k) et il peut manquer de mémoire.
3) Hachez l'IP/port source et l'IP/port de destination, puis placez les informations dans un fichier. La différence entre 2 et 3 est qu'ici les fichiers sont ouverts et fermés pour chaque opération, donc je n'ai pas à m'inquiéter de manquer de mémoire car j'en ai ouvert trop en même temps. Problèmes: WAY trop lent, même nombre de fichiers que 2 donc aussi peu pratique.
4) Faites un hachage des paires IP/port source, puis parcourez la totalité de la trace pour chaque flux. Prenez les paquets qui font partie de ce flux et placez-les dans le fichier de sortie. Problème: Supposons que j'ai une trace de 60 Mo qui a 200k flux. De cette façon, je traiterais, disons, un fichier de 60 Mo 200k fois. Peut-être que retirer les paquets pendant que je ferais ça ne serait pas si douloureux, mais jusqu'à présent, je ne suis pas sûr que ce serait une bonne solution.
5) Les diviser par IP source/destination et ensuite créer un fichier unique pour chacun, en séparant les flux par des caractères spéciaux. Encore trop de fichiers (+ 50k).
En ce moment j'utilise Ruby pour le faire, ce qui pourrait être une mauvaise idée, je suppose. Actuellement, j'ai filtré les traces avec tshark afin qu'elles ne contiennent que des informations pertinentes, donc je ne peux pas vraiment les rendre plus petites. Je pensais à tout charger en mémoire comme décrit en 1) en utilisant C#/Java/C++, mais je me demandais s'il n'y aurait pas une meilleure approche ici, d'autant plus que je pourrais aussi manquer de mémoire plus tard même avec un langage plus efficace si je dois utiliser des traces plus grandes. En résumé, le problème auquel je fais face est que j'ai trop de fichiers ou que je manque de mémoire.
J'ai aussi essayé de chercher un outil pour filtrer l'info, mais je ne pense pas qu'il y en ait un. Ceux que j'ai trouvés ne renvoient que des statistiques et ne chercheraient pas tous les flux dont j'ai besoin.