2017-07-19 9 views
-1

私は、サーバからの応答を返す機能を備えたUDP実装を持っています。クライアントは、指定された時間内にサーバから確認応答を受信しなかったパケットを再送します。クライアントは、第1パケットのサーバからの確認応答を待つ間に約10パケットを送信する。次に、確認応答が受信されない送信パケットを繰り返す。通常のシナリオでは、ネットワークのわずかな遅延で正常に動作します。送信キューから重複したUDPパケットを削除する方法

ラウンドトリップ遅延が少し重要な低帯域幅接続では、実際の問題が発生しています。クライアントは、確認応答のタイムアウトに基づいて送信キューにパケットを追加し続けます。この結果、多くの重複パケットがキューに追加されます。

重複しているパケットを送信キューに残らないようにするための洗練されたソリューションを試しました。どんな助けもありがとう。

もしパケットがNNミリ秒以内に送信されないならば、そのパケットはキューから取り除かれ、その周りにアルゴリズムを構築することができるように、パケットのプロパティをマーク/設定する方法があります。

+1

これらの問題を処理できるプロトコルを発明した人だけが...コネクション型で普遍的に実装されているもの... –

答えて

0

UDPには、TCPの場合のように重複検出が組み込まれていません。つまり、そのような検出は、アプリケーション自体が行う必要があります。アプリケーションが送信キューとやりとりできる唯一の方法は、データグラムを送信することです。パケットが送信キューに入る前に、送信側であらゆる種類の重複検出が行われなければなりません。

これは実際には送信してはいけない前のパケットと重複したパケットの場合、または元のパケットが失われたために送信する必要がある重複パケットが完全にアプリケーションのものである場合、そして、"NN ms以内に送信できません..."はタイマーなどでアプリケーションに実装する必要があります。さらに、SO_SNDBUFを使用して送信キューのサイズを減らすことによって、キューの制御を強化することもできます。

+0

本当の問題は、受信するACKパケットが(sendto関数)。これは、パケットがすでにアプリケーションのアルゴリズムを超えていることを意味します。 SO_SNDBUFの中に何が残っているかを見つけることができれば、アプリケーションレベルで重複検証を実行できます。私はSO_SNDBUFサイズを減らすことができますが、接続性が良い場合はパフォーマンスに影響します。 – MKR

+1

@ManojKumarRai:もう一度、アプリケーションが送信バッファからパケットを削除する方法はありません。 –

+0

解決策を探している問題が何であるか正確に。したがって、あるパケットがSendBufferキューにNNミリ秒以上送信された場合、そのパケットをキューから削除すると、そのパケットは役に立ちました。それ以外の場合は、帯域幅の狭いネットワークでキューが継続的に増加しています。 – MKR