2010-10-21 4 views
1

En C#, j'utilise SharpPCap pour obtenir des segments à partir d'une trace winpcap.Comment créer un message à partir de segments tcp

J'ai besoin de reconstruire tous les messages envoyés et reçus dans cette trace.

Dans mon cas, l'adresse IP du client et du serveur ne sera jamais la même. Le port du client ne change pas nécessairement.

Le protocole utilisé par le message pourrait être HTTP ou quelque chose de personnalisé que je ne connais pas.

Voilà comment je fais actuellement il:

  if (ipPacket.Protocol == IPProtocolType.TCP) 
      { 
       TcpPacket tcpPacket = (TcpPacket)ipPacket.PayloadPacket; 

       Packet dataPacket = tcpPacket; 
       while (dataPacket.PayloadPacket != null) 
        dataPacket = dataPacket.PayloadPacket; 

       if (dataPacket.PayloadData.Length > 0) 
       { 
        if (m_MessageContainer.IsEmpty() 
         || ((m_MessageContainer.Last().SourceIp.ToString() != ipPacket.SourceAddress.ToString()) 
          && tcpPacket.Psh)) 
        { 
         m_MessageContainer.Add(BuildMessage(ipPacket, tcpPacket));      
        } 
        m_MessageContainer.Last().AddData(dataPacket.PayloadData); 
       } 
      } 

Le problème avec ma solution est lorsque le client envoie deux demande de suite. Je fusionne juste les deux messages en un. Si je change

if (m_MessageContainer.IsEmpty() 
    || ((m_MessageContainer.Last().SourceIp.ToString() != ipPacket.SourceAddress.ToString()) 
     && tcpPacket.Psh)) 
{ 
    m_MessageContainer.Add(BuildMessage(ipPacket, tcpPacket));      
} 

par

if (m_MessageContainer.IsEmpty() 
    || tcpPacket.Psh) 
{ 
    m_MessageContainer.Add(BuildMessage(ipPacket, tcpPacket));      
} 

alors un problème se produit lorsqu'un message est partagé entre plus d'un segments de tcp et le drapeau PSH est fixé sur au moins deux de ces segments de tcp.

J'ai besoin d'un moyen de fusionner correctement les segments pour reconstruire les messages originaux. Je ne peux pas compter sur le protocole utilisé sur TCP.

Merci!

Edit: Dans Wireshark, quand vous suivez flux tcp, il ne sait pas nécessairement le protocole sur tcp mais il est en mesure de montrer chaque demande et réponse dans des couleurs différentes. Comment est-il capable de faire cela? Je cherche la même fonctionnalité parce que dans ma situation, il n'y aura jamais une deuxième demande avant qu'une réponse soit reçue dans un flux. Merci

Répondre

0

Il n'y a aucun moyen de savoir simplement en observant le flux sur le fil juste comment le code de l'application originale a écrit sur le socket. Vous parlez d'utiliser des indices qui pourraient apparaître dans certaines circonstances, mais vous ne pouvez pas compter sur eux (comme vous l'avez découvert).

write(sock, "GET/HTTP/1.0\r\n\r\n", len); 

write(sock, "GET/HTTP/1.0\r\n", len); 
write(sock, "\r\n", 2); 

write(sock, "GET/HTTP/1.0\r\n", len); 
sleep(1); 
write(sock, "\r\n", 2); 

Ces trois exemples sont des moyens légaux d'écrire une requête HTTP. Tous les trois pourraient se ressembler sur le fil. Certes, le dernier a une forte chance d'être différent même si cela signifie la même chose (imaginez que le sommeil n'est pas explicite, mais peut-être causé par la lecture des cookies sur le disque). Même si le dernier peut être plié en une seule transmission si le socket TCP particulier est maintenu par des tentatives au moment où les deux écritures se produisent. Le second exemple peut apparaître comme un paquet ou deux simplement basé sur l'autre chargement sur l'interface (ou des options de socket comme CORK).

Questions connexes