1

在 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上的协议,但它能够以不同的颜色显示每个请求和响应。它是如何做到的?我正在寻求相同的功能,因为在我的情况下,在流中收到响应之前永远不会有第二个请求。谢谢

4

1 回答 1

0

仅通过观察线路上的流无法知道原始应用程序代码是如何写入套接字的。您正在谈论使用在某些情况下可能会出现但您不能依赖它们的提示(正如您所发现的那样)。

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);

所有这三个示例都是编写 HTTP 查询的合法方式。这三个在电线上看起来都一样。当然,最后一个很有可能不同,即使它意味着同样的事情(想象睡眠不是明确的,但可能是由于从磁盘上读取 cookie 引起的)。即使如此,如果在两次写入发生时特定的 TCP 套接字因重试而被推迟,则最后一个可以折叠成单个传输。第二个示例可能仅基于接口上的其他负载(或 CORK 等套接字选项)显示为一个或两个数据包。

于 2010-10-22T00:20:12.537 回答