UDP ベースのアプリケーション プロトコルは、必然的にパケット損失、並べ替え、および (場合によっては) 重複の影響を受けやすくなります。UDP の「U」は、Unreliable Datagram Protocol のように「Unreliable」を表す場合があります。(わかりました、それは実際には「ユーザー」の略です...しかし、UDPの特性を覚えるには確かに良い方法です。)
通常、UDP パケットの損失は、トラフィックがサーバーとクライアント間の 1 つまたは複数の「ホップ」のバッファ容量を超えているために発生します。これが発生すると、パケットがドロップされます...そしてUDPを使用しているため、これが発生しているというトランスポートプロトコルレベルの通知はありません.
アプリケーションで UDP を使用する場合、アプリケーションは UDP の信頼性の低い性質を考慮し、ドロップされたパケットや順不同のパケットを処理し、独自のフロー制御を行うための独自のメカニズムを実装する必要があります。(すでに過負荷になっているネットワークに影響を与える可能性があることを考慮せずに UDP パケットを爆発させるアプリケーションは、悪いネットワーク市民です。)
(TCP の場合、おそらくパケットもドロップされますが、TCP はドロップされたパケットを検出して再送信し、TCP フロー制御メカニズムが作動してデータ転送速度を低下させます。最終的な結果は「レイテンシー」です。 )
編集-OPのコメントに基づいて、彼の問題の原因は、クライアントが一定期間「リッスン」していなかったため、(おそらく)クライアントのOSによってパケットがドロップされたことです。これに対処する方法は次のとおりです。
パケットを読み取り、処理のためにキューに入れる専用の Java スレッドを使用します。
ソケットのカーネル パケット キューのサイズを増やします。
ただし、これらの対策を講じても、パケットがドロップされる可能性があります。たとえば、マシンが過負荷になっている場合、アプリケーションは、カーネルがパケットをドロップする前に、すべてのパケットを読み取ってキューに入れるのに十分な頻度で実行タイム スライスを取得できない可能性があります。
編集 2 - UDP が重複の影響を受けやすいかどうかについては、いくつかの議論があります。確かに、UDP には固有の重複検出または防止機能がありません。しかし、インターネットである IP パケット ルーティング ファブリックが自発的にパケットを複製する可能性が低いことも事実です。そのため、重複が発生した場合、送信者が UDP パケットを再送信することを決定したため、重複が発生する可能性があります。したがって、私の考えでは、UDP は重複の問題の影響を受けやすいですが、OS プロトコル スタックまたは IP ファブリックにバグがない限り、重複を引き起こすことはありません。