Linuxユーザースペースで作成した単純なUDPクライアント/サーバーアプリケーションでは、UDPクライアント(1Gbitイーサネットインターフェース)が100MbitイーサネットインターフェースUDPサーバーにのみ1Gbitのデータを送信していることがわかりました。もちろん、これはサーバー側で多くのパケット損失を引き起こします。
クライアント側で、次の手順を実行してNIC設定を調整する必要がありました。
ethtool -s eth0 スピード 100 デュアル完全自動調整オン
なぜ私はこれをするべきですか?自動的に処理してはいけませんか?
答え1
UDPプロトコルこれは「実行後に忘れてしまう」送信方法なので、パケットが送信された後に何が起こっても構いません。これは、宛先への経路の特性にかかわらず、ソースシステムの送信速度で送信できることを意味する。ソースインターフェイスがネットワークが処理できるよりも速くパケットを送信すると、明らかにパケット損失が発生します。
これを自動的に処理する必要がある場合は、TCPまたはSCTPに切り替える必要があります。あるいは、UDPの上に独自のエラー処理プロトコルを構築することもできます。
特定の場合、宛先に到達するために100 Mbits / sを使用できる場合は、すべてのトラフィックを100 Mbits / sインターフェイス速度に制限するよりも、クライアントでトラフィック調整を使用する方がよいでしょう。
答え2
Stephenがすでに指摘しているように、UDPは望む手段を欠いています。
アプリケーションが見た目ほど愚かな場合は、ipip
ホスト間で仮想インターフェイスを設定し()、トラフィック調整を使用して()使用される帯域幅を制限することで速度を減らすことができます。ip link
tc
答え3
他の回答で正しく指摘したように、UDPフロー制御はレイヤ7で管理する必要があります。
あなたがアプリケーションの唯一の作者である場合は、そのアプリケーションのオプションを定義できます。
- 1秒あたりに送信されるメッセージの数を定義します。
- または、将来のリリースへのトラフィックをどれだけ早く生成するか。
- または、マルチキャストでない場合は、より多くのデータを送信するためにクライアントからの一種の承認を待ちます。