2

これが、この質問を生み出した元のリンクです。

したがって、明らかに DataGramSocket は受信したパケットをキューに入れません。そのため、2 つのシステムが同時に送信すると、パケットの 1 つが失われます (リンクからのコードを使用)。この場合、パケットのドロップを回避する方法を探しています。

4

2 に答える 2

2

データ (パケット) が失われないことを確認したい場合は、TCP を使用してください。

UDP の利点は、オーバーヘッドが少ないため、ビデオやゲーム ストリームなどの混雑したトラフィックの多い接続に使用されることです。オーバーヘッドが低い理由は、送信中にデータが失われないという保証がないためです。

あなたの質問から、欠落しているデータを気にしているように見えるので、これを検出するための対策を組み込む必要があります。適切に到着するまでデータを再送信したい場合はどうすればよいですか? これが TCP が提供するものです..!

データをドロップしているのが本当に Java である場合は、おそらくキューがいっぱいになっていることが原因です。UDP プロトコルは「終了」している可能性がありますが、Java はすべての「結果」を持つ UDP プロトコルがあることを認識しています。UDP は高スループット向けに設計されているため、Java 部分も同じ要件向けに設計されています。すべてをキューに入れると、UDP 設計とは逆に (大規模な) オーバーヘッドが発生するため、これはほとんどありません。さらに、キューからデータを削除することは、送信中にデータを失うこと (私見) と何ら変わりがないため、Java がデータを削除しても驚かない!

これを防ぎたい場合は、より大きなキューが必要で (満杯になる可能性もあります)、さらに重要なことに、キューに入れられたデータの処理を高速化する必要があります (キューが満杯になるのを防ぐため)。

しかし、最も重要なことは、データの損失を受け入れることです! アプリケーション/サーバーがこれを処理できない場合: UDP を使用しないでください

于 2013-01-25T08:01:27.540 に答える
1

キューはありますが、常に制限されており、常に制限に達する可能性があります。このような問題を完全に回避する方法はありません。サーバーの負荷を低くしてキューをすばやく空にし、UDP トラフィック専用のネットワークを使用することで、影響を最小限に抑えることができます。

一般に、失われたパケットの許容範囲を構築する必要があり、プロトコルを信頼できるものにする必要があります。

于 2013-01-25T08:02:31.787 に答える