Si Je vous comprends correctement, vous êtes essentiellement intéressé par quelque chose comme Linux 'strace' (Introduction) pour les appels système spécifiques au réseau?
Peut-être une combinaison d'un profileur et d'un débogueur, pour des applications réseau (c'est-à-dire 'ntrace'), fournissant une analyse détaillée de diverses mesures optionnelles?
Sous Linux, l'utilitaire strace est en grande partie basée sur la fonctionnalité qui est fournie par le noyau Linux, à savoir l'API ptrace (process tracing):
En utilisant ptrace, il devrait être possible d'obtenir la plupart des données que vous êtes intéressé.
Sous Windows, vous aurez probablement envie de regarder dans detours afin d'intercepter/rediriger les appels de l'API Winsock à des fins d'inspection/d'analyse comparative. Si vous n'avez pas vraiment besoin de beaucoup d'informations de bas niveau, vous pouvez probablement utiliser directement strace (sous linux) et ne l'utiliser que pour suivre certains appels système, par exemple, considérez la ligne suivante qui tracerait uniquement les appels à l'syscall ouvert (à l'aide du paramètre -o de fichier supplémentaire, vous pouvez rediriger toutes les sorties vers un fichier de sortie):
strace -e trace=open -o results.log
en passant un drapeau -v supplémentaire strace, vous pouvez augmenter sa verbosité pour obtenir informations supplémentaires (lorsque vous travaillez avec des SCM tels que git qui sont composés de nombreux utilitaires shell plus petits et d'outils autonomes, vous aurez probablement aussi besoin de vous pencher sur l'utilisation de -f drapeau afin de suivre également les processus fourchus).
Alors, que vous seriez intéressé, est tout syscalls qui sont liés à sockets, à savoir:
- acceptent
- bind
- connecter
- getpeername
- getsockname
- getsockopt
- écoutez
- recv
- recvfrom
- envoyer
- sendto
- setsockopt
- arrêt
- socket
- socketpair
(au début, vous aurez probablement envie qu'à se pencher sur les appels send .../recv ..., bien que)
Pour simplifier, vous pouvez également utiliser « réseau » en tant que paramètre de tracer, qui retracera tous les appels liés au réseau:
trace -e = réseau: Trace l'ensemble du réseau des appels système liés.
Ainsi, une invocation strace correspondante pourrait ressembler à ceci:
strace -v -e trace=accept,bind,connect,getpeername,getsockname,getsockopt,listen,recv,recvfrom,send,sendto setsockopt,shutdown,socket,socketpair -o results.log -f git pull
Lorsque le programme est terminé en cours d'exécution, vous serez alors voulez surtout d'examiner le fichier journal pour évaluer les données, cette peut alors être facilement réalisé en utilisant des expressions régulières.
Par exemple, lors de l'exécution de ce qui suit dans un shell linux: strace -v -o wget.log -e trace=connect,recv,recvfrom,send,sendto wget http://www.google.com
Le fichier journal résultant contient des messages comme ceux-ci:
- recv (3, « HTTP/1.0 302 Trouvé \ r \ nLocalisation: htt "..., 511, MSG_PEEK) = 511
- sendto (4," \ 24 \ 0 \ 0 \ 0 \ 26 \ 0 \ 1 \ 3^\ 206 * J \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 "..., 20, 0, {sa_famille = AF_NETLINK, pid = 0, groupes = 00000000}, 12) = 20
En regardant les pages de manuel pour ces deux appels système, il est évident que 511 et 20 sont le nombre d'octets transférés.Si vous avez également besoin d'informations de calendrier détaillé, vous pouvez passer le drapeau -T à strace:
-T - temps d'impression passé dans chaque syscall
De plus, vous pouvez obtenir des statistiques en passant le -c indicateur:
-c: Compter l'heure, les appels et les erreurs pour chaque appel système et signaler un résumé au programme quitter. Sous Linux, cela tente d'afficher l'heure système (temps CPU passé à s'exécuter dans le noyau) indépendamment de l'heure de l'horloge murale. Si -c est utilisé avec -f ou -F (ci-dessous), seuls les totaux cumulés pour tous les processus tracés sont conservés.
Si vous avez besoin également d'examiner les données réelles traitées, vous pouvez regarder dans les spécificateurs de lecture/écriture:
-e read = jeu: Effectuer un vidage hexadécimal complet et ASCII de tous les données lues à partir du fichier descripteurs répertoriés dans l'ensemble spécifié. Par exemple, pour voir toutes les activités d'entrée dans le fichier , les descripteurs 3 et 5 utilisent -e read = 3,5. Notez que ceci est indépendant du suivi normal de l'appel système read (2) qui est contrôlé par l'option -e trace = read. -e write = set: Effectue une sauvegarde hexadécimale et ASCII complète de toutes les données écrites dans le fichier descripteurs répertoriés dans l'ensemble spécifié. Par exemple, pour voir toutes les activités de sortie du fichier , les descripteurs 3 et 5 utilisent -e write = 3,5. Notez que ceci est indépendant du suivi normal de l'appel système write (2) qui est contrôlé par l'option -e trace = write.
Vous pouvez également personnaliser la longueur maximum de chaînes:
-s strsize: Indiquez la taille maximale de la chaîne à imprimer (la valeur par défaut est 32). Notez que noms de fichiers ne sont pas considérés comme des chaînes et sont toujours imprimés en
Ou ont des chaînes être sous-évaluées en hex:
-XX: Imprimer toutes les chaînes en format de chaîne hexadécimale.
Ainsi, en utilisant strace pour une grande partie de cela, semble être une bonne approche hybride, car il est très facile à faire, mais il y a une bonne quantité d'informations à faible niveau disponibles, si vous trouvez que vous avez besoin faible supplémentaire informations de niveau, vous pouvez envisager d'étendre strace à la place ou en déposant des demandes de fonctionnalités correspondantes avec le strace project on sourceforge. Cependant, en y réfléchissant un peu plus, une manière moins impliquée et plus agnostique de mettre en œuvre un benchmark de trafic réseau relativement simple consisterait à utiliser une forme de couche intermédiaire, entre le client et le serveur réel: serveur qui consiste essentiellement à mesurer, analyser et rediriger le trafic vers le serveur réel.
Assez semblable à un serveur proxy (par exemple, SOCKS), de sorte que tout le trafic soit acheminé par tunnel à travers votre analyseur, ce qui peut à son tour accumuler des statistiques et d'autres mesures.
Une version de base de quelque chose comme ceci pourrait probablement être facilement mise en place simplement en utilisant netcat et certains scripts shell, des versions plus complexes peuvent cependant bénéficier d'utiliser perl ou python à la place. Pour une implémentation python d'un serveur SOCKS, vous pouvez rechercher pysocks.
En outre, il y a bien sûr twisted pour python:
Twisted est un moteur de réseau événementiel écrit en Python et sous licence sous la licence MIT.
Si vous avez besoin d'avoir plus d'informations de bas niveau, vous voudrez sûrement vraiment vous intéresser à l'interception des appels système.
Si vous avez également besoin de données d'efficacité spécifiques au protocole, vous pouvez consulter tcpdump.
Demandez-vous, comment obtenir les données requises afin de trouver de telles références pour un programme en réseau arbitraire? – none
Oui, j'aimerais avoir au minimum le nombre total d'octets transférés et peut-être le nombre de changements de lecture à écriture pour une commande donnée, quelque chose comme l'heure et le temps CPU et mémoire, et SystemTap iotimes pour E/S. –
Je pense que pour vraiment répondre à votre question, vous devriez idéalement nous en dire plus sur votre plate-forme/OS préféré, ainsi que votre langage de programmation préféré. De plus, une liste détaillée des mesures qui vous intéressent nous dirait quelle approche est la plus réalisable. – none