4

コンピューター上で実行されている 2 つのプログラムがあるとします (単純化のために、Linux で実行されている唯一のユーザー プログラム)。そのうちの 1 つは recv() を呼び出し、もう 1 つは着信パケットを検出するために pcap を使用しています。パケットが到着し、pcap を使用するプログラムと recv を使用するプログラムの両方によって検出されます。しかし、これら 2 つのうちの 1 つがパケットを取得できない場合 (たとえば、recv() が pcap_next() への呼び出しの間に戻る) はありますか?

ここでバッファリングシステムがどのように機能するか本当に理解していないので、より詳細な説明が必要です-これらのプログラムの1つがパケットを認識し、他のプログラムが認識しないという考えられるケースはありますか? もしそうなら、それは何であり、どうすればそれを防ぐことができますか?

4

1 に答える 1

2

私の知る限り、一方がデータを受信し、もう一方が受信しない(両方の方法で)ケースが存在します。ここで詳細の一部が間違っている可能性がありますが、誰かが私を修正してくれると確信しています.

Pcap はさまざまなメカニズムを使用してインターフェースをスニッフィングしますが、一般的なケースの仕組みは次のとおりです。

  • ネットワーク カードがパケットを受信します (ドライバーは割り込みを介して通知されます)。
  • カーネルはそのパケットを適切なリッスン キューに配置します。
    • TCP スタック。
    • インターフェイスがブリッジされている場合は、ブリッジ ドライバー。
    • PCAP が使用するインターフェース (生のソケット接続)。
  • これらのバッファは、互いに独立してフラッシュされます。
    • TCP ストリームが組み立てられ、データがプロセスに配信されます。
    • ブリッジが適切な接続されたインターフェイスにパケットを送信するとき。
    • PCAP として、受信したパケットを読み取ります。

両方のプログラムが両方のパケットを受信することを保証する難しい方法はないと思います。これには、バッファーがいっぱいになったときにバッファーをブロックする必要があります (そして、飢餓、デッドロック、あらゆる種類の問題につながる可能性があります)。イーサネット以外の相互接続でも可能かもしれませんが、一般的な哲学はベスト エフォートです。

ただし、システムの負荷が高い場合を除き、損失率は非常に低く、ほとんどのパケットはすべて受信されると言えます。バッファ サイズを大きくすることで、損失のリスクを減らすことができます。簡単なグーグル検索でこれを調整しましたが、他にも何百万もの方法があると確信しています.

確実な保証が必要な場合は、ネットワークのより強力なモデルが必要だと思います。この種のタスクにはNetgraphが優れていると聞いたことがあります。パケットを検査する物理的なボックスをインストールすることもできます (取得できる最も難しい保証です)。

于 2011-02-24T20:59:15.463 に答える