Работает на C#, я использую SharpPCap для получения сегментов из трассы winpcap.Как построить сообщение из сегментов tcp
Мне нужно перестроить все сообщения, отправленные и полученные по этой трассе.
В моей ситуации IP-адрес клиента и сервера не будет таким же. Порт клиента не обязательно изменяется.
Протокол, используемый сообщением, может быть HTTP или что-то обычное, что я не знаю.
Вот как я в настоящее время сделать это:
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);
}
}
Проблема с моим решением, когда клиент посылает два запроса в ряд. Я просто объединять два сообщения в одном. Если изменить
if (m_MessageContainer.IsEmpty()
|| ((m_MessageContainer.Last().SourceIp.ToString() != ipPacket.SourceAddress.ToString())
&& tcpPacket.Psh))
{
m_MessageContainer.Add(BuildMessage(ipPacket, tcpPacket));
}
от
if (m_MessageContainer.IsEmpty()
|| tcpPacket.Psh)
{
m_MessageContainer.Add(BuildMessage(ipPacket, tcpPacket));
}
тогда проблема возникает, когда сообщение разделяется между более одного сегмента TCP и флаг PSH устанавливается по меньшей мере, два из этих сегмента TCP.
Мне нужен способ правильного слияния сегментов для восстановления исходных сообщений. Я не могу полагаться на протокол, используемый для TCP.
Спасибо!
Edit: В Wireshark, когда вы делаете следовать протоколу TCP потока, это не обязательно знать протокол по протоколу TCP, но он может показать каждый запрос и ответ в различных цветах. Как это можно сделать? Я ищу ту же функциональность, потому что в моей ситуации никогда не будет второго запроса до получения ответа в потоке. Спасибо