2010-07-27 16 views
2

Supposons que nous capturions des paquets avec l'API C de libpcap. Est-il efficace d'analyser certaines chaînes de charge utile avec la recherche de chaînes strstr() en vitesse de ligne (par exemple Mbps/Gbps)? Par exemple strstr (payload, "User-Agent");Recherche de chaîne dans un paquet

Serait-il plus efficace de le faire avec une bibliothèque de correspondance de modèle d'expression régulière, telle que libpcre?

Si nous voulons faire cela uniquement pour les arguments d'en-tête HTTP, existe-t-il une API C? Ce n'est pas clair pour moi si libcurl peut faire ça ... merci d'avance.

+0

Assurez-vous simplement que vos chaînes de données utiles sont terminées par NUL! – bstpierre

+0

ouais, merci! –

Répondre

1

Si vous ne recherchez qu'une seule chaîne courte, rien ne sera plus rapide que la comparaison linéaire utilisée par strstr(). Cela dit, le traitement spécial de NUL octets de NUL octets n'est certainement pas ce que vous voulez pour examiner le trafic réseau, et vous feriez mieux d'écrire votre propre implémentation qui traitait tous les octets les mêmes paramètres de longueur acceptés. Si vous recherchez plusieurs chaînes de caractères, il est préférable d'utiliser un algorithme rapide de mise en correspondance de chaînes comme Aho-Corasick ou de créer une machine d'état qui correspond aux chaînes que vous voulez dans le contexte que vous voulez, c'est-à-dire un analyseur . Pour analyser une grammaire principalement régulière comme HTTP en C, le ragel state machine compiler est mon outil de choix.

+0

Je cherche des chaînes multiples ... 1) Je ne peux pas vraiment comprendre pourquoi une machine d'état serait meilleure pour ce cas (par exemple strstr (charge utile, "GET")! = NULL pointerait exactement au GET et donc je peux analyser le chaînes après que) et 2) pourquoi la machine d'état de ragel est-elle meilleure qu'utilisant strncmp? Je vous remercie! –

+0

Si vous avez un paquet de n octets et m chaînes que vous aimeriez trouver, alors une recherche linéaire pour chaque chaîne est au moins O (m * n). Avec une approche machine-état - soit Aho-Corasick etc. ou un analyseur - vous ne ferez qu'un seul passage linéaire sur les données. Si vous essayez de trouver des informations structurées, comme un verbe HTTP suivi d'un URI relatif à l'hôte correctement formaté, suivi de "HTTP /" puis d'une version, l'utilisation d'un générateur d'analyseur vous épargnera beaucoup de souffrance en vous permettant de décrire rigoureusement votre contribution attendue. – llasram

0

Je ne peux vraiment pas imaginer que strstr soit plus lent qu'une expression d'expression régulière - cependant, si vous avez besoin d'extraire plusieurs valeurs d'en-tête HTTP, l'analyse des paquets serait une bonne option. Est-ce que libpcap n'inclut aucun analyseur intégré?

+0

L'API libpcap C peut extraire des informations des en-têtes TCP/IP, mais pas des données utiles. Étant donné que les en-têtes HTTP font partie de la charge utile, ils doivent être analysés d'une autre manière. –

+0

libpcap ne comprend aucun analyseur intégré, car il est destiné à être utilisé par des programmes tels que tcpdump, Wireshark, snort, etc., qui ont leurs propres parseurs. Il n'analyse même pas les en-têtes de couche liaison, IP ou TCP. –

1

http://www.arstdesign.com/articles/fastsearch.html a quelques métriques montrant que strstr est décemment performant. Pour de courtes chaînes, je doute qu'une bibliothèque regex puisse battre un bon assemblage optimisé.

+0

Merci pour votre réponse. Il semble que strstr soit le choix le plus rapide. –