web-dev-qa-db-ja.com

Java DatagramPacket(UDP)最大送信/受信バッファサイズ

Java使用時 DatagramPacket では、byte[1024*1024]バッファ。送受信時にDatagramPacketにそれを渡すだけで、メガバイト全体を読み取るまで、DatagramPacketブロックのJava receive呼び出しになりますか?

私はJavaがそれを分割するのか、それともドロップされたもの全体を送信しようとするのかを尋ねています。

通常、UDPパケットのサイズ制限は約64KBですが、JavaのAPIがバイト配列を許可しているため、それが制限であり、非常に巨大なものがドロップまたは分割されて再構成されている場合、疑問に思いました。

これがドロップされた場合、Java呼び出しで使用できる最大データペイロードを教えてくれるAPI呼び出しはどれですか?IPv6にもジャンボフレームがあると聞きましたが、DatagramPacket(または DatagramSocket )UDPがヘッダー仕様を定義しているので、それをサポートしますか?

18
rbeede

DatagramPacketはUDPベースのソケットの単なるラッパーなので、通常のUDPルールが適用されます。

64キロバイトは、完全なIPデータグラムの理論上の最大サイズですが、ルーティングが保証されているのは576バイトのみです。特定のネットワークパスでは、最大送信ユニットが最小のリンクが実際の制限を決定します。 (一般的な最大値は1500バイト、ヘッダー数を減らすことですが、ヘッダーの数を予測することはできないため、メッセージを約1400バイトに制限するのが最も安全です。)

MTUの制限を超えると、IPv4はデータグラムを自動的にフラグメントに分割し、最後にそれらを再構成しますが、最大64キロバイトで、すべてのフラグメントが通過する場合に限ります。フラグメントが失われた場合、またはデバイスがフラグメントを好まないと判断した場合、パケット全体が失われます。

上記のように、パスのMTUがどうなるかを事前に知ることは不可能です。調べるための実験にはさまざまなアルゴリズムがありますが、多くのデバイスは必要な標準を適切に実装していない(または意図的に無視していない)ため、試行錯誤のすべてです。または、メッセージごとに1400バイトを推測することもできます。

エラーについては、OSが許可するように構成されているよりも多くのバイトを送信しようとすると、EMSGSIZEエラーまたは同等のエラーが発生するはずです。あなたがそれより少ないがネットワークが許すより多くを送るならば、パケットはただ消えます。

27
Seth Noble