ネットワーク経由でデータを送信する Linux カーネルでドライバーを作成しています。ここで、送信するデータ (バッファー) がカーネル空間にあるとします。ソケットを作成せずにデータを送信するにはどうすればよいですか (まず第一に、それはまったく良い考えですか?) 簡単なコーディングではなく、コードのパフォーマンスを探しています。そして、レシーバーエンドをどのように設計しますか?ソケット接続なしで、受信側でデータを取得して表示できますか (どのように) ? そして、バッファがユーザー空間にある場合、このすべてが(パフォーマンスを含めて)変更されますか(そうであれば、ユーザーからのコピーを行います:-))?
2 に答える
ソケットを使用せずにネットワーク上でデータを送信する場合は、ネットワーク ドライバーにフックし、それらを介して raw パケットを送信し、ハイジャックしたいパケットの受信パケットをフィルター処理する必要があります。パフォーマンス上の利点がこれを保証するほど大きくなるとは思いません。
ネットワークドライバーにこれに対する通常のフックがあるとは思いません。過去にファイアウォールを実装するために関連することをしました。ネットワークドライバーから受信側に接続するために、netfilter フックを使用して同様のことを行うことができると考えられます。
おそらくnetlinkを使用する必要があります。実際に離れたホストと (たとえば TCP/IPv6 を介して) 通信したい場合は、そのためにユーザーレベルのプロキシ アプリケーションを使用します。(したがって、カーネルモジュールはアプリケーションプロキシへのnetlinkを使用します。これは、TCPを使用しssh
たり、HTTPを介してデータをリモートで送信したり、ディスクに保存したりできます...)。
そうでなければ、カーネルモジュールが離れたホストと直接通信することは意味がないと思います(たとえば、セキュリティの問題、フィルタリング、ルーティングなどiptables
)。
そして、本当のボトルネックはほとんどの場合、(物理) ネットワークそのものです。1 ギガビット イーサネットは、ほとんどの場合、カーネル モジュールまたはアプリケーションが持続的に生成できるものよりもはるかに低速です (また、遅延の問題もあります)。