9

多数の TCP パケットに分割された大きな HTTP パケットがある場合、それらを単一の HTTP パケットに再構築するにはどうすればよいですか? 基本的に、HTTP パケットがいつ開始/終了するかを知るには、パケットのどこを見ればよいでしょうか? HTTP パケットの開始または終了を示すフラグ/フィールドが TCP ヘッダーに表示されないようです。

編集:応答のフォローアップ。TCP がストリームを管理する場合、ストリームの開始時と終了時をどのように認識しますか? それはソケットの開閉によって決まりますか?一部のプロトコルは、あるレベルで、HTTP ストリーム/パケットがいつ開始され、いつ終了したかを認識できなければなりません。それが私が知りたいことです。

私がいる状況は、C# で TCP パケットを読み取るパケット スニファーを使用しており、HTTP 要求/応答などを再構築できるようにしたいと考えています。Wireshark やその他のさまざまなスニファが管理する方法のように、インターフェイスを通過します。または、より高いレベルで HTTP ストリームを利用できる C# ライブラリがあり、HTTP ストリーム/パケットを自分で再構築する必要がありませんか?

ありがとう。

4

6 に答える 6

14

OK私はこれを行う方法を考え出しました(危険ですが、仕事は完了します)。

イーサネット、IP、および TCP ヘッダーを取り除くのは簡単で、「生の」データ メッセージが残ります。メッセージ内を調べると、パケットの先頭にある「HTTP/1.1 ...」を探すことで、HTTP パケットの先頭かどうかを簡単に検出できます。これは、パケットが HTTP ストリーム/より大きなパケット/その他の開始であることを示します。HTTP パケット全体の合計長である「Content-Length」フィールドを読み取るために、簡単な解析を行うこともできます。

ソース/宛先 IP およびポート番号を使用して、リンクの一意の ID を形成することもできます。そのため、ヘッダー パケットを受信したら、これら 4 つのこと (SRCIP、SRCPORT、DESTIP、DESTPORT) に注意してください。次にこのポート/IP の組み合わせに一致するパケットを受信したときに、それが HTTP パケットの次の部分であるかどうかを確認できます。シーケンス番号を使用して、いくつかの検証やおそらく他のことを行うことができますが、通常、パケットは順番に並んでいるので問題ありません。HTTP ストリームごとに新しいポートが開かれるため、ストリームの一部ではないランダムなパケットを受信するべきではないと思いますが、これはエラーが発生しやすい領域になる可能性があります。

とにかく、このパケットを受信したら、もう一度ヘッダーを取り除き、生のメッセージを取得します。メッセージの既知の部分に追加します。これまでに受信したメッセージの合計の長さが、「Content-Length」フィールドから読み取った長さと等しい場合、パケットは完了です!

この方法は明らかに大量のエラーが発生しやすい傾向がありますが、非常に堅牢な方法を求めているわけではありません。他の誰かが将来この同じ問題に遭遇した場合に備えて、自分の質問に答えると思いました! スニッフィング頑張ってください :D

于 2009-10-08T04:15:31.797 に答える
8

HTTP 要求の境界を決定するために、TCP レベルからの情報を使用しないでください。TCP は、信頼できるバイト ストリーム サービスを提供します。TCP には、これに役立つフィールドやフラグはありません。

HTTP 要求の境界がどこにあるかを判断するには、RFC 2616 に従う必要があります。境界は明確に定義されており、受信したデータを解析することで判断できます。

于 2009-10-07T05:41:20.550 に答える
5

各 TCP パケットでは、ペイロード データの開始は TCP ヘッダーの直後であり、ペイロード データの終了は IP パケットの終了です。

TCP ヘッダーの末尾は簡単に見つかります。これData Offsetは、ヘッダーの長さを 32 ビット ワードで含むヘッダー内の 4 ビット フィールドです (8 ビット バイトの長さを取得するには、4 を掛けます)。

フィールドの TCP シーケンス番号を使用してSequence、ペイロードを正しい順序で並べます。再送信の場合、重複がある可能性があることに注意してください。

于 2009-10-07T06:30:07.220 に答える
3

TCP はストリームプロトコルであり、パケット プロトコルではありません。アプリケーション層 (つまり、ユーザー) は、一連のパケットではなく、データのストリームを取得します。ストリームからバイトを読み続けるだけで、HTTP ペイロード全体を取得できますが、TCP はその下でエラー チェック、再送信などを行います。

于 2009-10-07T05:47:28.853 に答える
3

Xplico という名前のオープン ソース プロジェクトのコードを使用できます: http://www.xplico.org

于 2010-06-23T10:03:59.670 に答える
2

同じ問題の解決に取り組まなければなりませんでした。コア機能の一部をオープンソース プロジェクトから抽出することができました。

http://code.google.com/p/pcap-reconst/

それをチェックして、それがあなたを助けるかどうか私に知らせてください.

于 2009-11-12T16:55:32.583 に答える