Linuxは、パケットの損失なしにリンクが処理できるよりも多くのパケットをアプリケーションが送信するのを防ぎますか?

Linuxは、パケットの損失なしにリンクが処理できるよりも多くのパケットをアプリケーションが送信するのを防ぎますか?

問題をより明確に説明することはできないため、以下は例示的なシナリオです。

10Mbpsの帯域幅を持つ物理インターフェイス(または10Mbpsに速度を制限するtcトークンバケットフィルタ付きの高速インターフェイス)を介してIPネットワークに接続されているLinuxシステムがあるとします。

リモートシステムでiperf UDPサーバーを起動します(同じ速度または高速リンクを使用)。

iperf -s -u -i 1

ローカルコンピュータでbw = 20 Mbpsでiperfクライアントを起動します。

iperf -c <server ip> -u -i 1 -b 20M

観察する:発信者は、10Mbpsの速度(tc qdiscのハードウェアまたはリンク層で定義されている)を決して超えません。

発信者は毎秒 20Mbit のパケットをプッシュし、インターフェイスのローカル tx キューが蓄積し、パケット損失が発生し始めると予想します。しかし、これは本当ではありません。なぜ?

Linuxカーネルのnet / schedフォルダを見てみましたが、この動作の原因が見つからないようです。

ご協力ありがとうございます。また、タイトルの関連性を高めるために自由にタイトル変更を提案してください。

答え1

これはという機能によるものです。自動交渉、これは以下で発生します物理層。カーネルに関する限り、リンク(接続)は10Mbpsの帯域幅しか処理できず、iperfはおそらくこの最大接続速度に準拠しています。

良い人がここにいます。https://networkengineering.stackexchange.com/このインタラクションについてもっと質問がある場合は、もっと詳しく知ることができます。

答え2

ローカルシステムは、スタック上に転送されるNICの帯域幅によって制限されます。この値に基づいてトラフィックを制限します。

パラレルストリーム(-P)オプションを使用して、それぞれNICレートに制限されますが、すべて10 mb / sをプッシュしようとする複数のストリームを作成できます。

答え3

概して言えば、通常、パケットは保存後転送と同じ方法で「バケット」と呼ばれるものに格納され、事前定義された帯域幅を確保するために時間の経過とともにネットワークを介して送信されます。必ず廃棄されるわけではありません。そのため、使用するQoS方式、監視するクライアントの数、および一般的な構成によって、CPUとメモリのコストが急速に増加する可能性があります。

複数のOSIレベルでサービス品質(QoS)を実装できます。これは、Squidプロキシサーバー、RouterOSインターフェイス、または特定のネットワークプロトコルの各ポートを介して権限を付与することによって実行できます。

ありがとうございます。

関連情報