-1

ネットワーク経由でデータを送信する Linux カーネルでドライバーを作成しています。ここで、送信するデータ (バッファー) がカーネル空間にあるとします。ソケットを作成せずにデータを送信するにはどうすればよいですか (まず第一に、それはまったく良い考えですか?) 簡単なコーディングではなく、コードのパフォーマンスを探しています。そして、レシーバーエンドをどのように設計しますか?ソケット接続なしで、受信側でデータを取得して表示できますか (どのように) ? そして、バッファがユーザー空間にある場合、このすべてが(パフォーマンスを含めて)変更されますか(そうであれば、ユーザーからのコピーを行います:-))?

4

2 に答える 2

0

ソケットを使用せずにネットワーク上でデータを送信する場合は、ネットワーク ドライバーにフックし、それらを介して raw パケットを送信し、ハイジャックしたいパケットの受信パケットをフィルター処理する必要があります。パフォーマンス上の利点がこれを保証するほど大きくなるとは思いません。

ネットワークドライバーにこれに対する通常のフックがあるとは思いません。過去にファイアウォールを実装するために関連することをしました。ネットワークドライバーから受信側に接続するために、netfilter フックを使用して同様のことを行うことができると考えられます。

于 2012-07-10T11:16:29.567 に答える
0

おそらくnetlinkを使用する必要があります。実際に離れたホストと (たとえば TCP/IPv6 を介して) 通信したい場合は、そのためにユーザーレベルのプロキシ アプリケーションを使用します。(したがって、カーネルモジュールはアプリケーションプロキシへのnetlinkを使用します。これは、TCPを使用しsshたり、HTTPを介してデータをリモートで送信したり、ディスクに保存したりできます...)。

そうでなければ、カーネルモジュールが離れたホストと直接通信することは意味がないと思います(たとえば、セキュリティの問題、フィルタリング、ルーティングなどiptables)。

そして、本当のボトルネックはほとんどの場合、(物理) ネットワークそのものです。1 ギガビット イーサネットは、ほとんどの場合、カーネル モジュールまたはアプリケーションが持続的に生成できるものよりもはるかに低速です (また、遅延の問題もあります)。

于 2012-07-06T21:09:27.933 に答える