Sniffer TCP et HTTP

Sniffer TCP et HTTP - C - Programmation

Marsh Posté le 20-04-2008 à 17:24:25    

Bonjour,
Je suis en train de programmer un sniffer (ma question ne porte toutefois pas sur la programmation proprement dite). Avec libpcap, c'est assez facile de récupérer les paquets, de "traduire" les entêtes Ethernet, IP et TCP puis de stocker le résultat. Ca j'y arrive.
 
Là où j'ai une difficulté, c'est que je souhaite analyser le trafic HTTP. Il faut donc réassembler les packets en analysant, au niveau TCP, les numéros de séquence et d'acquiescement. Ca aussi j'y arrive, par exemple j'arrive à obtenir un entête HTTP suivi de la page HTML entière. Où est la difficulté me direz vous.
 
J'y arrive ! Le problème avec mon système, c'est que je ne sais pas quand finit une requête HTTP. Je réassemble les paquets selon les numéros d'acquiescement, mais je ne sais pas si le paquet que j'assemble est le dernier ou si d'autres vont encore venir. Ainsi, je ne sais pas afficher : "fin de chargement de la page x". Certes le dernier paquet est généralement plus petit que les précédents, mais je me dis que j'ai dû rater quelque chose dans le protocole TCP. A moins que cela soit géré au niveau HTTP ?
 
Merci pour vos lumières !
 
PS : Je post ici, car je pense avoir plus de chance que dans Réseau & co...

Reply

Marsh Posté le 20-04-2008 à 17:24:25   

Reply

Marsh Posté le 20-04-2008 à 18:11:20    

Regarde le champ Content-Length dans les entête du message http, ça te donne la taille du document qui suit.

Reply

Marsh Posté le 20-04-2008 à 18:19:26    

Si seulement tous les serveurs fournissaient cette information, ça serait trop beau. ;) En pratique, peu de sites dynamiques fournissent ce champ (sauf ceux qui gzip leurs pages).
Merci quand même !
 
D'autres idées ?

Reply

Marsh Posté le 21-04-2008 à 01:12:07    

En observant les paquets passer, j'ai fait quelques constatations :
 

  • Lorsque Content-Length est présent, le fichier se termine à la taille indiquée (normal).
  • Lorsqu'il n'y a pas de champ Content-Lenght, la fin du fichier contient souvent (en hex) 30 0d 0a 0d 0a (du moins, c'est ce que je constate sur un grand nombre de serveurs).
  • Mais ce n'est pas tout, le fichier peut aussi s'arrêter brusquement par l'envoi d'un flag FIN en TCP (c'est le plus logique, mais après quelques tests, ça ne semble pas être très fréquent...).


Quelqu'un peut confirmer, car je n'ai rien vu de très clair dans les normes...

Reply

Marsh Posté le 28-04-2008 à 00:37:00    

kalex a écrit :

En observant les paquets passer, j'ai fait quelques constatations :
 

  • Lorsque Content-Length est présent, le fichier se termine à la taille indiquée (normal).
  • Lorsqu'il n'y a pas de champ Content-Lenght, la fin du fichier contient souvent (en hex) 30 0d 0a 0d 0a (du moins, c'est ce que je constate sur un grand nombre de serveurs).
  • Mais ce n'est pas tout, le fichier peut aussi s'arrêter brusquement par l'envoi d'un flag FIN en TCP (c'est le plus logique, mais après quelques tests, ça ne semble pas être très fréquent...).


Quelqu'un peut confirmer, car je n'ai rien vu de très clair dans les normes...


http://mathieu-lemoine.developpez. [...] /web/http/
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed