4

UDP を使用して、以下の間の座標などの大量のデータを送信することにしました。

  • クライアント [C++] (ポーリングを使用)
  • サーバー [JAVA] [Apache MINA]

転送中の断片化を可能な限り回避するために、私のデータグラムは最大 512 バイトのみです。

各データグラムには、監視できるように、追加したヘッダー (内部に ID を含む) があります。

  • 受信したデータグラムの数
  • どれを受け取るか

問題は、データグラムの送信が速すぎることです。私たちは最初のもののように受け取り、大きな損失を被り、それからいくらかの損失を被り、また大きな損失を被ります。受信したIDデータグラムの並びは[1]、[2]、[250]、[251]……のようになります。

問題はローカルでも発生しています(ローカルホストを使用、ネットワークカード1枚のみ) データグラムを失うことは気にしませんが、ここではネットワークによる単純な損失ではありません(対処できます)

ここでの私の質問は次のとおりです。

  • クライアントで、どうすれば最高の結果を得ることができますか:
    • 設定、またはソケット設定?
    • できるだけ多く送信する方法はありますか?
  • サーバーでは、Apache MINA は ~「バッファ ソケットのサイズ」~ を自分で管理していると言っているようですが、まだ注意すべき設定はありますか?
  • 通常のファイルをダウンロードするときに、接続で少なくともこの帯域幅を使用できることを知って、1MB/s のような値に到達することは可能ですか?

現在、最大 4KB の座標情報を転送したい場合、転送が完了するまでに 5 分以上待機するためにスリープ時間を追加する必要があります。これは、毎分少なくとも 10MB を送信する必要があることを知っている私たちにとって大きな問題です。情報をコーディネートします。

4

2 に答える 2

2

信頼性の高いトランスポートが必要な場合は、TCP を使用する必要があります。これにより、ネットワークとクライアントの遅い方とほぼ同じ速度で、損失なく送信できます。

信頼性を必要としない、高度に最適化された低遅延トランスポートが必要な場合は、UDP が必要です。これにより、ネットワークが処理できるのとまったく同じ速度で送信できますが、クライアントが読み取れるよりも高速または高速に送信することもでき、パケットが失われます.

きめの細かい制御を備えた、信頼性の高い高度に最適化された低遅延トランスポートが必要な場合は、UDP の上に TCP のカスタム サブセットを実装することになります。これを行うことができる、または行うべきではないようです。

... 最適な設定またはソケット設定を取得するにはどうすればよいですか

通常、実験による。

クライアントが遅いためにパケットが失われている場合は、クライアントを高速化する必要があります。より大きな受信バッファーは、一定量のヘッドルームを購入するだけですが (バーストを吸収するなど)、体系的に遅い場合は、適切なサイズのバッファーが最終的にいっぱいになります。

ただし、これは過剰または回避可能なドロップのみを修復することに注意してください。さまざまなネットワーク スタック レイヤー (単一のボックスを離れなくても) は、クライアントが追いつくことができる場合でもパケットをドロップすることが許可されているため、カスタムの再送信ロジックなしでは信頼できるものとして扱うことはできません (TCP の実装に戻ります)。 .

… やりすぎずに、できる限り送る方法は?

ある種の ack/nack/back-pressure/throttling/congestion/レシーバーからソースへのメッセージが必要です。これはまさに TCP が無料で提供するものであり、自分でうまく実装するのは比較的難しいものです。

1MB/sのようなものに到達することは可能ですか...

ループバックで scp を使用して 8MB/s を見たので、yesと答えます。これはTCPを使用し、ファイルをオンザフライで暗号化および復号化するためにAES128を選択したようです-プレーンテキストを送信するだけであれば、同等のパフォーマンスを得るのは簡単です。

于 2015-10-01T13:56:15.630 に答える