架空のシナリオ: udpパケットストリームはマシンXに到着します。マシンXは、recv()でパケットをリスンしているプログラムとpcapを実行しているプログラムの2つのプログラムを実行しています。pcap unixのバッファリングはどのように機能しますか?
この場合、パケットはkernalによってポーリングされ、kernalsメモリのバッファに移動され、別の2つのバッファにコピーされるまで、インターフェイスに格納されますrecvでリッスンしているプログラム用のバッファと、pcapでリッスンしているプログラム用のバッファです。パケットは、次回pcap_next()またはrecv()のいずれかによって読み込まれると、それぞれのバッファから削除されます。これは正しいです?本当に4つのバッファが使用されていますか、それとも他の方法で処理されていますか?
このケースでどのようなバッファが実際にどのように関わっているか、どのようにパケットが一方から他方へ移動するかについて、できるだけ詳しく説明しています(パケットが移動する前にpcapsバッファにコピーされますか? after、またはundefined?)。
私はこれが大きな疑問のように思えますが、本当に気になるのは、パケットが格納される場所とそこにどれくらいの間滞在しているかです。弾丸ポイントは問題ありません。理想的には私は一般的な答えが欲しいですが、OSによって異なる場合はLinuxに最も興味があります。ネットワークデータをバッファする
Linuxはskbuffs(ソケットバッファ)を使用しています。
recv()関数はカーネルバッファを使いますが、各pcapインスタンスにはバッファのコピーがあります。これらのクローンはどの段階で作られましたか?パケットが受信されたときですか? pcapがそれを読んでみたいときは? – Benubird
各pcapインスタンスには、それぞれ独自のメタデータのコピーがありますが、すべて同じデータを共有します。クローンは、パケットが受信されると( 'skb_deliver()' IIRCで)作成されます。 – ninjalj