2017-12-21 15 views
2

を送信するには、私は現在、802.11フレームのための最適な送信パフォーマンスを取得しようとしてる、私はlibpcapのを使用していますが、私は生のソケット(または任意の他の可能な方法)を使用して、それをスピードアップすることができれば、私は疑問に思いました。rawソケット対libpcapのパフォーマンス

は既に以前に作成したデバイスハンドル付きのlibpcapのためのこの単純な例のコードを検討:

char ourPacket[60][50] = { {0x01, 0x02, ... , 0x50}, ... , {0x01, 0x02, ... , 0x50} }; 

for(; ;) 
    { 
     for(int i; i = 0; i < 60; ++i) 
     { 
      pcap_sendpacket(deviceHandle, ourPacket[i], 50); 
     } 
    } 

このコードセグメントはそれぞれ別々のCPUコアのスレッドで行われます。アレイに格納されているRadiotapヘッダーを含むraw 802.11フレーム/パケットに対して、これを行うもっと速い方法はありますか?

pcapのソースコードをpcap_inject(同じ機能ですが異なる戻り値)と見て、パケットを送信するためにrawソケットを使用していないようですか?全く分からない。

他の多くの質問に答えたので、私はパフォーマンスのキャプチャには気をつけません。 rawソケットはレイヤ2パケット/フレームを送信する場合でもですか?

+1

あなたは使用しているOSを指定していません。 libpcapはクロスプラットフォームなので、大きな違いがあります。私が最もよく知っているlinuxを仮定すると、すでにrawソケットを使用しています。しかし、私はあなたが単一のシステムコール(そしてAFAIKは現在libpcapでサポートされていない*)だけであなたのパケットの配列全体を送ることができると信じている 'PACKET_TX_RING'を調べることができます。この設定を行うにはかなりの学習曲線があります。 –

+0

私はLinuxを使用しています。上記の例では、完全な野生の推測と同様に、未処理のソケット実装に対応するためにいくつの変更を行う必要がありますか?私はたくさんいると思いますか?私は構造体のような別のフレームレイアウトを使用する必要がありますか?それとも、私の配列に格納されている既に作成済みのフレームを正常に送信できますか? libpcapがそれを処理するので、私はそれらから抜けているのはチェックサムだけだと信じています。 – RSS

+1

フレーム構造は変わりません。単なるバイト配列です。しかし、それらを組み立てるか、tx_ringメモリにコピーする必要があります。 –

答えて

1

Gill Hamiltonが述べたように、答えは多くのことに依存します。あるシステムでスーパーゲインが見られる場合、両方が「Linuxを実行中」であっても、別のシステムでスーパーゲインを見ることはできません。 自分でコードをテストした方が良いです。それは私のチームが見つけたものからの情報です:

注1:すべての利点は、フレーム/パケットをソケットに書き込むだけでなく、それらを分析して処理した可能性が高いためです私たちの利益のほとんどまたはほとんどが、読み書きよりもむしろそこにあったのです。

私たちはイーサネットフレームとIPパケットを送受信するダイレクトローソケット実装を作成しています。私たちは、かろうじて80メガビットを持続扱うことができるMT7530内蔵イーサネットNIC /スイッチ付き、チップ上のMIPS 24K 5V系である私たちのmeasliest R & Dシステム上の250%-450%の性能向上について見ています。インテル®Celeron J1900およびI211ギガビット・コントローラーを搭載した非常に適度ではあるが、より厳しいテスト・システムでは、libpcapと比較して約50%-100%に低下します。実際には、Python dpkt/scapyの実装に対して約80%-150%しか見ていませんでした。 は、一般的なi5 Linuxデュアルギガビットシステムとc libpcapの実装で約20%の増加が見られました。したがって、厳密ではないテストに基づいて、システムに応じてコードのパフォーマンスが最大20倍向上しました。

注2:カスタムcコードのコンパイル時に最大限の最適化と厳密なコンパイルパラメータを使用した場合、これらのすべての利点がありましたが、必ずしもc libpcapコードでは必要ありません(上記のシステムの警告エラーがすべてlibpcapコードはコンパイルされず、誰がそれをデバッグしたいのですか?)、その違いはそれほど劇的ではありません。 5.0Vと1.5Aを超えない複雑なパケット処理を可能にするためには、最後のパフォーマンスを徹底的に絞り込む必要があります。そのため、最終的にはFPGAのカスタムASICを使用していきます。つまり、バグがなくても動作させるのはたくさんの作業であり、イーサネット/ IP/TCP/UPDスタックの重要な部分を実装する可能性が高いため、推奨しません。

最終注:MIPS 24Kシステム上のCPU使用率が1/10程度カスタムコードのためだったが、再び、私はそのゲインの大半が処理からだったと言うでしょう。

関連する問題