在 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 段之间拆分并且在这些 tcp 段中的至少两个上设置了标志 psh 时,就会出现问题。
我需要一种正确合并段以重建原始消息的方法。我不能依赖通过 TCP 使用的协议。
谢谢!
编辑: 在wireshark中,当你遵循tcp流时,它不一定知道tcp上的协议,但它能够以不同的颜色显示每个请求和响应。它是如何做到的?我正在寻求相同的功能,因为在我的情况下,在流中收到响应之前永远不会有第二个请求。谢谢