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);
}
}
私のソリューションの問題は、クライアントが 2 つの要求を続けて送信する場合です。2 つのメッセージを 1 つにマージするだけです。私が変われば
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 セグメントの少なくとも 2 つに設定されている場合に問題が発生します。
セグメントを正しくマージして元のメッセージを再構築する方法が必要です。TCP で使用されるプロトコルに依存できません。
ありがとうございました!
編集: wiresharkでは、tcpストリームをたどると、必ずしもtcp経由のプロトコルを認識しているわけではありませんが、各リクエストとレスポンスを異なる色で表示できます。どうやってそれができるのですか?私の状況では、ストリームで応答が受信される前に 2 番目の要求がないため、同じ機能を探しています。ありがとう