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