4

ショートバージョン。OSバッファから実際にデータを削除せずにファイル記述子から読み取ることができるLinux APIはありますか(read()に似ています)? read() を front() (削除せずに読み取る) と pop() (削除) に相当するものに分割する方法。

シナリオ。独自のネットワーク スタックを介して IP データグラムを配信するために使用する TUN デバイスがあります。問題は、特に上記のアプリケーションが UDP を使用している場合、TUN デバイスが OS によってデータでフラッディングされる可能性があり、スタックが十分に高速に管理できないことです。

ゴール。やりたいこと: データグラムが TUN デバイスに到着したらすぐに、カーネル バッファーから削除せずに読み取り、データグラムを検査し、以下の残りの独自プロトコル スタックで処理できるかどうかを判断し、処理できる場合はポップします。 () カーネル バッファからのデータ、それ以外の場合はそこにデータを保持します。

なぜ。カーネル バッファから pop() しないことが違いを生む理由は、上記のアプリケーションが、ネットワーク プロトコルの下位層が混雑していることを実際に認識することができるためです (ネットワーク インターフェイスを介した独自の write() または send() が失敗するため)。 )、それに応じて行動します。通常の read() のようにデータが削除された場合、アプリケーションは輻輳について何の手がかりも持たず、フラッディングを続けます。

4

1 に答える 1

0

ソースが利用できるので、いつでもそのようなオプションを書くことができます。

オプションを使用iptablesして、パケットを 2 番目のインターフェイスに複製し、そこから読み取ることもできます。原本は未読のままです。-j TEE

最良の答えではありません、同意します...

于 2015-04-25T18:06:22.067 に答える