2012-02-21 18 views
3

Scenarionに失われたパケットをUDPことができます。それはパケットを失うように見えますが、ルータの無線を通して第2のマシンに接続するときには発生しません。ちょっと残念ですが、問題は私の論理ではなく、単純なケースではパケットが受信されないということを知るのに14時間を費やしただけです。は本当にPC自体に接続

私は自分自身に...

sender.start(); 
    receiver.start(); 

を接続するとき、私はスレッドまたはNICSの本質とは何かであると信じ異なるベンチマーク2台のノートパソコンを持って、両方の緩いパケット。私が正しく受信したか、それともモードを変更するかを覚えていれば、2つのスレッドのためにそれに追いつかないでしょうか?私は間違っていますか?

どうしてですか?

+0

私はあなたを助けることができるように、より多くの情報を提供してください! – Zeveso

+0

コードやロジックを実際に投稿することはできません。しかし、文字通り現時点ではすべてのロジックを削除し、メソッドの送受信のみが呼び出されます。 – Aubergine

答えて

3

質問には言及していないので、違いがあるかどうかを確認するためにUDP受信バッファのサイズを増やすことをお勧めします。

これにより、ネットワーク経由でアプリケーションを実行しているときにパケット損失が少なくなります(遅かれ早かれパケット損失も発生します)。

AFAICTこれはJavaでSocket.setReceiveBufferSizeを使用して実行できます。

+0

ええ、バッファサイズが原因です。しかし、私はsetReceiveBufferSizeなしでそれをしました。昨日(9999999999)のコードで人工的な遅延を導入しました:-)問題は、大規模なデータ構造を蓄積し、ループを介してすべてを送信しようとしたときでした。私は本当にJavaがそれほど速くなることは決してありませんでした。あなたが一番近いからあなたを受け入れます。 – Aubergine

2

正直言って、VOIPはそれがそうした方法で設計されているため、パケットが緩んでしまいます。

どのくらいのパケットが失われているのかわかりませんが、各シナリオでは答えが悪いです。すべてのパケットを失う

  1. :おそらく原因プロセッサの速度に:おそらくないパケットを受信または大量に失う右のアドレス
  2. に接続していないが原因。暗号化している場合は、コンピュータがデータを送信するのが難しい場合があります。時間内に暗号化されない場合、データは送信されません。データが遅く受信された場合、データは破棄されます。
  3. 少量を失う:これは当然であり、起こるはずです。 VOIPは順番に再生されなければならず、既に再生されているはずのパケットが入ってきたら、何もできません。これが落とされた理由です。

「UDPは、信頼性、順序、またはデータの整合性を提供するための暗黙のハンドシェイクの対話なしに、簡単な伝送モデルを使用しています。したがって、UDPは信頼できないサービスとデータグラムを提供し、順不同で到着することが重複表示され、または予告なしに行方不明にUDPは、ネットワークインターフェイスレベルでのこのような処理のオーバーヘッドを避けるために、エラーチェックと訂正が不要であるとみなします。時間の影響を受けやすいアプリケーションは、UDPを使用することがよくあります。ネットワークインターフェイスレベルでエラー修正機能が必要な場合、アプリケーションはこの目的のために設計された伝送制御プロトコル(TCP)またはストリーム制御伝送プロトコル(SCTP)を使用することができます。 - Wiki(Link

+0

理想的な条件の下で7-12のバーストが発生することがあります。これは私のインターリーバーのためのキラーです。私はあなたに同意しますが、3つのポイントがあります:1.私は、文字通り、すべての方法を送ったり受信したりすることをコメントしました。パケット番号の割り当てとスタブの送信以外は何もしません。 2.ネットワーク上に2台のPCが接続されていると、NOパケットが失われます。私は正しく耳を傾けます、私のコードは、宛先マシンに到達できない場合、例外をスローします。 – Aubergine

1

UDPは、損失したパケットを再送信しない損失のあるプロトコルです。 localhostに接続しているときに、パケットがワイヤを介して失われないという前提で正しいです。しかし、パケットを失う別の方法があります:受信者のウィンドウがいっぱいです!

下にあるアプリケーションが十分に速くパケットを処理できないため、オペレーティングシステムの受信バッファがいっぱいになると、パケットが失われます。問題は今、次のとおりです:なぜこれはlocalhostでは起こり、ネットワーク接続では起こりませんか?いくつかの推測があります:

  1. あなたはVOIPで作業しています。たぶん、コーデックは、ネットワークの速度が常にボトルネックになるという前提を立てていますか?いくつかのプロトコルは、チャネルがまだ飽和していない(パケット損失なし)と見なした場合に、受信機がより高いビットレートを要求できるようにする。テスト中にシステムはどのように負荷されますか?
  2. あなたのスレッドの優先度が違うと、受信機が決してアクティブにならないことがあります。
  3. いくつかの共通リソース(つまり、シングルスレッドデコードライブラリへのアクセス)に対するロック競合があり、送信者が優先される可能性があります。

2つの異なるJVMから送信者と受信者を試してみてください。実際の状況をより詳しくシミュレートします。 localhostに送信する場合は、wait(20ms)を実行して、送信者に遅れを導入してください。

関連する問題