2012-04-17 4 views
1

1台のコンピュータから別のコンピュータにパケットを送信する場合、1つのイーサネットケーブルで直接接続している場合は、受信側のコンピュータをUDPで定期的にポーリングする方が速いか、送信者がパケットを "受信コンピュータ?定数ポーリング、またはJava RMI?

パフォーマンスのばらつきがあったのはわかりませんでしたか?

+0

もっと早く?誰のため? 「常に投票する」という意味はどういう意味ですか? UDPデータグラムを受信するための通常の手法は、 'receive()'メソッドでブロックする別のスレッドであり、 '常にポーリングする'ものではありません。 – EJP

+0

2台のコンピュータ間でシングルスレッドのJavaフレームワークを作成して、2台のコンピュータ間で送信できるメッセージの数をベンチマークしました。 while(true)ループを持っているかどうかわからず、常に新しいUDPメッセージをチェックするのが最速の方法でしょう。私はそれがあなたのすべての受信()であると推測していますか? – user997112

+0

それは '私の受信()'ではなく、DatagramSocketのreceive()であり、Javadocで言うことをします。シングルスレッドなどの追加の制約がある場合は、質問に記載する必要がありますが、RMIはシングルスレッドではないため、ダイスをロードしています。 – EJP

答えて

0

通常、受信確認応答を気にする必要がないため、送信に追加の確認応答オーバーヘッドがないため、UDPを実行する方が高速です。

TCPでは、データの送信元に確認応答が返されます。全二重通信は、受信データストリームを中断することなくこの確認の送信を行うことができる。ただし、の確認応答が送信者に返され、送信者がそれを処理するまでの時間を待たなければなりません。

両方のコンピュータがデータストリーム処理を処理するのに十分高速であると想定されていますが、実際のコンピュータでは複数のタスクを実行することがあり、回線速度でネットワークトラフィックを処理できなくなる可能性があります。このようなシナリオでは、送信側コンピュータが十分な速さで肯定応答を受信できない場合(または受信側コンピュータがそれらを十分に高速に送信できない場合)、送信されていないパケットのウィンドウを使い果たす可能性があります。送信されたものは再送信を必要とするか、受信された。

しかし、UDPはバラのベッドではありません。レシートを受信しないと解決するため、パケットはいつでも予告なく消えてしまいます。このように、完全に送信する必要のないデータ(ライブボイス、ドロップした場合は「すべて」よりも「今」パケットで開始することが重要です)、または再送信が管理されているデータより効率的なアプリケーション固有のアルゴリズムによって実現されます。

+0

あなたの答えをありがとう。私は本当にTCPとUDPを尋ねていませんでした。新しいデータがあることを警告しています。私の心配は、常にポーリングができるだけ早くパケットを受信する最も効率的な方法ではないということですか?これはできるだけ早くパケットを受信するための最良の方法ですか? – user997112

+0

Java RMIは通常TCPで実装されているため、RMIはRMIの 'on top of 'TCPなので、追加のプロトコルが一番上にあるTCPです。 UDPでは、プロトコルを一番上に構築する必要があります。特定のシナリオでは、TCPを簡単に勝てますが、一般化されたシナリオではTCPを再実装します。 –

+0

こんにちはエドウィン、あなたは私の元の質問の下に私のコメントを見ることができるかどうかは分かりません。私は、あなたがそれを聞いたならば、Java Disruptorのパターンに似た、コンピュータ上で受信できるメッセージの数をテストしたいと思います。これは私の質問の由来です。参照してください:http://www.slideshare.net/JAX_London/java-core-understanding-the-disruptor-a-beginners-guide-to-hardcore-concurrency-trisha-gee-mike-barker – user997112