работая в C #, я использую SharpPCap для получения сегментов из трассировки winpcap.
Мне нужно перестроить все сообщения, отправленные и полученные в этой трассировке.
В моей ситуации 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.
Спасибо!
Редактировать:
В wireshark, когда вы следуете по tcp-потоку, он не обязательно знает протокол по tcp, но способен отображать каждый запрос и ответ разными цветами. Как это может сделать это? Я ищу ту же функциональность, потому что в моей ситуации никогда не будет второго запроса до получения ответа в потоке.
Спасибо