18

ノンブロッキング TCP/IPSocketChannelSelectorNIO は、少数のスレッドで多くの TCP/IP 接続を処理するのに役立ちます。しかし、UDP はDatagramChannelsどうですか? (私は UDP にあまり詳しくないことを認めなければなりません。)

DatagramChannelがブロッキング モードで動作していなくても、UDP 送信操作がブロックされないようです。DatagramSocket.send(DatagramPacket)渋滞などで通行止めになるケースって本当にあるの?そのようなケースがあるかどうか、および本番環境でどのようなケースが存在する可能性があるか、非常に興味があります。

DatagramSocket.send(DatagramPacket)が実際にブロックされず、接続されたポートを使用せず、1 つのポートのみにバインドする場合、 andDatagramSocketで非ブロック モードを使用する利点はありませんか?DatagramChannelSelector

4

3 に答える 3

17

Java の DatagramSockets や Channels などを使用してからしばらく経ちましたが、まだサポートを提供できます。

UDP プロトコルは、TCP のように接続を確立しません。むしろ、データを送信するだけで、それを忘れます。データが実際にそこに到達することを確認することが重要である場合、それはクライアントの責任です。したがって、ブロック モードであっても、送信操作はバッファをフラッシュするのにかかる間だけブロックされます。UDP はネットワークについて何も知らないため、ネットワーク速度をチェックせずに、または実際に目的の場所に到達したかどうかを確認せずに、できるだけ早い機会に書き込みます。したがって、あなたには、チャネルが実際にすぐに次の送信の準備ができているように見えます。

于 2009-02-20T13:48:40.970 に答える
10

UDP はブロックしません (データを OS に転送している間のみブロックします)。これは、ネクスト ホップ/スイッチ/マシンが UDP パケットをバッファリングできない場合、それをドロップすることを意味します。これは、状況によっては望ましい動作になる場合があります。しかし、それはあなたが知っておく必要があるものです。

UDPも保証しません

  • 送信された順序でパケットを配信します。
  • 大きなパケットを分割しないでください。
  • スイッチ間でパケットを転送します。多くの場合、スイッチ間の UDP 転送はオフになっています。

ただし、UDP はマルチキャストをサポートしているため、同じパケットを 1 つ以上のホストに配信できます。ただし、送信者は、誰かがパケットを受信したかどうかはわかりません。

UDP の厄介な点は、ほとんどの場合は機能しますが、再現が非常に難しい方法でひどく失敗することがあることです。このため、いくつかのテストを実行して動作しているように見えても、信頼性を想定しないでください。

于 2009-02-20T21:10:41.233 に答える