私の知る限り、一方がデータを受信し、もう一方が受信しない(両方の方法で)ケースが存在します。ここで詳細の一部が間違っている可能性がありますが、誰かが私を修正してくれると確信しています.
Pcap はさまざまなメカニズムを使用してインターフェースをスニッフィングしますが、一般的なケースの仕組みは次のとおりです。
- ネットワーク カードがパケットを受信します (ドライバーは割り込みを介して通知されます)。
- カーネルはそのパケットを適切なリッスン キューに配置します。
- TCP スタック。
- インターフェイスがブリッジされている場合は、ブリッジ ドライバー。
- PCAP が使用するインターフェース (生のソケット接続)。
- これらのバッファは、互いに独立してフラッシュされます。
- TCP ストリームが組み立てられ、データがプロセスに配信されます。
- ブリッジが適切な接続されたインターフェイスにパケットを送信するとき。
- PCAP として、受信したパケットを読み取ります。
両方のプログラムが両方のパケットを受信することを保証する難しい方法はないと思います。これには、バッファーがいっぱいになったときにバッファーをブロックする必要があります (そして、飢餓、デッドロック、あらゆる種類の問題につながる可能性があります)。イーサネット以外の相互接続でも可能かもしれませんが、一般的な哲学はベスト エフォートです。
ただし、システムの負荷が高い場合を除き、損失率は非常に低く、ほとんどのパケットはすべて受信されると言えます。バッファ サイズを大きくすることで、損失のリスクを減らすことができます。簡単なグーグル検索でこれを調整しましたが、他にも何百万もの方法があると確信しています.
確実な保証が必要な場合は、ネットワークのより強力なモデルが必要だと思います。この種のタスクにはNetgraphが優れていると聞いたことがあります。パケットを検査する物理的なボックスをインストールすることもできます (取得できる最も難しい保証です)。