2011-02-23 12 views
11

架空のシナリオ: udpパケットストリームはマシンXに到着します。マシンXは、recv()でパケットをリスンしているプログラムとpcapを実行しているプログラムの2つのプログラムを実行しています。pcap unixのバッファリングはどのように機能しますか?

この場合、パケットはkernalによってポーリングされ、kernalsメモリのバッファに移動され、別の2つのバッファにコピーされるまで、インターフェイスに格納されますrecvでリッスンしているプログラム用のバッファと、pcapでリッスンしているプログラム用のバッファです。パケットは、次回pcap_next()またはrecv()のいずれかによって読み込まれると、それぞれのバッファから削除されます。これは正しいです?本当に4つのバッファが使用されていますか、それとも他の方法で処理されていますか?

このケースでどのようなバッファが実際にどのように関わっているか、どのようにパケットが一方から他方へ移動するかについて、できるだけ詳しく説明しています(パケットが移動する前にpcapsバッファにコピーされますか? after、またはundefined?)。

私はこれが大きな疑問のように思えますが、本当に気になるのは、パケットが格納される場所とそこにどれくらいの間滞在しているかです。弾丸ポイントは問題ありません。理想的には私は一般的な答えが欲しいですが、OSによって異なる場合はLinuxに最も興味があります。ネットワークデータをバッファする

Linuxはskbuffs(ソケットバッファ)を使用しています。

答えて

8

、Linuxの場合は、(BSD年代はmbufの代わりにskbuff Sを使用して、おそらくやや似ています)。 skbuffには、ネットワークデータに関するメタデータとそのデータへのポインタがあります。

タップ(pcapユーザー)はskbuffのクローンを作成します。クローンは新しいskbuffですが、同じデータを指しています。誰かがいくつかのskbuff(元のskbuffとそのクローン)によって共有されているデータを変更する必要がある場合、まず新鮮なコピー(コピーオンライト)を作成する必要があります。

誰かがもうスカボッフを必要としないときは、それはkfree_skb()です。 kfree_skb()は参照カウントをデクリメントし、その参照カウントがゼロになると、skbuffは解放されます。クローンを説明するのはやや複雑ですが、これは一般的な考え方です。

+0

recv()関数はカーネルバッファを使いますが、各pcapインスタンスにはバッファのコピーがあります。これらのクローンはどの段階で作られましたか?パケットが受信されたときですか? pcapがそれを読んでみたいときは? – Benubird

+0

各pcapインスタンスには、それぞれ独自のメタデータのコピーがありますが、すべて同じデータを共有します。クローンは、パケットが受信されると( 'skb_deliver()' IIRCで)作成されます。 – ninjalj

関連する問題